|
|
1.1.1.2 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:
1.1.1.3 ! root 19: #if defined _MSC_VER && !defined( _WIN32_WCE )
! 20: #define CAN_DO_STACK_MAGIC
! 21: #endif
! 22:
! 23: #if defined __GNUC__ && defined CAN_DO_STACK_MAGIC
1.1.1.2 root 24: static inline void transfer_control(void *, int, void *, void *, int) __attribute__((noreturn));
25: static inline void transfer_control(void *s, int size, void *pc, void *f, int has_retval)
26: {
27: unsigned long *stacktop = (unsigned long *)((char *)s + size - 20);
28: stacktop[0] = 0xC0DEDBAD; /* return address */
29: stacktop[1] = (int)s; /* function arg 1: stack */
30: stacktop[2] = (int)f; /* function arg 2: trap function */
31: stacktop[3] = (int)stacktop; /* function arg 3: return value address */
32: stacktop[4] = has_retval;
33: __asm__ __volatile__ ("movl %0,%%esp\n\tpushl %1\n\tret\n" : : "r" (stacktop), "r" (pc) : "memory");
34: /* Not reached. */
35: abort();
36: }
37:
38: static inline uae_u32 get_retval_from_stack (void *s, int size)
39: {
40: return *(uae_u32 *)((char *)s + size - 20);
41: }
42:
43: static inline int stack_has_retval (void *s, int size)
44: {
45: return *(int *)((char *)s + size - 4);
46: }
47: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.