|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * Stack magic definitions for autoconf.c ! 5: * ! 6: * Copyright 1997 Bernd Schmidt ! 7: */ ! 8: ! 9: #include <setjmp.h> ! 10: ! 11: #undef CAN_DO_STACK_MAGIC ! 12: ! 13: #if defined __GNUC__ && defined __GNUC_MINOR__ ! 14: #if defined __i386__ && (__GNUC__ > 2 || __GNUC_MINOR__ >= 7) ! 15: #define CAN_DO_STACK_MAGIC ! 16: #endif ! 17: #endif ! 18: ! 19: #ifdef CAN_DO_STACK_MAGIC ! 20: static inline void transfer_control(void *, int, void *, void *, int) __attribute__((noreturn)); ! 21: static inline void transfer_control(void *s, int size, void *pc, void *f, int has_retval) ! 22: { ! 23: unsigned long *stacktop = (unsigned long *)((char *)s + size - 20); ! 24: stacktop[0] = 0xC0DEDBAD; /* return address */ ! 25: stacktop[1] = (int)s; /* function arg 1: stack */ ! 26: stacktop[2] = (int)f; /* function arg 2: trap function */ ! 27: stacktop[3] = (int)stacktop; /* function arg 3: return value address */ ! 28: stacktop[4] = has_retval; ! 29: __asm__ __volatile__ ("movl %0,%%esp\n\tpushl %1\n\tret\n" : : "r" (stacktop), "r" (pc) : "memory"); ! 30: /* Not reached. */ ! 31: abort(); ! 32: } ! 33: ! 34: static inline uae_u32 get_retval_from_stack (void *s, int size) ! 35: { ! 36: return *(uae_u32 *)((char *)s + size - 20); ! 37: } ! 38: ! 39: static inline int stack_has_retval (void *s, int size) ! 40: { ! 41: return *(int *)((char *)s + size - 4); ! 42: } ! 43: ! 44: #define USE_EXECLIB ! 45: ! 46: #else ! 47: ! 48: #endif ! 49:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.