mirror of https://github.com/xemu-project/xemu.git
MMU fix - temporary osi_call support - xec_bc mask fix
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1437 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
6d506e6dc2
commit
d094807b9b
|
@ -22,6 +22,8 @@
|
||||||
//#define DEBUG_MMU
|
//#define DEBUG_MMU
|
||||||
//#define DEBUG_BATS
|
//#define DEBUG_BATS
|
||||||
//#define DEBUG_EXCEPTIONS
|
//#define DEBUG_EXCEPTIONS
|
||||||
|
/* accurate but slower TLB flush in exceptions */
|
||||||
|
//#define ACCURATE_TLB_FLUSH
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* PPC MMU emulation */
|
/* PPC MMU emulation */
|
||||||
|
@ -604,7 +606,7 @@ void _store_xer (CPUState *env, uint32_t value)
|
||||||
xer_so = (value >> XER_SO) & 0x01;
|
xer_so = (value >> XER_SO) & 0x01;
|
||||||
xer_ov = (value >> XER_OV) & 0x01;
|
xer_ov = (value >> XER_OV) & 0x01;
|
||||||
xer_ca = (value >> XER_CA) & 0x01;
|
xer_ca = (value >> XER_CA) & 0x01;
|
||||||
xer_bc = (value >> XER_BC) & 0x1f;
|
xer_bc = (value >> XER_BC) & 0x3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t _load_msr (CPUState *env)
|
uint32_t _load_msr (CPUState *env)
|
||||||
|
@ -628,7 +630,7 @@ uint32_t _load_msr (CPUState *env)
|
||||||
|
|
||||||
void _store_msr (CPUState *env, uint32_t value)
|
void _store_msr (CPUState *env, uint32_t value)
|
||||||
{
|
{
|
||||||
#if 0 // TRY
|
#ifdef ACCURATE_TLB_FLUSH
|
||||||
if (((value >> MSR_IR) & 0x01) != msr_ir ||
|
if (((value >> MSR_IR) & 0x01) != msr_ir ||
|
||||||
((value >> MSR_DR) & 0x01) != msr_dr)
|
((value >> MSR_DR) & 0x01) != msr_dr)
|
||||||
{
|
{
|
||||||
|
@ -660,6 +662,13 @@ void do_interrupt (CPUState *env)
|
||||||
env->exception_index = -1;
|
env->exception_index = -1;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
static void dump_syscall(CPUState *env)
|
||||||
|
{
|
||||||
|
fprintf(logfile, "syscall r0=0x%08x r3=0x%08x r4=0x%08x r5=0x%08x r6=0x%08x nip=0x%08x\n",
|
||||||
|
env->gpr[0], env->gpr[3], env->gpr[4],
|
||||||
|
env->gpr[5], env->gpr[6], env->nip);
|
||||||
|
}
|
||||||
|
|
||||||
void do_interrupt (CPUState *env)
|
void do_interrupt (CPUState *env)
|
||||||
{
|
{
|
||||||
uint32_t msr;
|
uint32_t msr;
|
||||||
|
@ -707,11 +716,11 @@ void do_interrupt (CPUState *env)
|
||||||
*/
|
*/
|
||||||
msr &= ~0xFFFF0000;
|
msr &= ~0xFFFF0000;
|
||||||
env->spr[DSISR] = 0;
|
env->spr[DSISR] = 0;
|
||||||
if (env->error_code & EXCP_DSI_TRANSLATE)
|
if ((env->error_code & 0x0f) == EXCP_DSI_TRANSLATE)
|
||||||
env->spr[DSISR] |= 0x40000000;
|
env->spr[DSISR] |= 0x40000000;
|
||||||
else if (env->error_code & EXCP_DSI_PROT)
|
else if ((env->error_code & 0x0f) == EXCP_DSI_PROT)
|
||||||
env->spr[DSISR] |= 0x08000000;
|
env->spr[DSISR] |= 0x08000000;
|
||||||
else if (env->error_code & EXCP_DSI_NOTSUP) {
|
else if ((env->error_code & 0x0f) == EXCP_DSI_NOTSUP) {
|
||||||
env->spr[DSISR] |= 0x80000000;
|
env->spr[DSISR] |= 0x80000000;
|
||||||
if (env->error_code & EXCP_DSI_DIRECT)
|
if (env->error_code & EXCP_DSI_DIRECT)
|
||||||
env->spr[DSISR] |= 0x04000000;
|
env->spr[DSISR] |= 0x04000000;
|
||||||
|
@ -819,28 +828,15 @@ void do_interrupt (CPUState *env)
|
||||||
}
|
}
|
||||||
goto store_next;
|
goto store_next;
|
||||||
case EXCP_SYSCALL:
|
case EXCP_SYSCALL:
|
||||||
|
/* NOTE: this is a temporary hack to support graphics OSI
|
||||||
|
calls from the MOL driver */
|
||||||
|
if (env->gpr[3] == 0x113724fa && env->gpr[4] == 0x77810f9b &&
|
||||||
|
env->osi_call) {
|
||||||
|
if (env->osi_call(env) != 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (loglevel & CPU_LOG_INT) {
|
if (loglevel & CPU_LOG_INT) {
|
||||||
fprintf(logfile, "syscall %d 0x%08x 0x%08x 0x%08x 0x%08x\n",
|
dump_syscall(env);
|
||||||
env->gpr[0], env->gpr[3], env->gpr[4],
|
|
||||||
env->gpr[5], env->gpr[6]);
|
|
||||||
if (env->gpr[0] == 4 && env->gpr[3] == 1) {
|
|
||||||
int len, addr, i;
|
|
||||||
uint8_t c;
|
|
||||||
|
|
||||||
fprintf(logfile, "write: ");
|
|
||||||
addr = env->gpr[4];
|
|
||||||
len = env->gpr[5];
|
|
||||||
if (len > 64)
|
|
||||||
len = 64;
|
|
||||||
for(i = 0; i < len; i++) {
|
|
||||||
c = 0;
|
|
||||||
cpu_memory_rw_debug(env, addr + i, &c, 1, 0);
|
|
||||||
if (c < 32 || c > 126)
|
|
||||||
c = '.';
|
|
||||||
fprintf(logfile, "%c", c);
|
|
||||||
}
|
|
||||||
fprintf(logfile, "\n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
goto store_next;
|
goto store_next;
|
||||||
case EXCP_TRACE:
|
case EXCP_TRACE:
|
||||||
|
@ -887,6 +883,9 @@ void do_interrupt (CPUState *env)
|
||||||
env->nip = excp << 8;
|
env->nip = excp << 8;
|
||||||
env->exception_index = EXCP_NONE;
|
env->exception_index = EXCP_NONE;
|
||||||
/* Invalidate all TLB as we may have changed translation mode */
|
/* Invalidate all TLB as we may have changed translation mode */
|
||||||
|
#ifdef ACCURATE_TLB_FLUSH
|
||||||
|
tlb_flush(env, 1);
|
||||||
|
#endif
|
||||||
/* ensure that no TB jump will be modified as
|
/* ensure that no TB jump will be modified as
|
||||||
the program flow was changed */
|
the program flow was changed */
|
||||||
#ifdef __sparc__
|
#ifdef __sparc__
|
||||||
|
|
Loading…
Reference in New Issue