From c1d219c066a5fbf6a6a4c3139f64954dbf12fd02 Mon Sep 17 00:00:00 2001 From: Flavio Cruz Date: Wed, 10 May 2023 01:00:45 -0400 Subject: Only use host_get_kernel_version and default_pager_paging_storage_new in x86_64. Also fixed the implementation of default_pager_paging_storage_new in proxy def pager to call into default_pager_paging_storage_new. We can fast track the simplification of the RPC ABI for x86_64 if we don't have MACH_MSG_TYPE_STRING used in RPCs which forces msgt_size to use more than 8 bits. Message-Id: --- hurd/default_pager.defs | 4 ++++ mach-defpager/setup.c | 10 ++++++---- proc/host.c | 3 +++ sutils/swapon.c | 3 +++ trans/proxy-defpager.c | 30 +++++++++++++++++++++++------- 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/hurd/default_pager.defs b/hurd/default_pager.defs index 3ca34fc4..bb893d0a 100644 --- a/hurd/default_pager.defs +++ b/hurd/default_pager.defs @@ -69,6 +69,9 @@ skip; /* default_pager_paging_file */ skip; /* default_pager_register_fileserver */ +#ifdef __x86_64__ +skip; /* default_pager_paging_storage */ +#else /* Deprecated RPC to add or remove an area of paging storage. * Was superseded in favor of default_pager_paging_storage_new which * uses the correct type for default_pager_filename_t using c_string. @@ -80,6 +83,7 @@ routine default_pager_paging_storage( array[] of recnum_t; name : default_pager_filename_t; add : boolean_t); +#endif /* This call is made on a memory object returned by default_pager_object_create to fix the object's maximum size. Any references to pages beyond the limit diff --git a/mach-defpager/setup.c b/mach-defpager/setup.c index b09642e3..e928dcc2 100644 --- a/mach-defpager/setup.c +++ b/mach-defpager/setup.c @@ -40,7 +40,7 @@ int page_aligned (vm_offset_t num) extern mach_port_t default_pager_default_port; /* default_pager.c */ kern_return_t -S_default_pager_paging_storage (mach_port_t pager, +S_default_pager_paging_storage_new (mach_port_t pager, mach_port_t device, const recnum_t *runs, mach_msg_type_number_t nrun, const_default_pager_filename_t name, @@ -100,16 +100,18 @@ S_default_pager_paging_storage (mach_port_t pager, return 0; } +#ifndef __x86_64__ kern_return_t -S_default_pager_paging_storage_new (mach_port_t pager, +S_default_pager_paging_storage (mach_port_t pager, mach_port_t device, const recnum_t *runs, mach_msg_type_number_t nrun, const_default_pager_filename_t name, boolean_t add) { - return S_default_pager_paging_storage (pager, - device, runs, nrun, name, add); + return S_default_pager_paging_storage_new (pager, device, runs, nrun, name, + add); } +#endif /* Called to read a page from backing store. */ int diff --git a/proc/host.c b/proc/host.c index e9f36f51..e2942f8e 100644 --- a/proc/host.c +++ b/proc/host.c @@ -364,11 +364,14 @@ initialize_version_info (void) server_versions_nalloc = 10; err = host_get_kernel_version (mach_host_self (), kv); +#ifndef __x86_64__ + /* We don't support host_kernel_version for x86_64. */ if (err == MIG_BAD_ID) { /* Delete after some time. */ err = host_kernel_version (mach_host_self (), kv); } +#endif assert_backtrace (! err); /* Make sure the result is null-terminated, as the kernel doesn't guarantee it. */ diff --git a/sutils/swapon.c b/sutils/swapon.c index 30e2e2d6..6e3d64a4 100644 --- a/sutils/swapon.c +++ b/sutils/swapon.c @@ -411,11 +411,14 @@ swaponoff (const char *file, int add, int skipnotexisting) } err = default_pager_paging_storage_new (def_pager, store->port, runs, j, file, add); +#ifndef __x86_64__ + /* We don't support default_pager_paging_storage in 64 bits. */ if (err == MIG_BAD_ID || err == EOPNOTSUPP) { err = default_pager_paging_storage (def_pager, store->port, runs, j, file, add); } +#endif store_free (store); diff --git a/trans/proxy-defpager.c b/trans/proxy-defpager.c index 5d952546..e44db152 100644 --- a/trans/proxy-defpager.c +++ b/trans/proxy-defpager.c @@ -100,28 +100,44 @@ S_default_pager_object_pages (mach_port_t default_pager, } kern_return_t -S_default_pager_paging_storage (mach_port_t default_pager, +S_default_pager_paging_storage_new (mach_port_t default_pager, mach_port_t device, const recnum_t *runs, mach_msg_type_number_t nruns, const_default_pager_filename_t name, boolean_t add) { - return allowed (default_pager, O_WRITE) - ?: default_pager_paging_storage (real_defpager, dev_master, - runs, nruns, name, add) - ?: mach_port_deallocate (mach_task_self (), device); + error_t err = allowed (default_pager, O_WRITE); + if (err) + return err; + + err = default_pager_paging_storage_new (real_defpager, dev_master, + runs, nruns, name, add); +#ifndef __x86_64__ + if (err == MIG_BAD_ID || err == EOPNOTSUPP) + { + err = default_pager_paging_storage (real_defpager, dev_master, + runs, nruns, name, add); + } +#endif + + if (err) + return err; + + mach_port_deallocate (mach_task_self (), device); } +#ifndef __x86_64__ kern_return_t -S_default_pager_paging_storage_new (mach_port_t default_pager, +S_default_pager_paging_storage (mach_port_t default_pager, mach_port_t device, const recnum_t *runs, mach_msg_type_number_t nruns, const_default_pager_filename_t name, boolean_t add) { - return S_default_pager_paging_storage (default_pager, + return S_default_pager_paging_storage_new (default_pager, device, runs, nruns, name, add); } +#endif kern_return_t S_default_pager_object_set_size (mach_port_t memory_object, -- cgit v1.2.3