mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #417 from kevinhartman/exclusive-tag-fix
Added exclusive reservation granule from ARMv7 spec to dyncom...
This commit is contained in:
		
						commit
						89bb0ecbd5
					
				
					 2 changed files with 18 additions and 16 deletions
				
			
		|  | @ -63,16 +63,21 @@ extern void switch_mode(arm_core_t *core, uint32_t mode); | |||
| typedef arm_core_t arm_processor; | ||||
| typedef unsigned int (*shtop_fp_t)(arm_processor *cpu, unsigned int sht_oper); | ||||
| 
 | ||||
| // Defines a reservation granule of 2 words, which protects the first 2 words starting at the tag.
 | ||||
| // This is the smallest granule allowed by the v7 spec, and is coincidentally just large enough to
 | ||||
| // support LDR/STREXD.
 | ||||
| static const ARMword RESERVATION_GRANULE_MASK = 0xFFFFFFF8; | ||||
| 
 | ||||
| // Exclusive memory access
 | ||||
| static int exclusive_detect(ARMul_State* state, ARMword addr){ | ||||
|     if(state->exclusive_tag == addr) | ||||
|     if(state->exclusive_tag == (addr & RESERVATION_GRANULE_MASK)) | ||||
|         return 0; | ||||
|     else | ||||
|         return -1; | ||||
| } | ||||
| 
 | ||||
| static void add_exclusive_addr(ARMul_State* state, ARMword addr){ | ||||
|     state->exclusive_tag = addr; | ||||
|     state->exclusive_tag = addr & RESERVATION_GRANULE_MASK; | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
|  | @ -80,7 +85,6 @@ static void remove_exclusive(ARMul_State* state, ARMword addr){ | |||
|     state->exclusive_tag = 0xFFFFFFFF; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| unsigned int DPO(Immediate)(arm_processor *cpu, unsigned int sht_oper) { | ||||
|     unsigned int immed_8 = BITS(sht_oper, 0, 7); | ||||
|     unsigned int rotate_imm = BITS(sht_oper, 8, 11); | ||||
|  | @ -4613,7 +4617,6 @@ unsigned InterpreterMainLoop(ARMul_State* state) { | |||
| 
 | ||||
|             add_exclusive_addr(cpu, read_addr); | ||||
|             cpu->exclusive_state = 1; | ||||
|             // TODO(bunnei): Do we need to also make [read_addr + 4] exclusive?
 | ||||
| 
 | ||||
|             RD = Memory::Read32(read_addr); | ||||
|             RD2 = Memory::Read32(read_addr + 4); | ||||
|  | @ -6133,7 +6136,6 @@ unsigned InterpreterMainLoop(ARMul_State* state) { | |||
|             if ((exclusive_detect(cpu, write_addr) == 0) && (cpu->exclusive_state == 1)) { | ||||
|                 remove_exclusive(cpu, write_addr); | ||||
|                 cpu->exclusive_state = 0; | ||||
|                 // TODO(bunnei): Remove exclusive from [write_addr + 4] if we implement this in LDREXD
 | ||||
| 
 | ||||
|                 Memory::Write32(write_addr, cpu->Reg[inst_cream->Rm]); | ||||
|                 Memory::Write32(write_addr + 4, cpu->Reg[inst_cream->Rm + 1]); | ||||
|  |  | |||
|  | @ -178,7 +178,7 @@ struct ARMul_State | |||
|     ARMword Spsr[7];            /* the exception psr's */ | ||||
|     ARMword Mode;               /* the current mode */ | ||||
|     ARMword Bank;               /* the current register bank */ | ||||
|     ARMword exclusive_tag; | ||||
|     ARMword exclusive_tag;      /* the address for which the local monitor is in exclusive access mode */ | ||||
|     ARMword exclusive_state; | ||||
|     ARMword exclusive_result; | ||||
|     ARMword CP15[VFP_BASE - CP15_BASE]; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue