home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Headers / kernserv / kern_server_types.h < prev    next >
Text File  |  1993-10-19  |  7KB  |  225 lines

  1. /* 
  2.  * Copyright (c) 1989 NeXT, Inc.
  3.  *
  4.  * HISTORY
  5.  * 8-Jun-92  Matthew Self (mself) at NeXT
  6.  *    Added mach_header field to kern_server_var_t for Objective-C.
  7.  *
  8.  * 12-Jul-90  Gregg Kellogg (gk) at NeXT
  9.  *    Changed msgs to msg, as only a single message is retained.
  10.  *    Added KS_VERSION(=2), which is updated whenever a protocol change
  11.  *    is made.
  12.  *
  13.  * 51-May-90  Gregg Kellogg (gk) at NeXT
  14.  *    Added pad filed at end of kern_server struct so that already compiled
  15.  *    servers won't be impacted when the kern_server grows.
  16.  *
  17.  * 04-Apr-89  Gregg Kellogg (gk) at NeXT
  18.  *    Created.
  19.  *
  20.  */
  21.  
  22. #ifndef    _KERN_SERVER_
  23. #define    _KERN_SERVER_
  24. #if    KERNEL
  25. #import <mach/mach_user_internal.h>
  26. #import <mach/mach_host_internal.h>
  27. #endif    KERNEL
  28. #import <mach/mach_interface.h>
  29. #import <mach/mach_host.h>
  30. #import <mach/message.h>
  31. #import <sys/types.h>
  32. #import <kernserv/queue.h>
  33. #import <kernserv/kern_server_reply_types.h>
  34.  
  35. /*
  36.  * Messages to be sent to the Mach bootstrap port.  The bootstrap port
  37.  * is inherited from the parent task and is used for finding information
  38.  * about the external and internal environment.
  39.  *
  40.  * Generic things that need to be done to get a kernel server started:
  41.  *    Wire down memory regions
  42.  *    Associate ports with procedures (to handle messages)
  43.  */
  44.  
  45. /*
  46.  * This must be small enough to fit (along with a message header) in 8K.
  47.  */
  48. #define    KERN_SERVER_LOG_SIZE    500
  49.  
  50. #define KERN_SERVER_ERROR    100        // bad message
  51. #define KERN_SERVER_NOTLOGGING    101        // server not logging data
  52. #define KERN_SERVER_UNCREC_PORT    102        // port not recognized
  53. #define KERN_SERVER_BAD_VERSION    103        // server version not supported
  54.  
  55. #define KERN_SERVER_NPORTPROC    50
  56.  
  57. typedef boolean_t (*port_map_proc_t) (
  58.     msg_header_t *in_msg,
  59.     void *arg);
  60.  
  61. typedef boolean_t (*port_map_serv_t) (
  62.     msg_header_t *in_msg,
  63.     msg_header_t *out_msg);
  64.  
  65. typedef boolean_t (*port_death_proc_t)(port_name_t port);
  66. typedef boolean_t (*port_notify_proc_t)(port_name_t port, u_int notify_type);
  67.  
  68. typedef int (*call_proc_t)(int arg);
  69.  
  70. typedef struct port_proc_map {
  71.     port_name_t    port;        // port -> proc mapping
  72.     port_map_proc_t    proc;        // proc to call
  73.     void *        uarg;
  74.     enum { PP_handler, PP_server }
  75.             type;        // proc interface type
  76. } port_proc_map_t;
  77.  
  78. typedef struct {
  79.     port_t        reply_port;
  80.     port_name_t    req_port;
  81.     queue_chain_t    link;
  82. } ks_notify_t;
  83.  
  84. #if    KERNEL
  85. /*
  86.  * Supported compatibility level.
  87.  */
  88. #define    KS_COMPAT    2
  89. #define    KS_VERSION    2
  90.  
  91. /*
  92.  * Server instance structure
  93.  */
  94. typedef struct kern_server_var {
  95.     simple_lock_data_t    slock;        // access synchronization
  96.     port_name_t        local_port;    // local_port of cur message
  97.     port_name_t        task_port;    // my task port
  98.     thread_t        server_thread;    // server thread.
  99.     port_name_t        bootstrap_port;    // my bootstrap port
  100.     port_name_t        boot_listener_port; // port we listen on
  101.     port_name_t        log_port;    // port to send log info to
  102.     port_name_t        notify_port;    // notification port.
  103.     port_set_name_t        port_set;    // port set we receive on
  104.     log_t            log;        // log structure
  105.     queue_head_t        msg_callout_q;    // queue of messages to send
  106.     queue_head_t        msg_callout_fq;    // free queue
  107.     msg_header_t        *msg;        // msg we receive into
  108.     int            msg_size;    // size of msg.
  109.     struct msg_send_entry {
  110.         void        (*func)();
  111.         void *        arg;
  112.         queue_chain_t    link;
  113.     } msg_send_array[20];
  114.     port_proc_map_t        port_proc[KERN_SERVER_NPORTPROC];
  115.     port_name_t        last_unrec_port;// last bad kern_serv_disp()
  116.     port_name_t        last_rec_port;    // last good kern_serv_disp()
  117.     int            last_rec_index;    // index of last good k_s_d()
  118.     port_death_proc_t    pd_proc;    // port death procedure
  119.     port_notify_proc_t    pn_proc;    // port notify procedure
  120.     queue_head_t        notify_q;    // queue of notify/req pairs.
  121.     int            version;    // version of server.
  122.     port_t            kernel_port;    // kernel task port for server
  123.     struct mach_header    *mach_header;    // mach_header of server module
  124. } kern_server_var_t;
  125.  
  126. typedef kern_server_var_t *kern_server_t;
  127.  
  128. /*
  129.  * Structure access functions.
  130.  */
  131. port_t kern_serv_local_port(kern_server_t *ksp);
  132. port_t kern_serv_bootstrap_port(kern_server_t *ksp);
  133. port_t kern_serv_notify_port(kern_server_t *ksp);
  134. port_set_name_t kern_serv_port_set(kern_server_t *ksp);
  135.  
  136. /*
  137.  * Function prototypes.
  138.  */
  139. void kern_server_main(void);
  140. void kern_serv_port_gone(kern_server_t *ksp, port_name_t port);
  141.  
  142. /*
  143.  * Log functions.
  144.  */
  145. void kern_serv_log (            // log a message
  146.     kern_server_t    *ksp,        // kern_server instance vars
  147.     int        log_level,    // level to log at
  148.     char        *msg,        // what to log (followed by args)
  149.     int        arg1,
  150.     int        arg2,
  151.     int        arg3,
  152.     int        arg4,
  153.     int        arg5);
  154.  
  155. /*
  156.  * Alias for msg_send to ensure that messages are sent at ipl0 from the proper
  157.  * task.
  158.  */
  159. kern_return_t kern_serv_callout (
  160.     kern_server_t    *ksp,
  161.     void        (*proc)(void *arg),
  162.     void        *arg);
  163.  
  164. /*
  165.  * Kernel version of kern_serv_notify, doesn't contact kern_loader, uses
  166.  * internal port_request_notification facility.
  167.  */
  168. kern_return_t kern_serv_notify (
  169.     kern_server_t    *ksp,
  170.     port_t        reply_port,
  171.     port_t        req_port);
  172.  
  173. /*
  174.  * Kernel reference for kern_serv interface routines.
  175.  */
  176. kern_return_t kern_serv_instance_loc (
  177.     void        *arg,        // (kern_server_t *ksp)
  178.     vm_address_t    instance_loc);
  179. kern_return_t kern_serv_boot_port (    // how to talk to loader
  180.     void        *arg,        // (kern_server_t *ksp)
  181.     port_t        boot_port);
  182. kern_return_t kern_serv_version (
  183.     void        *arg,        // (kern_server_t *ksp)
  184.     int        version);    // server version
  185. kern_return_t kern_serv_load_objc (
  186.     void        *arg,        // (kern_server_t *ksp)
  187.     vm_address_t    header);    // header addr
  188. kern_return_t kern_serv_wire_range (    // wire the specified range or memory
  189.     void        *arg,        // (kern_server_t *ksp)
  190.     vm_address_t    addr,
  191.     vm_size_t    size);
  192. kern_return_t kern_serv_unwire_range (    // unwire the specified range or memory
  193.     void        *arg,        // (kern_server_t *ksp)
  194.     vm_address_t    addr,
  195.     vm_size_t    size);
  196. kern_return_t kern_serv_port_proc (    // map a message on port to proc/arg
  197.     void        *arg,        // (kern_server_t *ksp)
  198.     port_all_t    port,        // port to map (all rights passed)
  199.     port_map_proc_t    proc,        // proc to call
  200.     int        uarg);        // replace local_port with uarg
  201. kern_return_t kern_serv_port_death_proc ( // specify port death handler
  202.     void            *arg,    // (kern_server_t *ksp)
  203.     port_death_proc_t    proc);    // proc to call
  204. kern_return_t kern_serv_call_proc (    // call procedure with argument
  205.     void        *arg,        // (kern_server_t *ksp)
  206.     call_proc_t    proc,        // proc to call
  207.     int        uarg);        // arg to supply
  208. kern_return_t kern_serv_shutdown (
  209.     void        *arg);        // (kern_server_t *ksp)
  210. kern_return_t kern_serv_log_level (
  211.     void        *arg,        // (kern_server_t *ksp)
  212.     int        log_level);
  213. kern_return_t kern_serv_get_log (
  214.     void        *arg,        // (kern_server_t *ksp)
  215.     port_t        reply_port);    // port to send log information to
  216. kern_return_t kern_serv_port_serv (    // map a message on port to proc/arg
  217.     void        *arg,        // (kern_server_t *ksp)
  218.     port_all_t    port,        // port to map (all rights passed)
  219.     port_map_proc_t    proc,        // proc to call
  220.     int        uarg);        // replace local_port with uarg
  221. port_t kern_serv_kernel_task_port(void);    // kernel port (for vm ops).
  222.  
  223. #endif    KERNEL
  224. #endif    _KERN_SERVER_
  225.