Commit 48733d195b10a61a18c0aafcdd0ae711bdfe03a6

Authored by ths
1 parent e69b4065

CRIS Linux userland emulation, part 2. By Edgar E. Iglesias.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3367 c046a42c-6fe2-441c-8c8c-71466251a162
linux-user/elfload.c
@@ -334,6 +334,26 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i @@ -334,6 +334,26 @@ static inline void init_thread(struct target_pt_regs *regs, struct image_info *i
334 334
335 #endif 335 #endif
336 336
  337 +#ifdef TARGET_CRIS
  338 +
  339 +#define ELF_START_MMAP 0x80000000
  340 +
  341 +#define elf_check_arch(x) ( (x) == EM_CRIS )
  342 +
  343 +#define ELF_CLASS ELFCLASS32
  344 +#define ELF_DATA ELFDATA2LSB
  345 +#define ELF_ARCH EM_CRIS
  346 +
  347 +static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
  348 +{
  349 + regs->erp = infop->entry;
  350 +}
  351 +
  352 +#define USE_ELF_CORE_DUMP
  353 +#define ELF_EXEC_PAGESIZE 8192
  354 +
  355 +#endif
  356 +
337 #ifdef TARGET_M68K 357 #ifdef TARGET_M68K
338 358
339 #define ELF_START_MMAP 0x80000000 359 #define ELF_START_MMAP 0x80000000
linux-user/main.c
@@ -1601,6 +1601,61 @@ void cpu_loop (CPUState *env) @@ -1601,6 +1601,61 @@ void cpu_loop (CPUState *env)
1601 } 1601 }
1602 #endif 1602 #endif
1603 1603
  1604 +#ifdef TARGET_CRIS
  1605 +void cpu_loop (CPUState *env)
  1606 +{
  1607 + int trapnr, ret;
  1608 + target_siginfo_t info;
  1609 +
  1610 + while (1) {
  1611 + trapnr = cpu_cris_exec (env);
  1612 + switch (trapnr) {
  1613 + case 0xaa:
  1614 + {
  1615 + info.si_signo = SIGSEGV;
  1616 + info.si_errno = 0;
  1617 + /* XXX: check env->error_code */
  1618 + info.si_code = TARGET_SEGV_MAPERR;
  1619 + info._sifields._sigfault._addr = env->debug1;
  1620 + queue_signal(info.si_signo, &info);
  1621 + }
  1622 + break;
  1623 + case EXCP_BREAK:
  1624 + ret = do_syscall(env,
  1625 + env->regs[9],
  1626 + env->regs[10],
  1627 + env->regs[11],
  1628 + env->regs[12],
  1629 + env->regs[13],
  1630 + env->pregs[7],
  1631 + env->pregs[11]);
  1632 + env->regs[10] = ret;
  1633 + env->pc += 2;
  1634 + break;
  1635 + case EXCP_DEBUG:
  1636 + {
  1637 + int sig;
  1638 +
  1639 + sig = gdb_handlesig (env, TARGET_SIGTRAP);
  1640 + if (sig)
  1641 + {
  1642 + info.si_signo = sig;
  1643 + info.si_errno = 0;
  1644 + info.si_code = TARGET_TRAP_BRKPT;
  1645 + queue_signal(info.si_signo, &info);
  1646 + }
  1647 + }
  1648 + break;
  1649 + default:
  1650 + printf ("Unhandled trap: 0x%x\n", trapnr);
  1651 + cpu_dump_state(env, stderr, fprintf, 0);
  1652 + exit (1);
  1653 + }
  1654 + process_pending_signals (env);
  1655 + }
  1656 +}
  1657 +#endif
  1658 +
1604 #ifdef TARGET_M68K 1659 #ifdef TARGET_M68K
1605 1660
1606 void cpu_loop(CPUM68KState *env) 1661 void cpu_loop(CPUM68KState *env)
@@ -2195,6 +2250,26 @@ int main(int argc, char **argv) @@ -2195,6 +2250,26 @@ int main(int argc, char **argv)
2195 env->pc = regs->pc; 2250 env->pc = regs->pc;
2196 env->unique = regs->unique; 2251 env->unique = regs->unique;
2197 } 2252 }
  2253 +#elif defined(TARGET_CRIS)
  2254 + {
  2255 + env->regs[0] = regs->r0;
  2256 + env->regs[1] = regs->r1;
  2257 + env->regs[2] = regs->r2;
  2258 + env->regs[3] = regs->r3;
  2259 + env->regs[4] = regs->r4;
  2260 + env->regs[5] = regs->r5;
  2261 + env->regs[6] = regs->r6;
  2262 + env->regs[7] = regs->r7;
  2263 + env->regs[8] = regs->r8;
  2264 + env->regs[9] = regs->r9;
  2265 + env->regs[10] = regs->r10;
  2266 + env->regs[11] = regs->r11;
  2267 + env->regs[12] = regs->r12;
  2268 + env->regs[13] = regs->r13;
  2269 + env->regs[14] = info->start_stack;
  2270 + env->regs[15] = regs->acr;
  2271 + env->pc = regs->erp;
  2272 + }
2198 #else 2273 #else
2199 #error unsupported target CPU 2274 #error unsupported target CPU
2200 #endif 2275 #endif
linux-user/syscall.c
@@ -74,7 +74,7 @@ @@ -74,7 +74,7 @@
74 //#define DEBUG 74 //#define DEBUG
75 75
76 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) \ 76 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SPARC) \
77 - || defined(TARGET_M68K) || defined(TARGET_SH4) 77 + || defined(TARGET_M68K) || defined(TARGET_SH4) || defined(TARGET_CRIS)
78 /* 16 bit uid wrappers emulation */ 78 /* 16 bit uid wrappers emulation */
79 #define USE_UID16 79 #define USE_UID16
80 #endif 80 #endif
@@ -2286,6 +2286,10 @@ int do_fork(CPUState *env, unsigned int flags, target_ulong newsp) @@ -2286,6 +2286,10 @@ int do_fork(CPUState *env, unsigned int flags, target_ulong newsp)
2286 for (i = 7; i < 30; i++) 2286 for (i = 7; i < 30; i++)
2287 new_env->ir[i] = 0; 2287 new_env->ir[i] = 0;
2288 } 2288 }
  2289 +#elif defined(TARGET_CRIS)
  2290 + if (!newsp)
  2291 + newsp = env->regs[14];
  2292 + new_env->regs[14] = newsp;
2289 #else 2293 #else
2290 #error unsupported target CPU 2294 #error unsupported target CPU
2291 #endif 2295 #endif
@@ -3502,7 +3506,7 @@ target_long do_syscall(void *cpu_env, int num, target_long arg1, @@ -3502,7 +3506,7 @@ target_long do_syscall(void *cpu_env, int num, target_long arg1,
3502 #endif 3506 #endif
3503 #ifdef TARGET_NR_mmap 3507 #ifdef TARGET_NR_mmap
3504 case TARGET_NR_mmap: 3508 case TARGET_NR_mmap:
3505 -#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_M68K) 3509 +#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_M68K) || defined(TARGET_CRIS)
3506 { 3510 {
3507 target_ulong *v; 3511 target_ulong *v;
3508 target_ulong v1, v2, v3, v4, v5, v6; 3512 target_ulong v1, v2, v3, v4, v5, v6;
linux-user/syscall_defs.h
@@ -49,7 +49,7 @@ @@ -49,7 +49,7 @@
49 #define TARGET_IOC_TYPEBITS 8 49 #define TARGET_IOC_TYPEBITS 8
50 50
51 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SH4) \ 51 #if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_SH4) \
52 - || defined(TARGET_M68K) || defined(TARGET_ALPHA) 52 + || defined(TARGET_M68K) || defined(TARGET_ALPHA) || defined(TARGET_CRIS)
53 53
54 #define TARGET_IOC_SIZEBITS 14 54 #define TARGET_IOC_SIZEBITS 14
55 #define TARGET_IOC_DIRBITS 2 55 #define TARGET_IOC_DIRBITS 2
@@ -289,7 +289,7 @@ struct target_sigaction; @@ -289,7 +289,7 @@ struct target_sigaction;
289 int do_sigaction(int sig, const struct target_sigaction *act, 289 int do_sigaction(int sig, const struct target_sigaction *act,
290 struct target_sigaction *oact); 290 struct target_sigaction *oact);
291 291
292 -#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) 292 +#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)
293 293
294 #if defined(TARGET_SPARC) 294 #if defined(TARGET_SPARC)
295 #define TARGET_SA_NOCLDSTOP 8u 295 #define TARGET_SA_NOCLDSTOP 8u
@@ -884,7 +884,7 @@ struct target_winsize { @@ -884,7 +884,7 @@ struct target_winsize {
884 #define TARGET_MAP_NONBLOCK 0x10000 /* do not block on IO */ 884 #define TARGET_MAP_NONBLOCK 0x10000 /* do not block on IO */
885 #endif 885 #endif
886 886
887 -#if defined(TARGET_I386) || defined(TARGET_ARM) 887 +#if defined(TARGET_I386) || defined(TARGET_ARM) || defined(TARGET_CRIS)
888 struct target_stat { 888 struct target_stat {
889 unsigned short st_dev; 889 unsigned short st_dev;
890 unsigned short __pad1; 890 unsigned short __pad1;