diff options
Diffstat (limited to 'debian/patches/0008-boot-implement-pseudo-time-device.patch')
-rw-r--r-- | debian/patches/0008-boot-implement-pseudo-time-device.patch | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/debian/patches/0008-boot-implement-pseudo-time-device.patch b/debian/patches/0008-boot-implement-pseudo-time-device.patch new file mode 100644 index 00000000..c690b674 --- /dev/null +++ b/debian/patches/0008-boot-implement-pseudo-time-device.patch @@ -0,0 +1,87 @@ +From 15e19afadfc8103f82682265bbbcae00c42b3674 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Fri, 7 Nov 2014 00:27:03 +0100 +Subject: [PATCH hurd 08/14] boot: implement pseudo-time device + +* 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'. +--- + 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 + |