[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Change i386 RPC subsystem to include descriptor instead of real_
From: |
Flavio Cruz |
Subject: |
[PATCH] Change i386 RPC subsystem to include descriptor instead of real_descriptor |
Date: |
Fri, 27 Jan 2023 01:41:02 -0500 |
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`.
---
i386/i386/seg.h | 32 ++++++++++++++++++-
i386/i386/user_ldt.c | 18 ++++++-----
i386/include/mach/i386/mach_i386.defs | 11 +++----
i386/include/mach/i386/mach_i386_types.h | 40 +++---------------------
4 files changed, 50 insertions(+), 51 deletions(-)
diff --git a/i386/i386/seg.h b/i386/i386/seg.h
index 74853718..1177fdd9 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.
@@ -117,6 +116,37 @@ struct real_gate {
#include <mach/inline.h>
#include <mach/xen.h>
+/*
+ * 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
/* Format of a "pseudo-descriptor", used for loading the IDT and GDT. */
struct pseudo_descriptor
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__ */
--
2.39.0
- [PATCH] Change i386 RPC subsystem to include descriptor instead of real_descriptor,
Flavio Cruz <=