1 /* armcopro.c -- co-processor interface: ARM6 Instruction Emulator.
2 Copyright (C) 1994, 2000 Advanced RISC Machines Ltd.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
26 /* Dummy Co-processors. */
29 NoCoPro3R (ARMul_State
* state ATTRIBUTE_UNUSED
,
30 unsigned a ATTRIBUTE_UNUSED
,
31 ARMword b ATTRIBUTE_UNUSED
)
37 NoCoPro4R (ARMul_State
* state ATTRIBUTE_UNUSED
,
38 unsigned a ATTRIBUTE_UNUSED
,
39 ARMword b ATTRIBUTE_UNUSED
,
40 ARMword c ATTRIBUTE_UNUSED
)
46 NoCoPro4W (ARMul_State
* state ATTRIBUTE_UNUSED
,
47 unsigned a ATTRIBUTE_UNUSED
,
48 ARMword b ATTRIBUTE_UNUSED
,
49 ARMword
* c ATTRIBUTE_UNUSED
)
54 /* The XScale Co-processors. */
56 /* Coprocessor 15: System Control. */
57 static void write_cp14_reg (unsigned, ARMword
);
58 static ARMword
read_cp14_reg (unsigned);
60 /* There are two sets of registers for copro 15.
61 One set is available when opcode_2 is 0 and
62 the other set when opcode_2 >= 1. */
63 static ARMword XScale_cp15_opcode_2_is_0_Regs
[16];
64 static ARMword XScale_cp15_opcode_2_is_not_0_Regs
[16];
65 /* There are also a set of breakpoint registers
66 which are accessed via CRm instead of opcode_2. */
67 static ARMword XScale_cp15_DBR1
;
68 static ARMword XScale_cp15_DBCON
;
69 static ARMword XScale_cp15_IBCR0
;
70 static ARMword XScale_cp15_IBCR1
;
73 XScale_cp15_init (ARMul_State
* state ATTRIBUTE_UNUSED
)
79 XScale_cp15_opcode_2_is_0_Regs
[i
] = 0;
80 XScale_cp15_opcode_2_is_not_0_Regs
[i
] = 0;
83 /* Initialise the processor ID. */
84 XScale_cp15_opcode_2_is_0_Regs
[0] = 0x69052000;
86 /* Initialise the cache type. */
87 XScale_cp15_opcode_2_is_not_0_Regs
[0] = 0x0B1AA1AA;
89 /* Initialise the ARM Control Register. */
90 XScale_cp15_opcode_2_is_0_Regs
[1] = 0x00000078;
93 /* Check an access to a register. */
96 check_cp15_access (ARMul_State
* state
,
102 /* Do not allow access to these register in USER mode. */
103 if (state
->Mode
== USER26MODE
|| state
->Mode
== USER32MODE
)
106 /* Opcode_1should be zero. */
110 /* Different register have different access requirements. */
115 /* CRm must be 0. Opcode_2 can be anything. */
121 /* CRm must be 0. Opcode_2 must be zero. */
122 if ((CRm
!= 0) || (opcode_2
!= 0))
126 /* Access not allowed. */
130 /* Opcode_2 must be zero. CRm must be 0. */
131 if ((CRm
!= 0) || (opcode_2
!= 0))
135 /* Permissable combinations:
148 default: return ARMul_CANT
;
149 case 6: if (CRm
!= 5) return ARMul_CANT
; break;
150 case 5: if (CRm
!= 2) return ARMul_CANT
; break;
151 case 4: if (CRm
!= 10) return ARMul_CANT
; break;
152 case 1: if ((CRm
!= 5) && (CRm
!= 6) && (CRm
!= 10)) return ARMul_CANT
; break;
153 case 0: if ((CRm
< 5) || (CRm
> 7)) return ARMul_CANT
; break;
158 /* Permissable combinations:
167 if ((CRm
< 5) || (CRm
> 7))
169 if (opcode_2
== 1 && CRm
== 7)
173 /* Opcode_2 must be zero or one. CRm must be 1 or 2. */
174 if ( ((CRm
!= 0) && (CRm
!= 1))
175 || ((opcode_2
!= 1) && (opcode_2
!= 2)))
179 /* Opcode_2 must be zero or one. CRm must be 4 or 8. */
180 if ( ((CRm
!= 0) && (CRm
!= 1))
181 || ((opcode_2
!= 4) && (opcode_2
!= 8)))
185 /* Access not allowed. */
188 /* Access not allowed. */
191 /* Opcode_2 must be zero. CRm must be 0. */
192 if ((CRm
!= 0) || (opcode_2
!= 0))
196 /* Opcode_2 must be 0. CRm must be 0, 3, 4, 8 or 9. */
200 if ((CRm
!= 0) && (CRm
!= 3) && (CRm
!= 4) && (CRm
!= 8) && (CRm
!= 9))
204 /* Opcode_2 must be zero. CRm must be 1. */
205 if ((CRm
!= 1) || (opcode_2
!= 0))
209 /* Should never happen. */
216 /* Store a value into one of coprocessor 15's registers. */
219 write_cp15_reg (ARMul_State
* state
,
229 case 0: /* Cache Type. */
230 /* Writes are not allowed. */
233 case 1: /* Auxillary Control. */
234 /* Only BITS (5, 4) and BITS (1, 0) can be written. */
242 XScale_cp15_opcode_2_is_not_0_Regs
[reg
] = value
;
249 /* Writes are not allowed. */
252 case 1: /* ARM Control. */
253 /* Only BITS (13, 11), BITS (9, 7) and BITS (2, 0) can be written.
254 BITS (31, 14) and BIT (10) write as zero, BITS (6, 3) write as one. */
258 /* Change the endianness if necessary. */
259 if ((value
& ARMul_CP15_R1_ENDIAN
) !=
260 (XScale_cp15_opcode_2_is_0_Regs
[reg
] & ARMul_CP15_R1_ENDIAN
))
262 state
->bigendSig
= value
& ARMul_CP15_R1_ENDIAN
;
263 /* Force ARMulator to notice these now. */
264 state
->Emulate
= CHANGEMODE
;
268 case 2: /* Translation Table Base. */
269 /* Only BITS (31, 14) can be written. */
273 case 3: /* Domain Access Control. */
274 /* All bits writable. */
277 case 5: /* Fault Status Register. */
278 /* BITS (10, 9) and BITS (7, 0) can be written. */
282 case 6: /* Fault Address Register. */
283 /* All bits writable. */
286 case 7: /* Cache Functions. */
287 case 8: /* TLB Operations. */
288 case 10: /* TLB Lock Down. */
292 case 9: /* Data Cache Lock. */
293 /* Only BIT (0) can be written. */
297 case 13: /* Process ID. */
298 /* Only BITS (31, 25) are writable. */
302 case 14: /* DBR0, DBR1, DBCON, IBCR0, IBCR1 */
303 /* All bits can be written. Which register is accessed is
304 dependent upon CRm. */
310 XScale_cp15_DBR1
= value
;
313 XScale_cp15_DBCON
= value
;
316 XScale_cp15_IBCR0
= value
;
319 XScale_cp15_IBCR1
= value
;
326 case 15: /* Coprpcessor Access Register. */
327 /* Access is only valid if CRm == 1. */
331 /* Only BITS (13, 0) may be written. */
339 XScale_cp15_opcode_2_is_0_Regs
[reg
] = value
;
345 /* Return the value in a cp15 register. */
348 read_cp15_reg (unsigned reg
, unsigned opcode_2
, unsigned CRm
)
352 if (reg
== 15 && CRm
!= 1)
359 case 3: return XScale_cp15_DBR1
;
360 case 4: return XScale_cp15_DBCON
;
361 case 8: return XScale_cp15_IBCR0
;
362 case 9: return XScale_cp15_IBCR1
;
368 return XScale_cp15_opcode_2_is_0_Regs
[reg
];
371 return XScale_cp15_opcode_2_is_not_0_Regs
[reg
];
377 XScale_cp15_LDC (ARMul_State
* state
, unsigned type
, ARMword instr
, ARMword data
)
379 unsigned reg
= BITS (12, 15);
382 result
= check_cp15_access (state
, reg
, 0, 0, 0);
384 if (result
== ARMul_DONE
&& type
== ARMul_DATA
)
385 write_cp15_reg (state
, reg
, 0, 0, data
);
391 XScale_cp15_STC (ARMul_State
* state
, unsigned type
, ARMword instr
, ARMword
* data
)
393 unsigned reg
= BITS (12, 15);
396 result
= check_cp15_access (state
, reg
, 0, 0, 0);
398 if (result
== ARMul_DONE
&& type
== ARMul_DATA
)
399 * data
= read_cp15_reg (reg
, 0, 0);
405 XScale_cp15_MRC (ARMul_State
* state
,
406 unsigned type ATTRIBUTE_UNUSED
,
410 unsigned opcode_2
= BITS (5, 7);
411 unsigned CRm
= BITS (0, 3);
412 unsigned reg
= BITS (16, 19);
415 result
= check_cp15_access (state
, reg
, CRm
, BITS (21, 23), opcode_2
);
417 if (result
== ARMul_DONE
)
418 * value
= read_cp15_reg (reg
, opcode_2
, CRm
);
424 XScale_cp15_MCR (ARMul_State
* state
,
425 unsigned type ATTRIBUTE_UNUSED
,
429 unsigned opcode_2
= BITS (5, 7);
430 unsigned CRm
= BITS (0, 3);
431 unsigned reg
= BITS (16, 19);
434 result
= check_cp15_access (state
, reg
, CRm
, BITS (21, 23), opcode_2
);
436 if (result
== ARMul_DONE
)
437 write_cp15_reg (state
, reg
, opcode_2
, CRm
, value
);
443 XScale_cp15_read_reg (ARMul_State
* state ATTRIBUTE_UNUSED
,
447 /* FIXME: Not sure what to do about the alternative register set
448 here. For now default to just accessing CRm == 0 registers. */
449 * value
= read_cp15_reg (reg
, 0, 0);
455 XScale_cp15_write_reg (ARMul_State
* state ATTRIBUTE_UNUSED
,
459 /* FIXME: Not sure what to do about the alternative register set
460 here. For now default to just accessing CRm == 0 registers. */
461 write_cp15_reg (state
, reg
, 0, 0, value
);
466 /* Check for special XScale memory access features. */
469 XScale_check_memacc (ARMul_State
* state
, ARMword
* address
, int store
)
471 ARMword dbcon
, r0
, r1
;
474 if (!state
->is_XScale
)
477 /* Check for PID-ification.
478 XXX BTB access support will require this test failing. */
479 r0
= (read_cp15_reg (13, 0, 0) & 0xfe000000);
480 if (r0
&& (* address
& 0xfe000000) == 0)
483 /* Check alignment fault enable/disable. */
484 if ((read_cp15_reg (1, 0, 0) & ARMul_CP15_R1_ALIGN
) && (* address
& 3))
486 /* Set the FSR and FAR.
487 Do not use XScale_set_fsr_far as this checks the DCSR register. */
488 write_cp15_reg (state
, 5, 0, 0, ARMul_CP15_R5_MMU_EXCPT
);
489 write_cp15_reg (state
, 6, 0, 0, * address
);
491 ARMul_Abort (state
, ARMul_DataAbortV
);
494 if (XScale_debug_moe (state
, -1))
497 /* Check the data breakpoint registers. */
498 dbcon
= read_cp15_reg (14, 0, 4);
499 r0
= read_cp15_reg (14, 0, 0);
500 r1
= read_cp15_reg (14, 0, 3);
501 e0
= dbcon
& ARMul_CP15_DBCON_E0
;
503 if (dbcon
& ARMul_CP15_DBCON_M
)
505 /* r1 is a inverse mask. */
506 if (e0
!= 0 && ((store
&& e0
!= 3) || (!store
&& e0
!= 1))
507 && ((* address
& ~r1
) == (r0
& ~r1
)))
509 XScale_debug_moe (state
, ARMul_CP14_R10_MOE_DB
);
510 ARMul_OSHandleSWI (state
, SWI_Breakpoint
);
515 if (e0
!= 0 && ((store
&& e0
!= 3) || (!store
&& e0
!= 1))
516 && ((* address
& ~3) == (r0
& ~3)))
518 XScale_debug_moe (state
, ARMul_CP14_R10_MOE_DB
);
519 ARMul_OSHandleSWI (state
, SWI_Breakpoint
);
522 e1
= (dbcon
& ARMul_CP15_DBCON_E1
) >> 2;
523 if (e1
!= 0 && ((store
&& e1
!= 3) || (!store
&& e1
!= 1))
524 && ((* address
& ~3) == (r1
& ~3)))
526 XScale_debug_moe (state
, ARMul_CP14_R10_MOE_DB
);
527 ARMul_OSHandleSWI (state
, SWI_Breakpoint
);
532 /* Set the XScale FSR and FAR registers. */
535 XScale_set_fsr_far (ARMul_State
* state
, ARMword fsr
, ARMword far
)
537 if (!state
->is_XScale
|| (read_cp14_reg (10) & (1UL << 31)) == 0)
540 write_cp15_reg (state
, 5, 0, 0, fsr
);
541 write_cp15_reg (state
, 6, 0, 0, far
);
544 /* Set the XScale debug `method of entry' if it is enabled. */
547 XScale_debug_moe (ARMul_State
* state
, int moe
)
551 if (!state
->is_XScale
)
554 value
= read_cp14_reg (10);
555 if (value
& (1UL << 31))
562 write_cp14_reg (10, value
);
569 /* Coprocessor 13: Interrupt Controller and Bus Controller. */
571 /* There are two sets of registers for copro 13.
572 One set (of three registers) is available when CRm is 0
573 and the other set (of six registers) when CRm is 1. */
575 static ARMword XScale_cp13_CR0_Regs
[16];
576 static ARMword XScale_cp13_CR1_Regs
[16];
579 XScale_cp13_init (ARMul_State
* state ATTRIBUTE_UNUSED
)
585 XScale_cp13_CR0_Regs
[i
] = 0;
586 XScale_cp13_CR1_Regs
[i
] = 0;
590 /* Check an access to a register. */
593 check_cp13_access (ARMul_State
* state
,
599 /* Do not allow access to these registers in USER mode. */
600 if (state
->Mode
== USER26MODE
|| state
->Mode
== USER32MODE
)
603 /* The opcodes should be zero. */
604 if ((opcode_1
!= 0) || (opcode_2
!= 0))
607 /* Do not allow access to these register if bit
608 13 of coprocessor 15's register 15 is zero. */
609 if (! CP_ACCESS_ALLOWED (state
, 13))
612 /* Registers 0, 4 and 8 are defined when CRm == 0.
613 Registers 0, 1, 4, 5, 6, 7, 8 are defined when CRm == 1.
614 For all other CRm values undefined behaviour results. */
617 if (reg
== 0 || reg
== 4 || reg
== 8)
622 if (reg
== 0 || reg
== 1 || (reg
>= 4 && reg
<= 8))
629 /* Store a value into one of coprocessor 13's registers. */
632 write_cp13_reg (unsigned reg
, unsigned CRm
, ARMword value
)
640 /* Only BITS (3:0) can be written. */
645 /* No bits may be written. */
649 /* Only BITS (1:0) can be written. */
654 /* Should not happen. Ignore any writes to unimplemented registers. */
658 XScale_cp13_CR0_Regs
[reg
] = value
;
665 /* Only BITS (30:28) and BITS (3:0) can be written.
666 BIT(31) is write ignored. */
668 value
|= XScale_cp13_CR1_Regs
[0] & (1UL << 31);
672 /* Only bit 0 is accecssible. */
674 value
|= XScale_cp13_CR1_Regs
[1] & ~ 1;
681 /* No bits can be written. */
685 /* Only BITS (7:0) can be written. */
690 /* Should not happen. Ignore any writes to unimplemented registers. */
694 XScale_cp13_CR1_Regs
[reg
] = value
;
698 /* Should not happen. */
705 /* Return the value in a cp13 register. */
708 read_cp13_reg (unsigned reg
, unsigned CRm
)
711 return XScale_cp13_CR0_Regs
[reg
];
713 return XScale_cp13_CR1_Regs
[reg
];
719 XScale_cp13_LDC (ARMul_State
* state
, unsigned type
, ARMword instr
, ARMword data
)
721 unsigned reg
= BITS (12, 15);
724 result
= check_cp13_access (state
, reg
, 0, 0, 0);
726 if (result
== ARMul_DONE
&& type
== ARMul_DATA
)
727 write_cp13_reg (reg
, 0, data
);
733 XScale_cp13_STC (ARMul_State
* state
, unsigned type
, ARMword instr
, ARMword
* data
)
735 unsigned reg
= BITS (12, 15);
738 result
= check_cp13_access (state
, reg
, 0, 0, 0);
740 if (result
== ARMul_DONE
&& type
== ARMul_DATA
)
741 * data
= read_cp13_reg (reg
, 0);
747 XScale_cp13_MRC (ARMul_State
* state
,
748 unsigned type ATTRIBUTE_UNUSED
,
752 unsigned CRm
= BITS (0, 3);
753 unsigned reg
= BITS (16, 19);
756 result
= check_cp13_access (state
, reg
, CRm
, BITS (21, 23), BITS (5, 7));
758 if (result
== ARMul_DONE
)
759 * value
= read_cp13_reg (reg
, CRm
);
765 XScale_cp13_MCR (ARMul_State
* state
,
766 unsigned type ATTRIBUTE_UNUSED
,
770 unsigned CRm
= BITS (0, 3);
771 unsigned reg
= BITS (16, 19);
774 result
= check_cp13_access (state
, reg
, CRm
, BITS (21, 23), BITS (5, 7));
776 if (result
== ARMul_DONE
)
777 write_cp13_reg (reg
, CRm
, value
);
783 XScale_cp13_read_reg (ARMul_State
* state ATTRIBUTE_UNUSED
,
787 /* FIXME: Not sure what to do about the alternative register set
788 here. For now default to just accessing CRm == 0 registers. */
789 * value
= read_cp13_reg (reg
, 0);
795 XScale_cp13_write_reg (ARMul_State
* state ATTRIBUTE_UNUSED
,
799 /* FIXME: Not sure what to do about the alternative register set
800 here. For now default to just accessing CRm == 0 registers. */
801 write_cp13_reg (reg
, 0, value
);
806 /* Coprocessor 14: Performance Monitoring, Clock and Power management,
809 static ARMword XScale_cp14_Regs
[16];
812 XScale_cp14_init (ARMul_State
* state ATTRIBUTE_UNUSED
)
817 XScale_cp14_Regs
[i
] = 0;
820 /* Check an access to a register. */
823 check_cp14_access (ARMul_State
* state
,
829 /* Not allowed to access these register in USER mode. */
830 if (state
->Mode
== USER26MODE
|| state
->Mode
== USER32MODE
)
833 /* CRm should be zero. */
837 /* OPcodes should be zero. */
838 if (opcode1
!= 0 || opcode2
!= 0)
841 /* Accessing registers 4 or 5 has unpredicatable results. */
842 if (reg
>= 4 && reg
<= 5)
848 /* Store a value into one of coprocessor 14's registers. */
851 write_cp14_reg (unsigned reg
, ARMword value
)
856 /* Only BITS (27:12), BITS (10:8) and BITS (6:0) can be written. */
859 /* Reset the clock counter if necessary. */
860 if (value
& ARMul_CP14_R0_CLKRST
)
861 XScale_cp14_Regs
[1] = 0;
866 /* We should not normally reach this code. The debugger interface
867 can bypass the normal checks though, so it could happen. */
871 case 6: /* CCLKCFG */
872 /* Only BITS (3:0) can be written. */
876 case 7: /* PWRMODE */
877 /* Although BITS (1:0) can be written with non-zero values, this would
878 have the side effect of putting the processor to sleep. Thus in
879 order for the register to be read again, it would have to go into
880 ACTIVE mode, which means that any read will see these bits as zero.
882 Rather than trying to implement complex reset-to-zero-upon-read logic
883 we just override the write value with zero. */
888 /* Only BITS (31:30), BITS (23:22), BITS (20:16) and BITS (5:0) can
894 /* No writes are permitted. */
898 case 14: /* TXRXCTRL */
899 /* Only BITS (31:30) can be written. */
904 /* All bits can be written. */
908 XScale_cp14_Regs
[reg
] = value
;
911 /* Return the value in a cp14 register. Not a static function since
912 it is used by the code to emulate the BKPT instruction in armemu.c. */
915 read_cp14_reg (unsigned reg
)
917 return XScale_cp14_Regs
[reg
];
921 XScale_cp14_LDC (ARMul_State
* state
, unsigned type
, ARMword instr
, ARMword data
)
923 unsigned reg
= BITS (12, 15);
926 result
= check_cp14_access (state
, reg
, 0, 0, 0);
928 if (result
== ARMul_DONE
&& type
== ARMul_DATA
)
929 write_cp14_reg (reg
, data
);
935 XScale_cp14_STC (ARMul_State
* state
, unsigned type
, ARMword instr
, ARMword
* data
)
937 unsigned reg
= BITS (12, 15);
940 result
= check_cp14_access (state
, reg
, 0, 0, 0);
942 if (result
== ARMul_DONE
&& type
== ARMul_DATA
)
943 * data
= read_cp14_reg (reg
);
952 unsigned type ATTRIBUTE_UNUSED
,
957 unsigned reg
= BITS (16, 19);
960 result
= check_cp14_access (state
, reg
, BITS (0, 3), BITS (21, 23), BITS (5, 7));
962 if (result
== ARMul_DONE
)
963 * value
= read_cp14_reg (reg
);
972 unsigned type ATTRIBUTE_UNUSED
,
977 unsigned reg
= BITS (16, 19);
980 result
= check_cp14_access (state
, reg
, BITS (0, 3), BITS (21, 23), BITS (5, 7));
982 if (result
== ARMul_DONE
)
983 write_cp14_reg (reg
, value
);
991 ARMul_State
* state ATTRIBUTE_UNUSED
,
996 * value
= read_cp14_reg (reg
);
1002 XScale_cp14_write_reg
1004 ARMul_State
* state ATTRIBUTE_UNUSED
,
1009 write_cp14_reg (reg
, value
);
1014 /* Here's ARMulator's MMU definition. A few things to note:
1015 1) It has eight registers, but only two are defined.
1016 2) You can only access its registers with MCR and MRC.
1017 3) MMU Register 0 (ID) returns 0x41440110
1018 4) Register 1 only has 4 bits defined. Bits 0 to 3 are unused, bit 4
1019 controls 32/26 bit program space, bit 5 controls 32/26 bit data space,
1020 bit 6 controls late abort timimg and bit 7 controls big/little endian. */
1022 static ARMword MMUReg
[8];
1025 MMUInit (ARMul_State
* state
)
1027 MMUReg
[1] = state
->prog32Sig
<< 4 |
1028 state
->data32Sig
<< 5 | state
->lateabtSig
<< 6 | state
->bigendSig
<< 7;
1030 ARMul_ConsolePrint (state
, ", MMU present");
1036 MMUMRC (ARMul_State
* state ATTRIBUTE_UNUSED
,
1037 unsigned type ATTRIBUTE_UNUSED
,
1041 int reg
= BITS (16, 19) & 7;
1044 *value
= 0x41440110;
1046 *value
= MMUReg
[reg
];
1052 MMUMCR (ARMul_State
* state
,
1053 unsigned type ATTRIBUTE_UNUSED
,
1057 int reg
= BITS (16, 19) & 7;
1059 MMUReg
[reg
] = value
;
1065 p
= state
->prog32Sig
;
1066 d
= state
->data32Sig
;
1067 l
= state
->lateabtSig
;
1068 b
= state
->bigendSig
;
1070 state
->prog32Sig
= value
>> 4 & 1;
1071 state
->data32Sig
= value
>> 5 & 1;
1072 state
->lateabtSig
= value
>> 6 & 1;
1073 state
->bigendSig
= value
>> 7 & 1;
1075 if ( p
!= state
->prog32Sig
1076 || d
!= state
->data32Sig
1077 || l
!= state
->lateabtSig
1078 || b
!= state
->bigendSig
)
1079 /* Force ARMulator to notice these now. */
1080 state
->Emulate
= CHANGEMODE
;
1087 MMURead (ARMul_State
* state ATTRIBUTE_UNUSED
, unsigned reg
, ARMword
* value
)
1090 *value
= 0x41440110;
1092 *value
= MMUReg
[reg
];
1098 MMUWrite (ARMul_State
* state
, unsigned reg
, ARMword value
)
1101 MMUReg
[reg
] = value
;
1107 p
= state
->prog32Sig
;
1108 d
= state
->data32Sig
;
1109 l
= state
->lateabtSig
;
1110 b
= state
->bigendSig
;
1112 state
->prog32Sig
= value
>> 4 & 1;
1113 state
->data32Sig
= value
>> 5 & 1;
1114 state
->lateabtSig
= value
>> 6 & 1;
1115 state
->bigendSig
= value
>> 7 & 1;
1117 if ( p
!= state
->prog32Sig
1118 || d
!= state
->data32Sig
1119 || l
!= state
->lateabtSig
1120 || b
!= state
->bigendSig
)
1121 /* Force ARMulator to notice these now. */
1122 state
->Emulate
= CHANGEMODE
;
1129 /* What follows is the Validation Suite Coprocessor. It uses two
1130 co-processor numbers (4 and 5) and has the follwing functionality.
1131 Sixteen registers. Both co-processor nuimbers can be used in an MCR
1132 and MRC to access these registers. CP 4 can LDC and STC to and from
1133 the registers. CP 4 and CP 5 CDP 0 will busy wait for the number of
1134 cycles specified by a CP register. CP 5 CDP 1 issues a FIQ after a
1135 number of cycles (specified in a CP register), CDP 2 issues an IRQW
1136 in the same way, CDP 3 and 4 turn of the FIQ and IRQ source, and CDP 5
1137 stores a 32 bit time value in a CP register (actually it's the total
1138 number of N, S, I, C and F cyles). */
1140 static ARMword ValReg
[16];
1143 ValLDC (ARMul_State
* state ATTRIBUTE_UNUSED
,
1148 static unsigned words
;
1150 if (type
!= ARMul_DATA
)
1154 ValReg
[BITS (12, 15)] = data
;
1157 /* It's a long access, get two words. */
1166 ValSTC (ARMul_State
* state ATTRIBUTE_UNUSED
,
1171 static unsigned words
;
1173 if (type
!= ARMul_DATA
)
1177 * data
= ValReg
[BITS (12, 15)];
1180 /* It's a long access, get two words. */
1189 ValMRC (ARMul_State
* state ATTRIBUTE_UNUSED
,
1190 unsigned type ATTRIBUTE_UNUSED
,
1194 *value
= ValReg
[BITS (16, 19)];
1200 ValMCR (ARMul_State
* state ATTRIBUTE_UNUSED
,
1201 unsigned type ATTRIBUTE_UNUSED
,
1205 ValReg
[BITS (16, 19)] = value
;
1211 ValCDP (ARMul_State
* state
, unsigned type
, ARMword instr
)
1213 static unsigned long finish
= 0;
1215 if (BITS (20, 23) != 0)
1218 if (type
== ARMul_FIRST
)
1222 howlong
= ValReg
[BITS (0, 3)];
1224 /* First cycle of a busy wait. */
1225 finish
= ARMul_Time (state
) + howlong
;
1227 return howlong
== 0 ? ARMul_DONE
: ARMul_BUSY
;
1229 else if (type
== ARMul_BUSY
)
1231 if (ARMul_Time (state
) >= finish
)
1241 DoAFIQ (ARMul_State
* state
)
1243 state
->NfiqSig
= LOW
;
1249 DoAIRQ (ARMul_State
* state
)
1251 state
->NirqSig
= LOW
;
1257 IntCDP (ARMul_State
* state
, unsigned type
, ARMword instr
)
1259 static unsigned long finish
;
1262 howlong
= ValReg
[BITS (0, 3)];
1264 switch ((int) BITS (20, 23))
1267 if (type
== ARMul_FIRST
)
1269 /* First cycle of a busy wait. */
1270 finish
= ARMul_Time (state
) + howlong
;
1272 return howlong
== 0 ? ARMul_DONE
: ARMul_BUSY
;
1274 else if (type
== ARMul_BUSY
)
1276 if (ARMul_Time (state
) >= finish
)
1285 ARMul_Abort (state
, ARMul_FIQV
);
1287 ARMul_ScheduleEvent (state
, howlong
, DoAFIQ
);
1292 ARMul_Abort (state
, ARMul_IRQV
);
1294 ARMul_ScheduleEvent (state
, howlong
, DoAIRQ
);
1298 state
->NfiqSig
= HIGH
;
1303 state
->NirqSig
= HIGH
;
1308 ValReg
[BITS (0, 3)] = ARMul_Time (state
);
1315 /* Install co-processor instruction handlers in this routine. */
1318 ARMul_CoProInit (ARMul_State
* state
)
1322 /* Initialise tham all first. */
1323 for (i
= 0; i
< 16; i
++)
1324 ARMul_CoProDetach (state
, i
);
1326 /* Install CoPro Instruction handlers here.
1328 ARMul_CoProAttach (state, CP Number, Init routine, Exit routine
1329 LDC routine, STC routine, MRC routine, MCR routine,
1330 CDP routine, Read Reg routine, Write Reg routine). */
1331 if (state
->is_ep9312
)
1333 ARMul_CoProAttach (state
, 4, NULL
, NULL
, DSPLDC4
, DSPSTC4
,
1334 DSPMRC4
, DSPMCR4
, DSPCDP4
, NULL
, NULL
);
1335 ARMul_CoProAttach (state
, 5, NULL
, NULL
, DSPLDC5
, DSPSTC5
,
1336 DSPMRC5
, DSPMCR5
, DSPCDP5
, NULL
, NULL
);
1337 ARMul_CoProAttach (state
, 6, NULL
, NULL
, NULL
, NULL
,
1338 DSPMRC6
, DSPMCR6
, DSPCDP6
, NULL
, NULL
);
1342 ARMul_CoProAttach (state
, 4, NULL
, NULL
, ValLDC
, ValSTC
,
1343 ValMRC
, ValMCR
, ValCDP
, NULL
, NULL
);
1345 ARMul_CoProAttach (state
, 5, NULL
, NULL
, NULL
, NULL
,
1346 ValMRC
, ValMCR
, IntCDP
, NULL
, NULL
);
1349 if (state
->is_XScale
)
1351 ARMul_CoProAttach (state
, 13, XScale_cp13_init
, NULL
,
1352 XScale_cp13_LDC
, XScale_cp13_STC
, XScale_cp13_MRC
,
1353 XScale_cp13_MCR
, NULL
, XScale_cp13_read_reg
,
1354 XScale_cp13_write_reg
);
1356 ARMul_CoProAttach (state
, 14, XScale_cp14_init
, NULL
,
1357 XScale_cp14_LDC
, XScale_cp14_STC
, XScale_cp14_MRC
,
1358 XScale_cp14_MCR
, NULL
, XScale_cp14_read_reg
,
1359 XScale_cp14_write_reg
);
1361 ARMul_CoProAttach (state
, 15, XScale_cp15_init
, NULL
,
1362 NULL
, NULL
, XScale_cp15_MRC
, XScale_cp15_MCR
,
1363 NULL
, XScale_cp15_read_reg
, XScale_cp15_write_reg
);
1367 ARMul_CoProAttach (state
, 15, MMUInit
, NULL
, NULL
, NULL
,
1368 MMUMRC
, MMUMCR
, NULL
, MMURead
, MMUWrite
);
1372 if (state
->is_iWMMXt
)
1374 ARMul_CoProAttach (state
, 0, NULL
, NULL
, IwmmxtLDC
, IwmmxtSTC
,
1375 NULL
, NULL
, IwmmxtCDP
, NULL
, NULL
);
1377 ARMul_CoProAttach (state
, 1, NULL
, NULL
, NULL
, NULL
,
1378 IwmmxtMRC
, IwmmxtMCR
, IwmmxtCDP
, NULL
, NULL
);
1381 /* No handlers below here. */
1383 /* Call all the initialisation routines. */
1384 for (i
= 0; i
< 16; i
++)
1385 if (state
->CPInit
[i
])
1386 (state
->CPInit
[i
]) (state
);
1391 /* Install co-processor finalisation routines in this routine. */
1394 ARMul_CoProExit (ARMul_State
* state
)
1396 register unsigned i
;
1398 for (i
= 0; i
< 16; i
++)
1399 if (state
->CPExit
[i
])
1400 (state
->CPExit
[i
]) (state
);
1402 for (i
= 0; i
< 16; i
++) /* Detach all handlers. */
1403 ARMul_CoProDetach (state
, i
);
1406 /* Routines to hook Co-processors into ARMulator. */
1409 ARMul_CoProAttach (ARMul_State
* state
,
1411 ARMul_CPInits
* init
,
1412 ARMul_CPExits
* exit
,
1418 ARMul_CPReads
* read
,
1419 ARMul_CPWrites
* write
)
1422 state
->CPInit
[number
] = init
;
1424 state
->CPExit
[number
] = exit
;
1426 state
->LDC
[number
] = ldc
;
1428 state
->STC
[number
] = stc
;
1430 state
->MRC
[number
] = mrc
;
1432 state
->MCR
[number
] = mcr
;
1434 state
->CDP
[number
] = cdp
;
1436 state
->CPRead
[number
] = read
;
1438 state
->CPWrite
[number
] = write
;
1442 ARMul_CoProDetach (ARMul_State
* state
, unsigned number
)
1444 ARMul_CoProAttach (state
, number
, NULL
, NULL
,
1445 NoCoPro4R
, NoCoPro4W
, NoCoPro4W
, NoCoPro4R
,
1446 NoCoPro3R
, NULL
, NULL
);
1448 state
->CPInit
[number
] = NULL
;
1449 state
->CPExit
[number
] = NULL
;
1450 state
->CPRead
[number
] = NULL
;
1451 state
->CPWrite
[number
] = NULL
;