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
					
				|  | @ -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) | ||||
|  |  | |||
|  | @ -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
	
	 Guan Xuetao
						Guan Xuetao