Revision b5dc7732 linux-user/main.c
b/linux-user/main.c | ||
---|---|---|
1779 | 1779 |
trapnr = cpu_mips_exec(env); |
1780 | 1780 |
switch(trapnr) { |
1781 | 1781 |
case EXCP_SYSCALL: |
1782 |
syscall_num = env->gpr[env->current_tc][2] - 4000;
|
|
1783 |
env->PC[env->current_tc] += 4;
|
|
1782 |
syscall_num = env->active_tc.gpr[2] - 4000;
|
|
1783 |
env->active_tc.PC += 4;
|
|
1784 | 1784 |
if (syscall_num >= sizeof(mips_syscall_args)) { |
1785 | 1785 |
ret = -ENOSYS; |
1786 | 1786 |
} else { |
... | ... | |
1789 | 1789 |
abi_ulong arg5 = 0, arg6 = 0, arg7 = 0, arg8 = 0; |
1790 | 1790 |
|
1791 | 1791 |
nb_args = mips_syscall_args[syscall_num]; |
1792 |
sp_reg = env->gpr[env->current_tc][29];
|
|
1792 |
sp_reg = env->active_tc.gpr[29];
|
|
1793 | 1793 |
switch (nb_args) { |
1794 | 1794 |
/* these arguments are taken from the stack */ |
1795 | 1795 |
/* FIXME - what to do if get_user() fails? */ |
... | ... | |
1800 | 1800 |
default: |
1801 | 1801 |
break; |
1802 | 1802 |
} |
1803 |
ret = do_syscall(env, env->gpr[env->current_tc][2],
|
|
1804 |
env->gpr[env->current_tc][4],
|
|
1805 |
env->gpr[env->current_tc][5],
|
|
1806 |
env->gpr[env->current_tc][6],
|
|
1807 |
env->gpr[env->current_tc][7],
|
|
1803 |
ret = do_syscall(env, env->active_tc.gpr[2],
|
|
1804 |
env->active_tc.gpr[4],
|
|
1805 |
env->active_tc.gpr[5],
|
|
1806 |
env->active_tc.gpr[6],
|
|
1807 |
env->active_tc.gpr[7],
|
|
1808 | 1808 |
arg5, arg6/*, arg7, arg8*/); |
1809 | 1809 |
} |
1810 | 1810 |
if ((unsigned int)ret >= (unsigned int)(-1133)) { |
1811 |
env->gpr[env->current_tc][7] = 1; /* error flag */
|
|
1811 |
env->active_tc.gpr[7] = 1; /* error flag */
|
|
1812 | 1812 |
ret = -ret; |
1813 | 1813 |
} else { |
1814 |
env->gpr[env->current_tc][7] = 0; /* error flag */
|
|
1814 |
env->active_tc.gpr[7] = 0; /* error flag */
|
|
1815 | 1815 |
} |
1816 |
env->gpr[env->current_tc][2] = ret;
|
|
1816 |
env->active_tc.gpr[2] = ret;
|
|
1817 | 1817 |
break; |
1818 | 1818 |
case EXCP_TLBL: |
1819 | 1819 |
case EXCP_TLBS: |
... | ... | |
2566 | 2566 |
int i; |
2567 | 2567 |
|
2568 | 2568 |
for(i = 0; i < 32; i++) { |
2569 |
env->gpr[env->current_tc][i] = regs->regs[i];
|
|
2569 |
env->active_tc.gpr[i] = regs->regs[i];
|
|
2570 | 2570 |
} |
2571 |
env->PC[env->current_tc] = regs->cp0_epc;
|
|
2571 |
env->active_tc.PC = regs->cp0_epc;
|
|
2572 | 2572 |
} |
2573 | 2573 |
#elif defined(TARGET_SH4) |
2574 | 2574 |
{ |
Also available in: Unified diff