Only perform access checks if 'check' is set.

Report unknown machine numbers.
Formatting tidy ups.
This commit is contained in:
Nick Clifton
2002-05-27 14:12:00 +00:00
parent f08caad151
commit 10b57fcbd7
7 changed files with 25 additions and 18 deletions

View File

@ -1,5 +1,10 @@
2002-05-27 Nick Clifton <nickc@cambridge.redhat.com> 2002-05-27 Nick Clifton <nickc@cambridge.redhat.com>
* armvirt.c (GetWord): Only perform access checks if 'check'
is set.
(PutWord): Likewise.
* wrapper.c (sim_create_inferior): Report unknown machine
numbers.
* thumbemu.c (ARMul_ThumbDecode, Case 31): Do not set LR to pc + * thumbemu.c (ARMul_ThumbDecode, Case 31): Do not set LR to pc +
2, it has already been advanced. 2, it has already been advanced.

View File

@ -85,7 +85,6 @@ XScale_cp15_init (ARMul_State * state ATTRIBUTE_UNUSED)
/* Initialise the ARM Control Register. */ /* Initialise the ARM Control Register. */
XScale_cp15_opcode_2_is_0_Regs[1] = 0x00000078; XScale_cp15_opcode_2_is_0_Regs[1] = 0x00000078;
} }
/* Check an access to a register. */ /* Check an access to a register. */
@ -253,7 +252,7 @@ write_cp15_reg (ARMul_State * state,
value &= 0x00003b87; value &= 0x00003b87;
value |= 0x00000078; value |= 0x00000078;
/* Change the endianness if necessary */ /* Change the endianness if necessary. */
if ((value & ARMul_CP15_R1_ENDIAN) != if ((value & ARMul_CP15_R1_ENDIAN) !=
(XScale_cp15_opcode_2_is_0_Regs [reg] & ARMul_CP15_R1_ENDIAN)) (XScale_cp15_opcode_2_is_0_Regs [reg] & ARMul_CP15_R1_ENDIAN))
{ {
@ -475,11 +474,11 @@ XScale_check_memacc (ARMul_State * state, ARMword * address, int store)
/* Check for PID-ification. /* Check for PID-ification.
XXX BTB access support will require this test failing. */ XXX BTB access support will require this test failing. */
r0 = (read_cp15_reg (13, 0, 0) & 0xfe000000); r0 = (read_cp15_reg (13, 0, 0) & 0xfe000000);
if (r0 && (*address & 0xfe000000) == 0) if (r0 && (* address & 0xfe000000) == 0)
*address |= r0; * address |= r0;
/* Check alignment fault enable/disable. */ /* Check alignment fault enable/disable. */
if ((read_cp15_reg (1, 0, 0) & ARMul_CP15_R1_ALIGN) && (*address & 3)) if ((read_cp15_reg (1, 0, 0) & ARMul_CP15_R1_ALIGN) && (* address & 3))
ARMul_Abort (state, ARMul_DataAbortV); ARMul_Abort (state, ARMul_DataAbortV);
if (XScale_debug_moe (state, -1)) if (XScale_debug_moe (state, -1))
@ -495,7 +494,7 @@ XScale_check_memacc (ARMul_State * state, ARMword * address, int store)
{ {
/* r1 is a inverse mask. */ /* r1 is a inverse mask. */
if (e0 != 0 && ((store && e0 != 3) || (!store && e0 != 1)) if (e0 != 0 && ((store && e0 != 3) || (!store && e0 != 1))
&& ((*address & ~r1) == (r0 & ~r1))) && ((* address & ~r1) == (r0 & ~r1)))
{ {
XScale_debug_moe (state, ARMul_CP14_R10_MOE_DB); XScale_debug_moe (state, ARMul_CP14_R10_MOE_DB);
ARMul_OSHandleSWI (state, SWI_Breakpoint); ARMul_OSHandleSWI (state, SWI_Breakpoint);
@ -504,7 +503,7 @@ XScale_check_memacc (ARMul_State * state, ARMword * address, int store)
else else
{ {
if (e0 != 0 && ((store && e0 != 3) || (!store && e0 != 1)) if (e0 != 0 && ((store && e0 != 3) || (!store && e0 != 1))
&& ((*address & ~3) == (r0 & ~3))) && ((* address & ~3) == (r0 & ~3)))
{ {
XScale_debug_moe (state, ARMul_CP14_R10_MOE_DB); XScale_debug_moe (state, ARMul_CP14_R10_MOE_DB);
ARMul_OSHandleSWI (state, SWI_Breakpoint); ARMul_OSHandleSWI (state, SWI_Breakpoint);
@ -512,7 +511,7 @@ XScale_check_memacc (ARMul_State * state, ARMword * address, int store)
e1 = (dbcon & ARMul_CP15_DBCON_E1) >> 2; e1 = (dbcon & ARMul_CP15_DBCON_E1) >> 2;
if (e1 != 0 && ((store && e1 != 3) || (!store && e1 != 1)) if (e1 != 0 && ((store && e1 != 3) || (!store && e1 != 1))
&& ((*address & ~3) == (r1 & ~3))) && ((* address & ~3) == (r1 & ~3)))
{ {
XScale_debug_moe (state, ARMul_CP14_R10_MOE_DB); XScale_debug_moe (state, ARMul_CP14_R10_MOE_DB);
ARMul_OSHandleSWI (state, SWI_Breakpoint); ARMul_OSHandleSWI (state, SWI_Breakpoint);
@ -520,7 +519,7 @@ XScale_check_memacc (ARMul_State * state, ARMword * address, int store)
} }
} }
/* Check set. */ /* Set the XScale FSR and FAR registers. */
void void
XScale_set_fsr_far (ARMul_State * state, ARMword fsr, ARMword far) XScale_set_fsr_far (ARMul_State * state, ARMword fsr, ARMword far)
@ -847,7 +846,7 @@ write_cp14_reg (unsigned reg, ARMword value)
/* Only BITS (27:12), BITS (10:8) and BITS (6:0) can be written. */ /* Only BITS (27:12), BITS (10:8) and BITS (6:0) can be written. */
value &= 0x0ffff77f; value &= 0x0ffff77f;
/* Reset the clock counter if necessary */ /* Reset the clock counter if necessary. */
if (value & ARMul_CP14_R0_CLKRST) if (value & ARMul_CP14_R0_CLKRST)
XScale_cp14_Regs [1] = 0; XScale_cp14_Regs [1] = 0;
break; break;

View File

@ -138,6 +138,7 @@ void
ARMul_FixCPSR (ARMul_State * state, ARMword instr, ARMword rhs) ARMul_FixCPSR (ARMul_State * state, ARMword instr, ARMword rhs)
{ {
state->Cpsr = ARMul_GetCPSR (state); state->Cpsr = ARMul_GetCPSR (state);
if (state->Mode != USER26MODE if (state->Mode != USER26MODE
&& state->Mode != USER32MODE) && state->Mode != USER32MODE)
{ {
@ -569,7 +570,6 @@ ARMul_STC (ARMul_State * state, ARMword instr, ARMword address)
#ifndef MODE32 #ifndef MODE32
if (ADDREXCEPT (address) || VECTORACCESS (address)) if (ADDREXCEPT (address) || VECTORACCESS (address))
INTERNALABORT (address); INTERNALABORT (address);
#endif #endif
BUSUSEDINCPCN; BUSUSEDINCPCN;
if (BIT (21)) if (BIT (21))

View File

@ -64,6 +64,7 @@ GetWord (ARMul_State * state, ARMword address, int check)
ARMword **pagetable; ARMword **pagetable;
ARMword *pageptr; ARMword *pageptr;
if (check)
XScale_check_memacc (state, &address, 0); XScale_check_memacc (state, &address, 0);
page = address >> PAGEBITS; page = address >> PAGEBITS;
@ -99,6 +100,7 @@ PutWord (ARMul_State * state, ARMword address, ARMword data, int check)
ARMword **pagetable; ARMword **pagetable;
ARMword *pageptr; ARMword *pageptr;
if (check)
XScale_check_memacc (state, &address, 1); XScale_check_memacc (state, &address, 1);
page = address >> PAGEBITS; page = address >> PAGEBITS;

View File

@ -223,7 +223,8 @@ sim_create_inferior (sd, abfd, argv, env)
default: default:
(*sim_callback->printf_filtered) (*sim_callback->printf_filtered)
(sim_callback, (sim_callback,
"Unknown machine type; please update sim_create_inferior.\n"); "Unknown machine type '%d'; please update sim_create_inferior.\n",
mach);
/* fall through */ /* fall through */
case 0: case 0: