Annotation of uae/src/od-win32/exectasks.h, revision 1.1.1.3

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.