Commit 9bbc5cc8295670fd3f80fbdbc7fdddcecb403880
1 parent
8f860bb8
Fiddly dyngen bits for s390 host support, by Ulrich Hecht.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3105 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
19 additions
and
1 deletions
dyngen-exec.h
@@ -254,7 +254,7 @@ extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3; | @@ -254,7 +254,7 @@ extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3; | ||
254 | #define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n) | 254 | #define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n) |
255 | #elif defined(__s390__) | 255 | #elif defined(__s390__) |
256 | #define EXIT_TB() asm volatile ("br %r14") | 256 | #define EXIT_TB() asm volatile ("br %r14") |
257 | -#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n) | 257 | +#define GOTO_LABEL_PARAM(n) asm volatile ("bras %r7,8; .long " ASM_NAME(__op_gen_label) #n "; l %r7, 0(%r7); br %r7") |
258 | #elif defined(__alpha__) | 258 | #elif defined(__alpha__) |
259 | #define EXIT_TB() asm volatile ("ret") | 259 | #define EXIT_TB() asm volatile ("ret") |
260 | #elif defined(__ia64__) | 260 | #elif defined(__ia64__) |
exec-all.h
@@ -340,6 +340,24 @@ do {\ | @@ -340,6 +340,24 @@ do {\ | ||
340 | "1:\n");\ | 340 | "1:\n");\ |
341 | } while (0) | 341 | } while (0) |
342 | 342 | ||
343 | +#elif defined(__s390__) | ||
344 | +/* GCC spills R13, so we have to restore it before branching away */ | ||
345 | + | ||
346 | +#define GOTO_TB(opname, tbparam, n)\ | ||
347 | +do {\ | ||
348 | + static void __attribute__((used)) *dummy ## n = &&dummy_label ## n;\ | ||
349 | + static void __attribute__((used)) *__op_label ## n \ | ||
350 | + __asm__(ASM_OP_LABEL_NAME(n, opname)) = &&label ## n;\ | ||
351 | + __asm__ __volatile__ ( \ | ||
352 | + "l %%r13,52(%%r15)\n" \ | ||
353 | + "br %0\n" \ | ||
354 | + : : "r" (((TranslationBlock*)tbparam)->tb_next[n]));\ | ||
355 | + \ | ||
356 | + for(;*((int*)0);); /* just to keep GCC busy */ \ | ||
357 | +label ## n: ;\ | ||
358 | +dummy_label ## n: ;\ | ||
359 | +} while(0) | ||
360 | + | ||
343 | #else | 361 | #else |
344 | 362 | ||
345 | /* jump to next block operations (more portable code, does not need | 363 | /* jump to next block operations (more portable code, does not need |