home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.0 / NeXTSTEP3.0.iso / NextDeveloper / Headers / kernserv / kern_server_types.h < prev    next >
Text File  |  1992-07-29  |  7KB  |  219 lines

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