sigCtxLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:3k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sigCtxLib.c - software signal architecture support library */
  2. /* Copyright 1984-1993 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01a,15jun93,hdn  written based on mc68k version.
  8. */
  9. /*
  10. This library provides the architecture specific support needed by
  11. software signals.
  12. */
  13. #include "vxWorks.h"
  14. #include "private/sigLibP.h"
  15. #include "string.h"
  16. struct sigfaulttable _sigfaulttable [] =
  17.     {
  18.     {0,  SIGILL},
  19.     {1,  SIGEMT},
  20.     {2,  SIGILL},
  21.     {3,  SIGEMT},
  22.     {4,  SIGILL},
  23.     {5,  SIGILL},
  24.     {6,  SIGILL},
  25.     {7,  SIGFPE},
  26.     {8,  SIGILL},
  27.     {9,  SIGFPE},
  28.     {10, SIGILL},
  29.     {11, SIGBUS},
  30.     {12, SIGBUS},
  31.     {13, SIGILL},
  32.     {14, SIGBUS},
  33.     {15, SIGILL},
  34.     {16, SIGFPE},
  35.     {17, SIGBUS},
  36.     {0,  0},
  37.     };
  38. /*******************************************************************************
  39. *
  40. * _sigCtxRtnValSet - set the return value of a context
  41. *
  42. * Set the return value of a context.
  43. * This routine should be almost the same as taskRtnValueSet in taskArchLib.c
  44. */
  45. void _sigCtxRtnValSet
  46.     (
  47.     REG_SET *pRegs,
  48.     int val
  49.     )
  50.     {
  51.     pRegs->eax = val;
  52.     }
  53. /*******************************************************************************
  54. *
  55. * _sigCtxStackEnd - get the end of the stack for a context
  56. *
  57. * Get the end of the stack for a context, the context will not be running.
  58. * If during a context switch, stuff is pushed onto the stack, room must
  59. * be left for that (on the 386 the pc, cs, and eflags are pushed just before
  60. * a ctx switch)
  61. */
  62. void *_sigCtxStackEnd
  63.     (
  64.     const REG_SET *pRegs
  65.     )
  66.     {
  67.     /*
  68.      * The 12 is pad for the pc, cs, and eflags which are pushed onto the stack.
  69.      */
  70.     return (void *)(pRegs->esp - 12);
  71.     }
  72. /*******************************************************************************
  73. *
  74. * _sigCtxSetup - Setup of a context
  75. *
  76. * This routine will set up a context that can be context switched in.
  77. * <pStackBase> points beyond the end of the stack. The first element of
  78. * <pArgs> is the number of args to call <taskEntry> with.
  79. * When the task gets swapped in, it should start as if called like
  80. *
  81. * (*taskEntry) (pArgs[1], pArgs[2], ..., pArgs[pArgs[0]])
  82. *
  83. * This routine is a blend of taskRegsInit and taskArgsSet.
  84. *
  85. * Currently (for signals) pArgs[0] always equals 1, thus the task should
  86. * start as if called like
  87. * (*taskEntry) (pArgs[1]);
  88. *
  89. * Furthermore (for signals), the function taskEntry will never return.
  90. * For the 386 case, we push vxTaskEntry() onto the stack so a stacktrace
  91. * looks good.
  92. */
  93. void _sigCtxSetup
  94.     (
  95.     REG_SET *pRegs,
  96.     void *pStackBase,
  97.     void (*taskEntry)(),
  98.     int *pArgs
  99.     )
  100.     {
  101.     extern void vxTaskEntry();
  102.     int i;
  103.     union
  104. {
  105. void *pv;
  106. int *pi;
  107. void (**ppfv)();
  108. int i;
  109. } pu;
  110.     bzero((void *)pRegs, sizeof(*pRegs));
  111.     pu.pv = (void *)((int)pStackBase & ~3);
  112.     for (i = pArgs[0]; i > 0; --i)
  113.         *--pu.pi = pArgs[i];
  114.     *--pu.ppfv = vxTaskEntry;
  115.     pRegs->esp = pu.i;
  116.     pRegs->pc = (INSTR *)taskEntry;
  117.     pRegs->eflags = EFLAGS_BRANDNEW;
  118.     }