unicore32: necessary modifications for other files to support unicore32
Signed-off-by: Guan Xuetao <gxt@mprc.pku.edu.cn> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
parent
8b5d487d4d
commit
d2fbca9422
11
configure
vendored
11
configure
vendored
@ -283,7 +283,7 @@ else
|
||||
fi
|
||||
|
||||
case "$cpu" in
|
||||
alpha|cris|ia64|lm32|m68k|microblaze|ppc|ppc64|sparc64)
|
||||
alpha|cris|ia64|lm32|m68k|microblaze|ppc|ppc64|sparc64|unicore32)
|
||||
cpu="$cpu"
|
||||
;;
|
||||
i386|i486|i586|i686|i86pc|BePC)
|
||||
@ -814,6 +814,9 @@ case "$cpu" in
|
||||
hppa*)
|
||||
host_guest_base="yes"
|
||||
;;
|
||||
unicore32*)
|
||||
host_guest_base="yes"
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -z "$guest_base" ] && guest_base="$host_guest_base"
|
||||
@ -1048,6 +1051,7 @@ sh4eb-linux-user \
|
||||
sparc-linux-user \
|
||||
sparc64-linux-user \
|
||||
sparc32plus-linux-user \
|
||||
unicore32-linux-user \
|
||||
"
|
||||
fi
|
||||
# the following are Darwin specific
|
||||
@ -2633,7 +2637,7 @@ echo "docdir=$docdir" >> $config_host_mak
|
||||
echo "confdir=$confdir" >> $config_host_mak
|
||||
|
||||
case "$cpu" in
|
||||
i386|x86_64|alpha|cris|hppa|ia64|lm32|m68k|microblaze|mips|mips64|ppc|ppc64|s390|s390x|sparc|sparc64)
|
||||
i386|x86_64|alpha|cris|hppa|ia64|lm32|m68k|microblaze|mips|mips64|ppc|ppc64|s390|s390x|sparc|sparc64|unicore32)
|
||||
ARCH=$cpu
|
||||
;;
|
||||
armv4b|armv4l)
|
||||
@ -3186,6 +3190,9 @@ case "$target_arch2" in
|
||||
target_phys_bits=64
|
||||
target_long_alignment=8
|
||||
;;
|
||||
unicore32)
|
||||
target_phys_bits=32
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported target CPU"
|
||||
exit 1
|
||||
|
12
cpu-exec.c
12
cpu-exec.c
@ -267,6 +267,7 @@ int cpu_exec(CPUState *env1)
|
||||
env->cc_x = (env->sr >> 4) & 1;
|
||||
#elif defined(TARGET_ALPHA)
|
||||
#elif defined(TARGET_ARM)
|
||||
#elif defined(TARGET_UNICORE32)
|
||||
#elif defined(TARGET_PPC)
|
||||
#elif defined(TARGET_LM32)
|
||||
#elif defined(TARGET_MICROBLAZE)
|
||||
@ -335,6 +336,8 @@ int cpu_exec(CPUState *env1)
|
||||
do_interrupt(env);
|
||||
#elif defined(TARGET_ARM)
|
||||
do_interrupt(env);
|
||||
#elif defined(TARGET_UNICORE32)
|
||||
do_interrupt(env);
|
||||
#elif defined(TARGET_SH4)
|
||||
do_interrupt(env);
|
||||
#elif defined(TARGET_ALPHA)
|
||||
@ -367,7 +370,7 @@ int cpu_exec(CPUState *env1)
|
||||
}
|
||||
#if defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_MIPS) || \
|
||||
defined(TARGET_PPC) || defined(TARGET_ALPHA) || defined(TARGET_CRIS) || \
|
||||
defined(TARGET_MICROBLAZE) || defined(TARGET_LM32)
|
||||
defined(TARGET_MICROBLAZE) || defined(TARGET_LM32) || defined(TARGET_UNICORE32)
|
||||
if (interrupt_request & CPU_INTERRUPT_HALT) {
|
||||
env->interrupt_request &= ~CPU_INTERRUPT_HALT;
|
||||
env->halted = 1;
|
||||
@ -514,6 +517,12 @@ int cpu_exec(CPUState *env1)
|
||||
do_interrupt(env);
|
||||
next_tb = 0;
|
||||
}
|
||||
#elif defined(TARGET_UNICORE32)
|
||||
if (interrupt_request & CPU_INTERRUPT_HARD
|
||||
&& !(env->uncached_asr & ASR_I)) {
|
||||
do_interrupt(env);
|
||||
next_tb = 0;
|
||||
}
|
||||
#elif defined(TARGET_SH4)
|
||||
if (interrupt_request & CPU_INTERRUPT_HARD) {
|
||||
do_interrupt(env);
|
||||
@ -664,6 +673,7 @@ int cpu_exec(CPUState *env1)
|
||||
env->eflags = env->eflags | helper_cc_compute_all(CC_OP) | (DF & DF_MASK);
|
||||
#elif defined(TARGET_ARM)
|
||||
/* XXX: Save/restore host fpu exception state?. */
|
||||
#elif defined(TARGET_UNICORE32)
|
||||
#elif defined(TARGET_SPARC)
|
||||
#elif defined(TARGET_PPC)
|
||||
#elif defined(TARGET_LM32)
|
||||
|
1
default-configs/unicore32-linux-user.mak
Normal file
1
default-configs/unicore32-linux-user.mak
Normal file
@ -0,0 +1 @@
|
||||
# Default configuration for unicore32-linux-user
|
2
elf.h
2
elf.h
@ -106,6 +106,8 @@ typedef int64_t Elf64_Sxword;
|
||||
#define EM_H8S 48 /* Hitachi H8S */
|
||||
#define EM_LATTICEMICO32 138 /* LatticeMico32 */
|
||||
|
||||
#define EM_UNICORE32 110 /* UniCore32 */
|
||||
|
||||
/*
|
||||
* This is an interim value that we will use until the committee comes
|
||||
* up with a final number.
|
||||
|
@ -93,7 +93,7 @@ float16 float16_maybe_silence_nan(float16 a_)
|
||||
{
|
||||
if (float16_is_signaling_nan(a_)) {
|
||||
#if SNAN_BIT_IS_ONE
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4)
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
|
||||
return float16_default_nan;
|
||||
# else
|
||||
# error Rules for silencing a signaling NaN are target-specific
|
||||
@ -184,7 +184,7 @@ float32 float32_maybe_silence_nan( float32 a_ )
|
||||
{
|
||||
if (float32_is_signaling_nan(a_)) {
|
||||
#if SNAN_BIT_IS_ONE
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4)
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
|
||||
return float32_default_nan;
|
||||
# else
|
||||
# error Rules for silencing a signaling NaN are target-specific
|
||||
@ -430,7 +430,7 @@ float64 float64_maybe_silence_nan( float64 a_ )
|
||||
{
|
||||
if (float64_is_signaling_nan(a_)) {
|
||||
#if SNAN_BIT_IS_ONE
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4)
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
|
||||
return float64_default_nan;
|
||||
# else
|
||||
# error Rules for silencing a signaling NaN are target-specific
|
||||
@ -578,7 +578,7 @@ floatx80 floatx80_maybe_silence_nan( floatx80 a )
|
||||
{
|
||||
if (floatx80_is_signaling_nan(a)) {
|
||||
#if SNAN_BIT_IS_ONE
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4)
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
|
||||
a.low = floatx80_default_nan_low;
|
||||
a.high = floatx80_default_nan_high;
|
||||
# else
|
||||
@ -721,7 +721,7 @@ float128 float128_maybe_silence_nan( float128 a )
|
||||
{
|
||||
if (float128_is_signaling_nan(a)) {
|
||||
#if SNAN_BIT_IS_ONE
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4)
|
||||
# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
|
||||
a.low = float128_default_nan_low;
|
||||
a.high = float128_default_nan_high;
|
||||
# else
|
||||
|
@ -68,7 +68,7 @@ typedef int64_t int64;
|
||||
#define LIT64( a ) a##LL
|
||||
#define INLINE static inline
|
||||
|
||||
#if defined(TARGET_MIPS) || defined(TARGET_SH4)
|
||||
#if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
|
||||
#define SNAN_BIT_IS_ONE 1
|
||||
#else
|
||||
#define SNAN_BIT_IS_ONE 0
|
||||
|
@ -339,6 +339,80 @@ enum
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_UNICORE32
|
||||
|
||||
#define ELF_START_MMAP 0x80000000
|
||||
|
||||
#define elf_check_arch(x) ((x) == EM_UNICORE32)
|
||||
|
||||
#define ELF_CLASS ELFCLASS32
|
||||
#define ELF_DATA ELFDATA2LSB
|
||||
#define ELF_ARCH EM_UNICORE32
|
||||
|
||||
static inline void init_thread(struct target_pt_regs *regs,
|
||||
struct image_info *infop)
|
||||
{
|
||||
abi_long stack = infop->start_stack;
|
||||
memset(regs, 0, sizeof(*regs));
|
||||
regs->UC32_REG_asr = 0x10;
|
||||
regs->UC32_REG_pc = infop->entry & 0xfffffffe;
|
||||
regs->UC32_REG_sp = infop->start_stack;
|
||||
/* FIXME - what to for failure of get_user()? */
|
||||
get_user_ual(regs->UC32_REG_02, stack + 8); /* envp */
|
||||
get_user_ual(regs->UC32_REG_01, stack + 4); /* envp */
|
||||
/* XXX: it seems that r0 is zeroed after ! */
|
||||
regs->UC32_REG_00 = 0;
|
||||
}
|
||||
|
||||
#define ELF_NREG 34
|
||||
typedef target_elf_greg_t target_elf_gregset_t[ELF_NREG];
|
||||
|
||||
static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUState *env)
|
||||
{
|
||||
(*regs)[0] = env->regs[0];
|
||||
(*regs)[1] = env->regs[1];
|
||||
(*regs)[2] = env->regs[2];
|
||||
(*regs)[3] = env->regs[3];
|
||||
(*regs)[4] = env->regs[4];
|
||||
(*regs)[5] = env->regs[5];
|
||||
(*regs)[6] = env->regs[6];
|
||||
(*regs)[7] = env->regs[7];
|
||||
(*regs)[8] = env->regs[8];
|
||||
(*regs)[9] = env->regs[9];
|
||||
(*regs)[10] = env->regs[10];
|
||||
(*regs)[11] = env->regs[11];
|
||||
(*regs)[12] = env->regs[12];
|
||||
(*regs)[13] = env->regs[13];
|
||||
(*regs)[14] = env->regs[14];
|
||||
(*regs)[15] = env->regs[15];
|
||||
(*regs)[16] = env->regs[16];
|
||||
(*regs)[17] = env->regs[17];
|
||||
(*regs)[18] = env->regs[18];
|
||||
(*regs)[19] = env->regs[19];
|
||||
(*regs)[20] = env->regs[20];
|
||||
(*regs)[21] = env->regs[21];
|
||||
(*regs)[22] = env->regs[22];
|
||||
(*regs)[23] = env->regs[23];
|
||||
(*regs)[24] = env->regs[24];
|
||||
(*regs)[25] = env->regs[25];
|
||||
(*regs)[26] = env->regs[26];
|
||||
(*regs)[27] = env->regs[27];
|
||||
(*regs)[28] = env->regs[28];
|
||||
(*regs)[29] = env->regs[29];
|
||||
(*regs)[30] = env->regs[30];
|
||||
(*regs)[31] = env->regs[31];
|
||||
|
||||
(*regs)[32] = cpu_asr_read((CPUState *)env);
|
||||
(*regs)[33] = env->regs[0]; /* XXX */
|
||||
}
|
||||
|
||||
#define USE_ELF_CORE_DUMP
|
||||
#define ELF_EXEC_PAGESIZE 4096
|
||||
|
||||
#define ELF_HWCAP (UC32_HWCAP_CMOV | UC32_HWCAP_UCF64)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_SPARC
|
||||
#ifdef TARGET_SPARC64
|
||||
|
||||
|
@ -816,6 +816,83 @@ void cpu_loop(CPUARMState *env)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_UNICORE32
|
||||
|
||||
void cpu_loop(CPUState *env)
|
||||
{
|
||||
int trapnr;
|
||||
unsigned int n, insn;
|
||||
target_siginfo_t info;
|
||||
|
||||
for (;;) {
|
||||
cpu_exec_start(env);
|
||||
trapnr = uc32_cpu_exec(env);
|
||||
cpu_exec_end(env);
|
||||
switch (trapnr) {
|
||||
case UC32_EXCP_PRIV:
|
||||
{
|
||||
/* system call */
|
||||
get_user_u32(insn, env->regs[31] - 4);
|
||||
n = insn & 0xffffff;
|
||||
|
||||
if (n >= UC32_SYSCALL_BASE) {
|
||||
/* linux syscall */
|
||||
n -= UC32_SYSCALL_BASE;
|
||||
if (n == UC32_SYSCALL_NR_set_tls) {
|
||||
cpu_set_tls(env, env->regs[0]);
|
||||
env->regs[0] = 0;
|
||||
} else {
|
||||
env->regs[0] = do_syscall(env,
|
||||
n,
|
||||
env->regs[0],
|
||||
env->regs[1],
|
||||
env->regs[2],
|
||||
env->regs[3],
|
||||
env->regs[4],
|
||||
env->regs[5]);
|
||||
}
|
||||
} else {
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case UC32_EXCP_TRAP:
|
||||
info.si_signo = SIGSEGV;
|
||||
info.si_errno = 0;
|
||||
/* XXX: check env->error_code */
|
||||
info.si_code = TARGET_SEGV_MAPERR;
|
||||
info._sifields._sigfault._addr = env->cp0.c4_faultaddr;
|
||||
queue_signal(env, info.si_signo, &info);
|
||||
break;
|
||||
case EXCP_INTERRUPT:
|
||||
/* just indicate that signals should be handled asap */
|
||||
break;
|
||||
case EXCP_DEBUG:
|
||||
{
|
||||
int sig;
|
||||
|
||||
sig = gdb_handlesig(env, TARGET_SIGTRAP);
|
||||
if (sig) {
|
||||
info.si_signo = sig;
|
||||
info.si_errno = 0;
|
||||
info.si_code = TARGET_TRAP_BRKPT;
|
||||
queue_signal(env, info.si_signo, &info);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
goto error;
|
||||
}
|
||||
process_pending_signals(env);
|
||||
}
|
||||
|
||||
error:
|
||||
fprintf(stderr, "qemu: unhandled CPU exception 0x%x - aborting\n", trapnr);
|
||||
cpu_dump_state(env, stderr, fprintf, 0);
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_SPARC
|
||||
#define SPARC64_STACK_BIAS 2047
|
||||
|
||||
@ -2925,6 +3002,8 @@ int main(int argc, char **argv, char **envp)
|
||||
#endif
|
||||
#elif defined(TARGET_ARM)
|
||||
cpu_model = "any";
|
||||
#elif defined(TARGET_UNICORE32)
|
||||
cpu_model = "any";
|
||||
#elif defined(TARGET_M68K)
|
||||
cpu_model = "any";
|
||||
#elif defined(TARGET_SPARC)
|
||||
@ -3227,6 +3306,14 @@ int main(int argc, char **argv, char **envp)
|
||||
env->regs[i] = regs->uregs[i];
|
||||
}
|
||||
}
|
||||
#elif defined(TARGET_UNICORE32)
|
||||
{
|
||||
int i;
|
||||
cpu_asr_write(env, regs->uregs[32], 0xffffffff);
|
||||
for (i = 0; i < 32; i++) {
|
||||
env->regs[i] = regs->uregs[i];
|
||||
}
|
||||
}
|
||||
#elif defined(TARGET_SPARC)
|
||||
{
|
||||
int i;
|
||||
@ -3367,7 +3454,7 @@ int main(int argc, char **argv, char **envp)
|
||||
#error unsupported target CPU
|
||||
#endif
|
||||
|
||||
#if defined(TARGET_ARM) || defined(TARGET_M68K)
|
||||
#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
|
||||
ts->stack_base = info->start_stack;
|
||||
ts->heap_base = info->brk;
|
||||
/* This will be filled in on the first SYS_HEAPINFO call. */
|
||||
|
@ -105,6 +105,9 @@ typedef struct TaskState {
|
||||
FPA11 fpa;
|
||||
int swi_errno;
|
||||
#endif
|
||||
#ifdef TARGET_UNICORE32
|
||||
int swi_errno;
|
||||
#endif
|
||||
#if defined(TARGET_I386) && !defined(TARGET_X86_64)
|
||||
abi_ulong target_v86;
|
||||
struct vm86_saved_state vm86_saved_regs;
|
||||
@ -118,7 +121,7 @@ typedef struct TaskState {
|
||||
#ifdef TARGET_M68K
|
||||
int sim_syscalls;
|
||||
#endif
|
||||
#if defined(TARGET_ARM) || defined(TARGET_M68K)
|
||||
#if defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_UNICORE32)
|
||||
/* Extra fields for semihosted binaries. */
|
||||
uint32_t stack_base;
|
||||
uint32_t heap_base;
|
||||
|
@ -55,7 +55,7 @@
|
||||
#endif
|
||||
|
||||
#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SH4) \
|
||||
|| defined(TARGET_M68K) || defined(TARGET_CRIS)
|
||||
|| defined(TARGET_M68K) || defined(TARGET_CRIS) || defined(TARGET_UNICORE32)
|
||||
|
||||
#define TARGET_IOC_SIZEBITS 14
|
||||
#define TARGET_IOC_DIRBITS 2
|
||||
@ -315,7 +315,10 @@ struct target_sigaction;
|
||||
int do_sigaction(int sig, const struct target_sigaction *act,
|
||||
struct target_sigaction *oact);
|
||||
|
||||
#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_PPC) || defined(TARGET_MIPS) || defined (TARGET_SH4) || defined(TARGET_M68K) || defined(TARGET_ALPHA) || defined(TARGET_CRIS) || defined(TARGET_MICROBLAZE)
|
||||
#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) \
|
||||
|| defined(TARGET_PPC) || defined(TARGET_MIPS) || defined(TARGET_SH4) \
|
||||
|| defined(TARGET_M68K) || defined(TARGET_ALPHA) || defined(TARGET_CRIS) \
|
||||
|| defined(TARGET_MICROBLAZE) || defined(TARGET_UNICORE32)
|
||||
|
||||
#if defined(TARGET_SPARC)
|
||||
#define TARGET_SA_NOCLDSTOP 8u
|
||||
@ -1002,7 +1005,8 @@ struct target_winsize {
|
||||
#define TARGET_MAP_UNINITIALIZED 0x4000000 /* for anonymous mmap, memory could be uninitialized */
|
||||
#endif
|
||||
|
||||
#if (defined(TARGET_I386) && defined(TARGET_ABI32)) || defined(TARGET_ARM) || defined(TARGET_CRIS)
|
||||
#if (defined(TARGET_I386) && defined(TARGET_ABI32)) || defined(TARGET_ARM) \
|
||||
|| defined(TARGET_CRIS) || defined(TARGET_UNICORE32)
|
||||
struct target_stat {
|
||||
unsigned short st_dev;
|
||||
unsigned short __pad1;
|
||||
|
Loading…
Reference in New Issue
Block a user