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 >
Wrap
Text File
|
1993-10-19
|
7KB
|
225 lines
/*
* Copyright (c) 1989 NeXT, Inc.
*
* HISTORY
* 8-Jun-92 Matthew Self (mself) at NeXT
* Added mach_header field to kern_server_var_t for Objective-C.
*
* 12-Jul-90 Gregg Kellogg (gk) at NeXT
* Changed msgs to msg, as only a single message is retained.
* Added KS_VERSION(=2), which is updated whenever a protocol change
* is made.
*
* 51-May-90 Gregg Kellogg (gk) at NeXT
* Added pad filed at end of kern_server struct so that already compiled
* servers won't be impacted when the kern_server grows.
*
* 04-Apr-89 Gregg Kellogg (gk) at NeXT
* Created.
*
*/
#ifndef _KERN_SERVER_
#define _KERN_SERVER_
#if KERNEL
#import <mach/mach_user_internal.h>
#import <mach/mach_host_internal.h>
#endif KERNEL
#import <mach/mach_interface.h>
#import <mach/mach_host.h>
#import <mach/message.h>
#import <sys/types.h>
#import <kernserv/queue.h>
#import <kernserv/kern_server_reply_types.h>
/*
* Messages to be sent to the Mach bootstrap port. The bootstrap port
* is inherited from the parent task and is used for finding information
* about the external and internal environment.
*
* Generic things that need to be done to get a kernel server started:
* Wire down memory regions
* Associate ports with procedures (to handle messages)
*/
/*
* This must be small enough to fit (along with a message header) in 8K.
*/
#define KERN_SERVER_LOG_SIZE 500
#define KERN_SERVER_ERROR 100 // bad message
#define KERN_SERVER_NOTLOGGING 101 // server not logging data
#define KERN_SERVER_UNCREC_PORT 102 // port not recognized
#define KERN_SERVER_BAD_VERSION 103 // server version not supported
#define KERN_SERVER_NPORTPROC 50
typedef boolean_t (*port_map_proc_t) (
msg_header_t *in_msg,
void *arg);
typedef boolean_t (*port_map_serv_t) (
msg_header_t *in_msg,
msg_header_t *out_msg);
typedef boolean_t (*port_death_proc_t)(port_name_t port);
typedef boolean_t (*port_notify_proc_t)(port_name_t port, u_int notify_type);
typedef int (*call_proc_t)(int arg);
typedef struct port_proc_map {
port_name_t port; // port -> proc mapping
port_map_proc_t proc; // proc to call
void * uarg;
enum { PP_handler, PP_server }
type; // proc interface type
} port_proc_map_t;
typedef struct {
port_t reply_port;
port_name_t req_port;
queue_chain_t link;
} ks_notify_t;
#if KERNEL
/*
* Supported compatibility level.
*/
#define KS_COMPAT 2
#define KS_VERSION 2
/*
* Server instance structure
*/
typedef struct kern_server_var {
simple_lock_data_t slock; // access synchronization
port_name_t local_port; // local_port of cur message
port_name_t task_port; // my task port
thread_t server_thread; // server thread.
port_name_t bootstrap_port; // my bootstrap port
port_name_t boot_listener_port; // port we listen on
port_name_t log_port; // port to send log info to
port_name_t notify_port; // notification port.
port_set_name_t port_set; // port set we receive on
log_t log; // log structure
queue_head_t msg_callout_q; // queue of messages to send
queue_head_t msg_callout_fq; // free queue
msg_header_t *msg; // msg we receive into
int msg_size; // size of msg.
struct msg_send_entry {
void (*func)();
void * arg;
queue_chain_t link;
} msg_send_array[20];
port_proc_map_t port_proc[KERN_SERVER_NPORTPROC];
port_name_t last_unrec_port;// last bad kern_serv_disp()
port_name_t last_rec_port; // last good kern_serv_disp()
int last_rec_index; // index of last good k_s_d()
port_death_proc_t pd_proc; // port death procedure
port_notify_proc_t pn_proc; // port notify procedure
queue_head_t notify_q; // queue of notify/req pairs.
int version; // version of server.
port_t kernel_port; // kernel task port for server
struct mach_header *mach_header; // mach_header of server module
} kern_server_var_t;
typedef kern_server_var_t *kern_server_t;
/*
* Structure access functions.
*/
port_t kern_serv_local_port(kern_server_t *ksp);
port_t kern_serv_bootstrap_port(kern_server_t *ksp);
port_t kern_serv_notify_port(kern_server_t *ksp);
port_set_name_t kern_serv_port_set(kern_server_t *ksp);
/*
* Function prototypes.
*/
void kern_server_main(void);
void kern_serv_port_gone(kern_server_t *ksp, port_name_t port);
/*
* Log functions.
*/
void kern_serv_log ( // log a message
kern_server_t *ksp, // kern_server instance vars
int log_level, // level to log at
char *msg, // what to log (followed by args)
int arg1,
int arg2,
int arg3,
int arg4,
int arg5);
/*
* Alias for msg_send to ensure that messages are sent at ipl0 from the proper
* task.
*/
kern_return_t kern_serv_callout (
kern_server_t *ksp,
void (*proc)(void *arg),
void *arg);
/*
* Kernel version of kern_serv_notify, doesn't contact kern_loader, uses
* internal port_request_notification facility.
*/
kern_return_t kern_serv_notify (
kern_server_t *ksp,
port_t reply_port,
port_t req_port);
/*
* Kernel reference for kern_serv interface routines.
*/
kern_return_t kern_serv_instance_loc (
void *arg, // (kern_server_t *ksp)
vm_address_t instance_loc);
kern_return_t kern_serv_boot_port ( // how to talk to loader
void *arg, // (kern_server_t *ksp)
port_t boot_port);
kern_return_t kern_serv_version (
void *arg, // (kern_server_t *ksp)
int version); // server version
kern_return_t kern_serv_load_objc (
void *arg, // (kern_server_t *ksp)
vm_address_t header); // header addr
kern_return_t kern_serv_wire_range ( // wire the specified range or memory
void *arg, // (kern_server_t *ksp)
vm_address_t addr,
vm_size_t size);
kern_return_t kern_serv_unwire_range ( // unwire the specified range or memory
void *arg, // (kern_server_t *ksp)
vm_address_t addr,
vm_size_t size);
kern_return_t kern_serv_port_proc ( // map a message on port to proc/arg
void *arg, // (kern_server_t *ksp)
port_all_t port, // port to map (all rights passed)
port_map_proc_t proc, // proc to call
int uarg); // replace local_port with uarg
kern_return_t kern_serv_port_death_proc ( // specify port death handler
void *arg, // (kern_server_t *ksp)
port_death_proc_t proc); // proc to call
kern_return_t kern_serv_call_proc ( // call procedure with argument
void *arg, // (kern_server_t *ksp)
call_proc_t proc, // proc to call
int uarg); // arg to supply
kern_return_t kern_serv_shutdown (
void *arg); // (kern_server_t *ksp)
kern_return_t kern_serv_log_level (
void *arg, // (kern_server_t *ksp)
int log_level);
kern_return_t kern_serv_get_log (
void *arg, // (kern_server_t *ksp)
port_t reply_port); // port to send log information to
kern_return_t kern_serv_port_serv ( // map a message on port to proc/arg
void *arg, // (kern_server_t *ksp)
port_all_t port, // port to map (all rights passed)
port_map_proc_t proc, // proc to call
int uarg); // replace local_port with uarg
port_t kern_serv_kernel_task_port(void); // kernel port (for vm ops).
#endif KERNEL
#endif _KERN_SERVER_