home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume25 / trash / part01 / process.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-22  |  3.6 KB  |  180 lines

  1. #define    DEFAULT_TEXT_MIN    ((unsigned long)0x00400000)
  2. #define    DEFAULT_DATA_MIN    ((unsigned long)0x10000000)
  3.  
  4. #define    STACK_MAX        ((unsigned long)0x7FFFFFFF)
  5. #define    STACK_WMAX        (STACK_MAX + 1 - sizeof(unsigned long))
  6.  
  7. /*
  8.  * Arbitrary...
  9.  */
  10. #define    STACK_MIN        ((STACK_MAX + 1) / 2)
  11. #define    DATA_MAX        (STACK_MIN - 1)
  12.  
  13. typedef struct process        process;
  14. struct process
  15. {
  16.     char            *p_adotout;
  17.     unsigned long        p_entry_point;
  18.     int            p_pid;
  19.     unsigned long        p_state[R_MAX];
  20.     symtab            p_symtab;
  21.  
  22.     /*
  23.      * Text space.
  24.      *
  25.      * p_text_region_limit =
  26.      *    p->p_text_region_min + p_text_region_size - 1;
  27.      */
  28.     unsigned char        *p_text_region;
  29.     unsigned long        p_text_region_min;
  30.     unsigned long        p_text_region_limit;
  31.     unsigned long        p_text_region_wlimit;
  32.     int            p_text_region_is_readonly;
  33.  
  34.     /*
  35.      * Data space.
  36.      *
  37.      * p_data_region_limit =
  38.      *    p_data_region_min + p_data_region_size - 1;
  39.      * ((p_data_region_limit + sizeof(unsigned char)) is
  40.      * also known as The Break.)
  41.      *
  42.      * p_writable_data >= p_data_region_min
  43.      *    &&
  44.      * p_writable_data <= DATA_MAX
  45.      */
  46.     unsigned char        *p_data_region;
  47.     unsigned long        p_data_region_min;
  48.     unsigned long        p_data_region_limit;
  49.     unsigned long        p_data_region_wlimit;
  50.     unsigned long        p_writable_data;
  51.  
  52.     /*
  53.      * Stack space.
  54.      *
  55.      * p_stack_region_min =
  56.      *    STACK_MAX + 1 - p_stack_region_size;
  57.      */
  58.     unsigned char        *p_stack_region;
  59.     unsigned long        p_stack_region_min;
  60. };
  61.  
  62. #define    check_word_align(dipc,i) \
  63. { \
  64.     if ((i) & 0x3) \
  65.     { \
  66.         GLOBALdipc = dipc; \
  67.         vcouldnot("access memory at non word-aligned address 0x%x", (i)); \
  68.     } \
  69. }
  70.  
  71. #define    check_halfword_align(dipc,i) \
  72. { \
  73.     if ((i) & 0x1) \
  74.     { \
  75.         GLOBALdipc = dipc; \
  76.         vcouldnot("access memory at non halfword-aligned address 0x%x", (i)); \
  77.     } \
  78. }
  79.  
  80. #define    do_known_delayed_branch \
  81. { \
  82.     dinstrn    *bdslot_dipc; \
  83.  \
  84.     bdslot_dipc = (dinstrn *)dipc->di_2; \
  85.  \
  86.     (void)(*bdslot_dipc->di_handler)(bdslot_dipc); \
  87.  \
  88.     dipc = (dinstrn *)dipc->di_3; \
  89. }
  90.  
  91. #define    do_unknown_delayed_branch \
  92. { \
  93.     dinstrn    *bdslot_dipc; \
  94.  \
  95.     bdslot_dipc = (dinstrn *)dipc->di_1; \
  96.  \
  97.     (void)(*bdslot_dipc->di_handler)(bdslot_dipc); \
  98.  \
  99.     if (sigs_pending > 0) \
  100.         dipc = deliver_signal(addr_to_decoded_instrnp(dipc, *dipc->di_0)); \
  101.     else \
  102.         dipc = addr_to_decoded_instrnp(dipc, *dipc->di_0) - 1; \
  103. }
  104.  
  105. #define    do_known_delayed_upbranch \
  106. { \
  107.     do_known_delayed_branch; \
  108.  \
  109.     if (sigs_pending > 0) \
  110.         dipc = deliver_signal(dipc + 1); \
  111. }
  112.  
  113. #define    procsput(regi,value) \
  114. { \
  115.     if (Rflag) \
  116.         procsput_trace(regi, value); \
  117.  \
  118.     switch (regi) \
  119.     { \
  120.     case R_0: \
  121.         /* \
  122.          * Register 0 is special. \
  123.          */ \
  124.         break; \
  125.  \
  126.     case R_K0: \
  127.     case R_K1: \
  128.         if (give_warnings) \
  129.             warning("write to kernel-reserved register %s", say_register(regi)); \
  130.         /* fall thru. */ \
  131.     default: \
  132.         P.p_state[regi] = value; \
  133.         break; \
  134.     } \
  135. }
  136.  
  137. #define    procsget(regi,r) \
  138. { \
  139.     switch (regi) \
  140.     { \
  141.     case R_K0: \
  142.     case R_K1: \
  143.         if (give_warnings) \
  144.             procsget_warning(regi); \
  145.         /* fall thru. */ \
  146.     default: \
  147.         r = P.p_state[regi]; \
  148.         break; \
  149.     } \
  150.  \
  151.     if (Rflag) \
  152.         procsget_trace(regi, r); \
  153. }
  154.  
  155. extern char            *malloc();
  156. extern char            *calloc();
  157. extern char            *realloc();
  158.  
  159. extern int            procopen();
  160. extern void            procsget_trace();
  161. extern void            procsput_trace();
  162. extern void            procsget_warning();
  163. extern void            procmget_trace();
  164. extern int            quiet_procmget();
  165. extern int            quiet_procmput();
  166. extern int            quiet_procsget();
  167. extern int            quiet_procsput();
  168. extern int            quiet_procbreakget();
  169. extern int            quiet_procbreakput();
  170. extern char            *proc_text_address();
  171. extern int            proc_grow_stack();
  172. extern int            proc_mem_contiguous();
  173.  
  174. extern int            Mflag;
  175. extern int            Rflag;
  176.  
  177. extern process            P;
  178. extern int            give_warnings;
  179. extern int            sigs_pending;
  180.