Justus Winter, le Fri 07 Nov 2014 17:32:01 +0100, a écrit : > * boot/boot.c (pseudo_time): New variable. > (main): Allocate port `pseudo_time'. > (ds_device_open): Give out `pseudo_time'. > (ds_device_map): Emulate Mach-style `Mapped Time'.
Ack. > --- > boot/boot.c | 38 +++++++++++++++++++++++++++++++++++--- > 1 file changed, 35 insertions(+), 3 deletions(-) > > diff --git a/boot/boot.c b/boot/boot.c > index d35ce50..747ab73 100644 > --- a/boot/boot.c > +++ b/boot/boot.c > @@ -112,7 +112,7 @@ typedef struct stat host_stat_t; > mach_port_t privileged_host_port, master_device_port; > mach_port_t pseudo_master_device_port; > mach_port_t receive_set; > -mach_port_t pseudo_console, pseudo_root; > +mach_port_t pseudo_console, pseudo_root, pseudo_time; > auth_t authserver; > > struct store *root_store; > @@ -534,6 +534,15 @@ main (int argc, char **argv, char **envp) > if (foo != MACH_PORT_NULL) > mach_port_deallocate (mach_task_self (), foo); > > + mach_port_allocate (mach_task_self (), MACH_PORT_RIGHT_RECEIVE, > + &pseudo_time); > + mach_port_move_member (mach_task_self (), pseudo_time, receive_set); > + mach_port_request_notification (mach_task_self (), pseudo_time, > + MACH_NOTIFY_NO_SENDERS, 1, pseudo_time, > + MACH_MSG_TYPE_MAKE_SEND_ONCE, &foo); > + if (foo != MACH_PORT_NULL) > + mach_port_deallocate (mach_task_self (), foo); > + > if (kernel_command_line == 0) > asprintf (&kernel_command_line, "%s %s root=%s", > argv[0], bootstrap_args, bootdevice); > @@ -894,6 +903,12 @@ ds_device_open (mach_port_t master_port, > *devicetype = MACH_MSG_TYPE_MAKE_SEND; > return 0; > } > + else if (!strcmp (name, "time")) > + { > + *device = pseudo_time; > + *devicetype = MACH_MSG_TYPE_MAKE_SEND; > + return 0; > + } > else if (strcmp (name, "pseudo-root") == 0) > /* Magic root device. */ > { > @@ -1125,9 +1140,26 @@ ds_device_map (device_t device, > memory_object_t *pager, > int unmap) > { > - if (device != pseudo_console && device != pseudo_root) > + if (device == pseudo_console || device == pseudo_root) > + return D_INVALID_OPERATION; > + else if (device == pseudo_time) > + { > + error_t err; > + mach_port_t wr_memobj; > + file_t node = file_name_lookup ("/dev/time", O_RDONLY, 0); > + > + if (node == MACH_PORT_NULL) > + return D_IO_ERROR; > + > + err = io_map (node, pager, &wr_memobj); > + if (!err && MACH_PORT_VALID (wr_memobj)) > + mach_port_deallocate (mach_task_self (), wr_memobj); > + > + mach_port_deallocate (mach_task_self (), node); > + return D_SUCCESS; > + } > + else > return D_NO_SUCH_DEVICE; > - return D_INVALID_OPERATION; > } > > kern_return_t > -- > 2.1.1 > -- Samuel * x remarque qu'avec un peu de volonté, on peut faire du code de porc dans d'importe quel langage Turing-complet -+- x sur #ens-mim - codons porc -+-