diff options
author | Flavio Cruz <flaviocruz@gmail.com> | 2023-01-27 01:41:02 -0500 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2023-01-27 08:55:38 +0100 |
commit | e6fec85fbd4ef5b54353c4b4eda2b4f2b5484a26 (patch) | |
tree | 7fd5fe86c75c8f538e3cf1fcff416b06be21ab91 | |
parent | 248d0c7a784f33c7a682cee038ebcaf33af7cb36 (diff) | |
download | gnumach-e6fec85fbd4ef5b54353c4b4eda2b4f2b5484a26.tar.gz gnumach-e6fec85fbd4ef5b54353c4b4eda2b4f2b5484a26.tar.bz2 gnumach-e6fec85fbd4ef5b54353c4b4eda2b4f2b5484a26.zip |
Change i386 RPC subsystem to include descriptor instead of real_descriptor
This should avoid issues with glibc and hurd as introduced in
https://git.savannah.gnu.org/cgit/hurd/gnumach.git/commit/?id=b379d5afdf65cce11426ab0349a3778b3fd632f5
since we are changing the types of the parameters when implementing the RPCs to match the previous
declaration using `struct descriptor`.
Message-Id: <Y9Nx/qCRtVruxGwb@jupiter.tail36e24.ts.net>
-rw-r--r-- | i386/i386/seg.h | 33 | ||||
-rw-r--r-- | i386/i386/user_ldt.c | 18 | ||||
-rw-r--r-- | i386/include/mach/i386/mach_i386.defs | 11 | ||||
-rw-r--r-- | i386/include/mach/i386/mach_i386_types.h | 40 |
4 files changed, 51 insertions, 51 deletions
diff --git a/i386/i386/seg.h b/i386/i386/seg.h index 74853718..71c05e49 100644 --- a/i386/i386/seg.h +++ b/i386/i386/seg.h @@ -32,7 +32,6 @@ #define _I386_SEG_H_ #include <mach/inline.h> -#include <mach/machine/mach_i386_types.h> /* * i386 segmentation. @@ -47,6 +46,38 @@ #ifndef __ASSEMBLER__ +/* + * Real segment descriptor. + */ +struct real_descriptor { + unsigned int limit_low:16, /* limit 0..15 */ + base_low:16, /* base 0..15 */ + base_med:8, /* base 16..23 */ + access:8, /* access byte */ + limit_high:4, /* limit 16..19 */ + granularity:4, /* granularity */ + base_high:8; /* base 24..31 */ +}; +typedef struct real_descriptor real_descriptor_t; +typedef real_descriptor_t *real_descriptor_list_t; +typedef const real_descriptor_list_t const_real_descriptor_list_t; + +#ifdef __x86_64__ +struct real_descriptor64 { + unsigned int limit_low:16, /* limit 0..15 */ + base_low:16, /* base 0..15 */ + base_med:8, /* base 16..23 */ + access:8, /* access byte */ + limit_high:4, /* limit 16..19 */ + granularity:4, /* granularity */ + base_high:8, /* base 24..31 */ + base_ext:32, /* base 32..63 */ + reserved1:8, + zero:5, + reserved2:19; +}; +#endif + struct real_gate { unsigned int offset_low:16, /* offset 0..15 */ selector:16, diff --git a/i386/i386/user_ldt.c b/i386/i386/user_ldt.c index 858da681..4c89bd44 100644 --- a/i386/i386/user_ldt.c +++ b/i386/i386/user_ldt.c @@ -52,10 +52,11 @@ kern_return_t i386_set_ldt( thread_t thread, int first_selector, - struct real_descriptor *desc_list, + const struct descriptor *descriptor_list, unsigned int count, boolean_t desc_list_inline) { + struct real_descriptor* desc_list = (struct real_descriptor *)descriptor_list; user_ldt_t new_ldt, old_ldt, temp; struct real_descriptor *dp; unsigned i; @@ -257,10 +258,11 @@ kern_return_t i386_get_ldt(const thread_t thread, int first_selector, int selector_count, /* number wanted */ - struct real_descriptor **desc_list, /* in/out */ + struct descriptor **descriptor_list, /* in/out */ unsigned int *count /* in/out */ ) { + struct real_descriptor** desc_list = (struct real_descriptor **)descriptor_list; struct user_ldt *user_ldt; pcb_t pcb; int first_desc = sel_idx(first_selector); @@ -386,8 +388,9 @@ user_ldt_free(user_ldt_t user_ldt) kern_return_t -i386_set_gdt (thread_t thread, int *selector, struct real_descriptor desc) +i386_set_gdt (thread_t thread, int *selector, struct descriptor descriptor) { + const struct real_descriptor *desc = (struct real_descriptor *)&descriptor; int idx; if (thread == THREAD_NULL) @@ -411,14 +414,14 @@ i386_set_gdt (thread_t thread, int *selector, struct real_descriptor desc) else idx = sel_idx (*selector) - sel_idx(USER_GDT); - if ((desc.access & ACC_P) == 0) + if ((desc->access & ACC_P) == 0) memset (&thread->pcb->ims.user_gdt[idx], 0, sizeof thread->pcb->ims.user_gdt[idx]); - else if ((desc.access & (ACC_TYPE_USER|ACC_PL)) != (ACC_TYPE_USER|ACC_PL_U) || (desc.granularity & SZ_64)) + else if ((desc->access & (ACC_TYPE_USER|ACC_PL)) != (ACC_TYPE_USER|ACC_PL_U) || (desc->granularity & SZ_64)) return KERN_INVALID_ARGUMENT; else - thread->pcb->ims.user_gdt[idx] = desc; + memcpy (&thread->pcb->ims.user_gdt[idx], desc, sizeof (struct descriptor)); /* * If we are modifying the GDT for the current thread, @@ -431,8 +434,9 @@ i386_set_gdt (thread_t thread, int *selector, struct real_descriptor desc) } kern_return_t -i386_get_gdt (const thread_t thread, int selector, struct real_descriptor *desc) +i386_get_gdt (const thread_t thread, int selector, struct descriptor *descriptor) { + struct real_descriptor *desc = (struct real_descriptor *)descriptor; if (thread == THREAD_NULL) return KERN_INVALID_ARGUMENT; diff --git a/i386/include/mach/i386/mach_i386.defs b/i386/include/mach/i386/mach_i386.defs index 4694522b..965d5c3b 100644 --- a/i386/include/mach/i386/mach_i386.defs +++ b/i386/include/mach/i386/mach_i386.defs @@ -43,9 +43,6 @@ MACH_I386_IMPORTS type descriptor_t = struct[2] of uint32_t; type descriptor_list_t = array[*] of descriptor_t; -type real_descriptor_t = descriptor_t; -type real_descriptor_list_t = array[*] of real_descriptor_t; - import <mach/machine/mach_i386_types.h>; #if KERNEL_SERVER @@ -69,13 +66,13 @@ skip; /* i386_io_port_list */ routine i386_set_ldt( target_thread : thread_t; first_selector : int; - desc_list : real_descriptor_list_t, serverCopy); + desc_list : descriptor_list_t, serverCopy); routine i386_get_ldt( target_thread : thread_t; first_selector : int; selector_count : int; - out desc_list : real_descriptor_list_t); + out desc_list : descriptor_list_t); /* Request a new port IO_PERM that represents the capability to access the I/O ports [FROM; TO] directly. MASTER_PORT is the master device port. @@ -107,10 +104,10 @@ routine i386_io_perm_modify( routine i386_set_gdt( target_thread : thread_t; inout selector : int; - desc : real_descriptor_t); + desc : descriptor_t); /* Fetch a segment descriptor set with a prior i386_set_gdt call. */ routine i386_get_gdt( target_thread : thread_t; selector : int; - out desc : real_descriptor_t); + out desc : descriptor_t); diff --git a/i386/include/mach/i386/mach_i386_types.h b/i386/include/mach/i386/mach_i386_types.h index bfa91ca0..f5177fb5 100644 --- a/i386/include/mach/i386/mach_i386_types.h +++ b/i386/include/mach/i386/mach_i386_types.h @@ -34,46 +34,14 @@ /* * i386 segment descriptor. */ -struct segment_descriptor { +struct descriptor { unsigned int low_word; unsigned int high_word; }; -typedef struct segment_descriptor descriptor_t; -typedef struct segment_descriptor *descriptor_list_t; -typedef const struct descriptor *const_segment_descriptor_list_t; - -/* - * Real segment descriptor. - */ -struct real_descriptor { - unsigned int limit_low:16, /* limit 0..15 */ - base_low:16, /* base 0..15 */ - base_med:8, /* base 16..23 */ - access:8, /* access byte */ - limit_high:4, /* limit 16..19 */ - granularity:4, /* granularity */ - base_high:8; /* base 24..31 */ -}; -typedef struct real_descriptor real_descriptor_t; -typedef real_descriptor_t *real_descriptor_list_t; -typedef const real_descriptor_list_t const_real_descriptor_list_t; - -#ifdef __x86_64__ -struct real_descriptor64 { - unsigned int limit_low:16, /* limit 0..15 */ - base_low:16, /* base 0..15 */ - base_med:8, /* base 16..23 */ - access:8, /* access byte */ - limit_high:4, /* limit 16..19 */ - granularity:4, /* granularity */ - base_high:8, /* base 24..31 */ - base_ext:32, /* base 32..63 */ - reserved1:8, - zero:5, - reserved2:19; -}; -#endif +typedef struct descriptor descriptor_t; +typedef struct descriptor *descriptor_list_t; +typedef const struct descriptor *const_descriptor_list_t; #endif /* !__ASSEMBLER__ */ |