Commit 9bbc5cc8295670fd3f80fbdbc7fdddcecb403880

Authored by ths
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 254 #define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
255 255 #elif defined(__s390__)
256 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 258 #elif defined(__alpha__)
259 259 #define EXIT_TB() asm volatile ("ret")
260 260 #elif defined(__ia64__)
... ...
exec-all.h
... ... @@ -340,6 +340,24 @@ do {\
340 340 "1:\n");\
341 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 361 #else
344 362  
345 363 /* jump to next block operations (more portable code, does not need
... ...