arm: Adios armemu
This commit is contained in:
@ -19,213 +19,45 @@
|
||||
#include "core/arm/skyeye_common/armemu.h"
|
||||
#include "core/arm/skyeye_common/vfp/vfp.h"
|
||||
|
||||
//chy 2005-07-08
|
||||
//#include "ansidecl.h"
|
||||
//chy -------
|
||||
//#include "iwmmxt.h"
|
||||
// Dummy Co-processors.
|
||||
|
||||
/* Dummy Co-processors. */
|
||||
|
||||
static unsigned
|
||||
NoCoPro3R(ARMul_State * state,
|
||||
unsigned a, ARMword b)
|
||||
static unsigned int NoCoPro3R(ARMul_State* state, unsigned int a, ARMword b)
|
||||
{
|
||||
return ARMul_CANT;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
NoCoPro4R(ARMul_State * state,
|
||||
unsigned a,
|
||||
ARMword b, ARMword c)
|
||||
static unsigned int NoCoPro4R(ARMul_State* state, unsigned int a, ARMword b, ARMword c)
|
||||
{
|
||||
return ARMul_CANT;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
NoCoPro4W(ARMul_State * state,
|
||||
unsigned a,
|
||||
ARMword b, ARMword * c)
|
||||
static unsigned int NoCoPro4W(ARMul_State* state, unsigned int a, ARMword b, ARMword* c)
|
||||
{
|
||||
return ARMul_CANT;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
NoCoPro5R(ARMul_State * state,
|
||||
unsigned a,
|
||||
ARMword b,
|
||||
ARMword c, ARMword d)
|
||||
static unsigned int NoCoPro5R(ARMul_State* state, unsigned int a, ARMword b, ARMword c, ARMword d)
|
||||
{
|
||||
return ARMul_CANT;
|
||||
}
|
||||
|
||||
static unsigned
|
||||
NoCoPro5W(ARMul_State * state,
|
||||
unsigned a,
|
||||
ARMword b,
|
||||
ARMword * c, ARMword * d)
|
||||
static unsigned int NoCoPro5W(ARMul_State* state, unsigned int a, ARMword b, ARMword* c, ARMword* d)
|
||||
{
|
||||
return ARMul_CANT;
|
||||
}
|
||||
|
||||
/* The XScale Co-processors. */
|
||||
|
||||
/* Coprocessor 15: System Control. */
|
||||
static void write_cp14_reg(unsigned, ARMword);
|
||||
static ARMword read_cp14_reg(unsigned);
|
||||
|
||||
/* Check an access to a register. */
|
||||
|
||||
static unsigned
|
||||
check_cp15_access(ARMul_State * state,
|
||||
unsigned reg,
|
||||
unsigned CRm, unsigned opcode_1, unsigned opcode_2)
|
||||
// Install co-processor instruction handlers in this routine.
|
||||
unsigned int ARMul_CoProInit(ARMul_State* state)
|
||||
{
|
||||
/* Do not allow access to these register in USER mode. */
|
||||
//chy 2006-02-16 , should not consider system mode, don't conside 26bit mode
|
||||
if (state->Mode == USER26MODE || state->Mode == USER32MODE)
|
||||
return ARMul_CANT;
|
||||
|
||||
/* Opcode_1should be zero. */
|
||||
if (opcode_1 != 0)
|
||||
return ARMul_CANT;
|
||||
|
||||
/* Different register have different access requirements. */
|
||||
switch (reg) {
|
||||
case 0:
|
||||
case 1:
|
||||
/* CRm must be 0. Opcode_2 can be anything. */
|
||||
if (CRm != 0)
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
/* CRm must be 0. Opcode_2 must be zero. */
|
||||
if ((CRm != 0) || (opcode_2 != 0))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 4:
|
||||
/* Access not allowed. */
|
||||
return ARMul_CANT;
|
||||
case 5:
|
||||
case 6:
|
||||
/* Opcode_2 must be zero. CRm must be 0. */
|
||||
if ((CRm != 0) || (opcode_2 != 0))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 7:
|
||||
/* Permissable combinations:
|
||||
Opcode_2 CRm
|
||||
0 5
|
||||
0 6
|
||||
0 7
|
||||
1 5
|
||||
1 6
|
||||
1 10
|
||||
4 10
|
||||
5 2
|
||||
6 5 */
|
||||
switch (opcode_2) {
|
||||
default:
|
||||
return ARMul_CANT;
|
||||
case 6:
|
||||
if (CRm != 5)
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 5:
|
||||
if (CRm != 2)
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 4:
|
||||
if (CRm != 10)
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 1:
|
||||
if ((CRm != 5) && (CRm != 6) && (CRm != 10))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 0:
|
||||
if ((CRm < 5) || (CRm > 7))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 8:
|
||||
/* Permissable combinations:
|
||||
Opcode_2 CRm
|
||||
0 5
|
||||
0 6
|
||||
0 7
|
||||
1 5
|
||||
1 6 */
|
||||
if (opcode_2 > 1)
|
||||
return ARMul_CANT;
|
||||
if ((CRm < 5) || (CRm > 7))
|
||||
return ARMul_CANT;
|
||||
if (opcode_2 == 1 && CRm == 7)
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 9:
|
||||
/* Opcode_2 must be zero or one. CRm must be 1 or 2. */
|
||||
if (((CRm != 0) && (CRm != 1))
|
||||
|| ((opcode_2 != 1) && (opcode_2 != 2)))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 10:
|
||||
/* Opcode_2 must be zero or one. CRm must be 4 or 8. */
|
||||
if (((CRm != 0) && (CRm != 1))
|
||||
|| ((opcode_2 != 4) && (opcode_2 != 8)))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 11:
|
||||
/* Access not allowed. */
|
||||
return ARMul_CANT;
|
||||
case 12:
|
||||
/* Access not allowed. */
|
||||
return ARMul_CANT;
|
||||
case 13:
|
||||
/* Opcode_2 must be zero. CRm must be 0. */
|
||||
if ((CRm != 0) || (opcode_2 != 0))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 14:
|
||||
/* Opcode_2 must be 0. CRm must be 0, 3, 4, 8 or 9. */
|
||||
if (opcode_2 != 0)
|
||||
return ARMul_CANT;
|
||||
|
||||
if ((CRm != 0) && (CRm != 3) && (CRm != 4) && (CRm != 8)
|
||||
&& (CRm != 9))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
case 15:
|
||||
/* Opcode_2 must be zero. CRm must be 1. */
|
||||
if ((CRm != 1) || (opcode_2 != 0))
|
||||
return ARMul_CANT;
|
||||
break;
|
||||
default:
|
||||
/* Should never happen. */
|
||||
return ARMul_CANT;
|
||||
}
|
||||
|
||||
return ARMul_DONE;
|
||||
}
|
||||
|
||||
/* Install co-processor instruction handlers in this routine. */
|
||||
|
||||
unsigned
|
||||
ARMul_CoProInit(ARMul_State * state)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Initialise tham all first. */
|
||||
for (i = 0; i < 16; i++)
|
||||
// Initialise tham all first.
|
||||
for (unsigned int i = 0; i < 16; i++)
|
||||
ARMul_CoProDetach(state, i);
|
||||
|
||||
/* Install CoPro Instruction handlers here.
|
||||
The format is:
|
||||
ARMul_CoProAttach (state, CP Number, Init routine, Exit routine
|
||||
LDC routine, STC routine, MRC routine, MCR routine,
|
||||
CDP routine, Read Reg routine, Write Reg routine). */
|
||||
// Install CoPro Instruction handlers here.
|
||||
// The format is:
|
||||
// ARMul_CoProAttach (state, CP Number, Init routine, Exit routine
|
||||
// LDC routine, STC routine, MRC routine, MCR routine,
|
||||
// CDP routine, Read Reg routine, Write Reg routine).
|
||||
if (state->is_v6) {
|
||||
ARMul_CoProAttach(state, 10, VFPInit, NULL, VFPLDC, VFPSTC,
|
||||
VFPMRC, VFPMCR, VFPMRRC, VFPMCRR, VFPCDP, NULL, NULL);
|
||||
@ -235,57 +67,44 @@ ARMul_CoProInit(ARMul_State * state)
|
||||
/*ARMul_CoProAttach (state, 15, MMUInit, NULL, NULL, NULL,
|
||||
MMUMRC, MMUMCR, NULL, NULL, NULL, NULL, NULL);*/
|
||||
}
|
||||
//chy 2003-09-03 do it in future!!!!????
|
||||
#if 0
|
||||
if (state->is_iWMMXt) {
|
||||
ARMul_CoProAttach(state, 0, NULL, NULL, IwmmxtLDC, IwmmxtSTC,
|
||||
NULL, NULL, IwmmxtCDP, NULL, NULL);
|
||||
|
||||
ARMul_CoProAttach(state, 1, NULL, NULL, NULL, NULL,
|
||||
IwmmxtMRC, IwmmxtMCR, IwmmxtCDP, NULL,
|
||||
NULL);
|
||||
}
|
||||
#endif
|
||||
/* No handlers below here. */
|
||||
// No handlers below here.
|
||||
|
||||
/* Call all the initialisation routines. */
|
||||
for (i = 0; i < 16; i++)
|
||||
// Call all the initialisation routines.
|
||||
for (unsigned int i = 0; i < 16; i++)
|
||||
if (state->CPInit[i])
|
||||
(state->CPInit[i]) (state);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Install co-processor finalisation routines in this routine. */
|
||||
|
||||
void
|
||||
ARMul_CoProExit(ARMul_State * state)
|
||||
// Install co-processor finalisation routines in this routine.
|
||||
void ARMul_CoProExit(ARMul_State * state)
|
||||
{
|
||||
register unsigned i;
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
for (unsigned int i = 0; i < 16; i++)
|
||||
if (state->CPExit[i])
|
||||
(state->CPExit[i]) (state);
|
||||
|
||||
for (i = 0; i < 16; i++) /* Detach all handlers. */
|
||||
// Detach all handlers.
|
||||
for (unsigned int i = 0; i < 16; i++)
|
||||
ARMul_CoProDetach(state, i);
|
||||
}
|
||||
|
||||
/* Routines to hook Co-processors into ARMulator. */
|
||||
// Routines to hook Co-processors into ARMulator.
|
||||
|
||||
void
|
||||
ARMul_CoProAttach(ARMul_State * state,
|
||||
ARMul_CoProAttach(ARMul_State* state,
|
||||
unsigned number,
|
||||
ARMul_CPInits * init,
|
||||
ARMul_CPExits * exit,
|
||||
ARMul_LDCs * ldc,
|
||||
ARMul_STCs * stc,
|
||||
ARMul_MRCs * mrc,
|
||||
ARMul_MCRs * mcr,
|
||||
ARMul_MRRCs * mrrc,
|
||||
ARMul_MCRRs * mcrr,
|
||||
ARMul_CDPs * cdp,
|
||||
ARMul_CPReads * read, ARMul_CPWrites * write)
|
||||
ARMul_CPInits* init,
|
||||
ARMul_CPExits* exit,
|
||||
ARMul_LDCs* ldc,
|
||||
ARMul_STCs* stc,
|
||||
ARMul_MRCs* mrc,
|
||||
ARMul_MCRs* mcr,
|
||||
ARMul_MRRCs* mrrc,
|
||||
ARMul_MCRRs* mcrr,
|
||||
ARMul_CDPs* cdp,
|
||||
ARMul_CPReads* read, ARMul_CPWrites* write)
|
||||
{
|
||||
if (init != NULL)
|
||||
state->CPInit[number] = init;
|
||||
@ -311,8 +130,7 @@ ARMul_CPReads * read, ARMul_CPWrites * write)
|
||||
state->CPWrite[number] = write;
|
||||
}
|
||||
|
||||
void
|
||||
ARMul_CoProDetach(ARMul_State * state, unsigned number)
|
||||
void ARMul_CoProDetach(ARMul_State* state, unsigned number)
|
||||
{
|
||||
ARMul_CoProAttach(state, number, NULL, NULL,
|
||||
NoCoPro4R, NoCoPro4W, NoCoPro4W, NoCoPro4R,
|
||||
|
Reference in New Issue
Block a user