target/m68k: Make semihosting system only
While we had a call to do_m68k_semihosting in linux-user, it wasn't actually reachable. We don't include DISAS_INSN(halt) as an instruction unless system mode. Reviewed-by: Laurent Vivier <laurent@vivier.eu> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
ab294b6c3a
commit
a638af09b6
|
@ -36,11 +36,6 @@ void cpu_loop(CPUM68KState *env)
|
||||||
process_queued_cpu_work(cs);
|
process_queued_cpu_work(cs);
|
||||||
|
|
||||||
switch(trapnr) {
|
switch(trapnr) {
|
||||||
case EXCP_HALT_INSN:
|
|
||||||
/* Semihosing syscall. */
|
|
||||||
env->pc += 4;
|
|
||||||
do_m68k_semihosting(env, env->dregs[0]);
|
|
||||||
break;
|
|
||||||
case EXCP_ILLEGAL:
|
case EXCP_ILLEGAL:
|
||||||
case EXCP_LINEA:
|
case EXCP_LINEA:
|
||||||
case EXCP_LINEF:
|
case EXCP_LINEF:
|
||||||
|
|
|
@ -21,13 +21,8 @@
|
||||||
|
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "exec/gdbstub.h"
|
#include "exec/gdbstub.h"
|
||||||
#if defined(CONFIG_USER_ONLY)
|
|
||||||
#include "qemu.h"
|
|
||||||
#define SEMIHOSTING_HEAP_SIZE (128 * 1024 * 1024)
|
|
||||||
#else
|
|
||||||
#include "semihosting/softmmu-uaccess.h"
|
#include "semihosting/softmmu-uaccess.h"
|
||||||
#include "hw/boards.h"
|
#include "hw/boards.h"
|
||||||
#endif
|
|
||||||
#include "qemu/log.h"
|
#include "qemu/log.h"
|
||||||
|
|
||||||
#define HOSTED_EXIT 0
|
#define HOSTED_EXIT 0
|
||||||
|
@ -377,43 +372,12 @@ void do_m68k_semihosting(CPUM68KState *env, int nr)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case HOSTED_INIT_SIM:
|
case HOSTED_INIT_SIM:
|
||||||
#if defined(CONFIG_USER_ONLY)
|
|
||||||
{
|
|
||||||
CPUState *cs = env_cpu(env);
|
|
||||||
TaskState *ts = cs->opaque;
|
|
||||||
/* Allocate the heap using sbrk. */
|
|
||||||
if (!ts->heap_limit) {
|
|
||||||
abi_ulong ret;
|
|
||||||
uint32_t size;
|
|
||||||
uint32_t base;
|
|
||||||
|
|
||||||
base = do_brk(0);
|
|
||||||
size = SEMIHOSTING_HEAP_SIZE;
|
|
||||||
/* Try a big heap, and reduce the size if that fails. */
|
|
||||||
for (;;) {
|
|
||||||
ret = do_brk(base + size);
|
|
||||||
if (ret >= (base + size)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
size >>= 1;
|
|
||||||
}
|
|
||||||
ts->heap_limit = base + size;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* This call may happen before we have writable memory, so return
|
|
||||||
* values directly in registers.
|
|
||||||
*/
|
|
||||||
env->dregs[1] = ts->heap_limit;
|
|
||||||
env->aregs[7] = ts->stack_base;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/*
|
/*
|
||||||
* FIXME: This is wrong for boards where RAM does not start at
|
* FIXME: This is wrong for boards where RAM does not start at
|
||||||
* address zero.
|
* address zero.
|
||||||
*/
|
*/
|
||||||
env->dregs[1] = current_machine->ram_size;
|
env->dregs[1] = current_machine->ram_size;
|
||||||
env->aregs[7] = current_machine->ram_size;
|
env->aregs[7] = current_machine->ram_size;
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
cpu_abort(env_cpu(env), "Unsupported semihosting syscall %d\n", nr);
|
cpu_abort(env_cpu(env), "Unsupported semihosting syscall %d\n", nr);
|
||||||
|
|
|
@ -4,14 +4,16 @@ m68k_ss.add(files(
|
||||||
'fpu_helper.c',
|
'fpu_helper.c',
|
||||||
'gdbstub.c',
|
'gdbstub.c',
|
||||||
'helper.c',
|
'helper.c',
|
||||||
'm68k-semi.c',
|
|
||||||
'op_helper.c',
|
'op_helper.c',
|
||||||
'softfloat.c',
|
'softfloat.c',
|
||||||
'translate.c',
|
'translate.c',
|
||||||
))
|
))
|
||||||
|
|
||||||
m68k_softmmu_ss = ss.source_set()
|
m68k_softmmu_ss = ss.source_set()
|
||||||
m68k_softmmu_ss.add(files('monitor.c'))
|
m68k_softmmu_ss.add(files(
|
||||||
|
'm68k-semi.c',
|
||||||
|
'monitor.c'
|
||||||
|
))
|
||||||
|
|
||||||
target_arch += {'m68k': m68k_ss}
|
target_arch += {'m68k': m68k_ss}
|
||||||
target_softmmu_arch += {'m68k': m68k_softmmu_ss}
|
target_softmmu_arch += {'m68k': m68k_softmmu_ss}
|
||||||
|
|
Loading…
Reference in New Issue