Annotation of uae/src/od-linux/exectasks.h, revision 1.1

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: 

unix.superglobalmegacorp.com

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