Re: [PATCH] Change i386 RPC subsystem to include descriptor instead of real_descriptor

2023-01-26 Thread Samuel Thibault
Applied, thanks!

Flavio Cruz, le ven. 27 janv. 2023 01:41:02 -0500, a ecrit:
> 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 
> -#include 
>  
>  /*
>   * i386 segmentation.
> @@ -117,6 +116,37 @@ struct real_gate {
>  #include 
>  #include 
>  
> +/*
> + * Real segment descriptor.
> + */
> +struct real_descriptor {
> + unsigned intlimit_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 intlimit_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_tthread,
>   int first_selector,
> - struct real_descriptor  *desc_list,
> + const struct descriptor  *descriptor_list,
>   unsigned intcount,
>   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;
>   unsignedi;
> @@ -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_gd

Re: [PATCH] Add support for x86_64-*-gnu-* targets to build x86_64 gnumach/hurd

2023-01-26 Thread Flavio Cruz

Tested by building a toolchain and compiling gnumach for x86_64 [1].
This is the basic version without unwind support which I think is only
required to implement exceptions.

[1]
https://github.com/flavioc/cross-hurd/blob/master/bootstrap-kernel.sh.

gcc/ChangeLog:
* config.gcc: Recognize x86_64-*-gnu* targets and include
i386/gnu64.h.
* config/i386/gnu64.h: Define configuration for new target
including ld.so location.

libgcc/ChangeLog:
* config.host: Recognize x86_64-*-gnu* targets.
* config/i386/gnu-unwind.h: Update to handle __x86_64__ with a
TODO for now.

Signed-off-by: Flavio Cruz 
---

On Thu, Jan 26, 2023 at 09:34:16AM +0100, Thomas Schwinge wrote:

Hi Flavio!


Hi Thomas!



On 2022-12-26T12:34:28-0500, Flavio Cruz via Gcc-patches 
 wrote:

Tested by building a toolchain and compiling gnumach for x86_64


Oh, wow, so this is indeed happening, finally!  :-D


This is the basic version without unwind support which I think is only required 
to
implement exceptions.


ACK, this can all be tuned later.  We understand that ABI to be
completely unstable at this point.


Your patch generally looks good, and I'll drop it into my regular
x86_64-pc-linux-gnu testing, to verify that we don't accidentally break
things re 'x86_64-*-gnu*' matching (but I think we're safe).


That sounds good.




As you don't have FSF Copyright Assignment on file for GCC (as far as I
can tell), are you either going to get that, or re-submit this patch with
DCO ('Signed-off-by:' tag), ?


Yes, I think I have it for Hurd related projects but not GCC. Added 
Signed-off-by.




While at that, please also adjust:


--- /dev/null
+++ b/gcc/config/i386/gnu64.h
@@ -0,0 +1,40 @@
+/* Configuration for an x86_64 running GNU with ELF as the target machine.  */
+
+/*
+Copyright (C) 2022 Free Software Foundation, Inc.


^ 2023 ;-)


Done

Revisted patch is inlined below. Also added the ChangeLog details.

Thanks a lot for your help!




Grüße
Thomas
-
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas 
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht 
München, HRB 106955


 gcc/config.gcc  |  5 -
 gcc/config/i386/gnu64.h | 40 +
 libgcc/config.host  |  8 ++-
 libgcc/config/i386/gnu-unwind.h | 10 +
 4 files changed, 61 insertions(+), 2 deletions(-)
 create mode 100644 gcc/config/i386/gnu64.h

diff --git a/gcc/config.gcc b/gcc/config.gcc
index 89f56047cfe..ff6166a429b 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1971,7 +1971,7 @@ i[34567]86-*-linux* | i[34567]86-*-kfreebsd*-gnu | 
i[34567]86-*-gnu* | i[34567]8
;;
esac
;;
-x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
+x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-gnu*)
tm_file="${tm_file} i386/unix.h i386/att.h elfos.h gnu-user.h 
glibc-stdint.h \
 i386/x86-64.h i386/gnu-user-common.h i386/gnu-user64.h"
case ${target} in
@@ -1982,6 +1982,9 @@ x86_64-*-linux* | x86_64-*-kfreebsd*-gnu)
x86_64-*-kfreebsd*-gnu)
tm_file="${tm_file} kfreebsd-gnu.h i386/kfreebsd-gnu64.h"
;;
+   x86_64-*-gnu*)
+   tm_file="${tm_file} gnu.h i386/gnu64.h"
+   ;;
esac
tmake_file="${tmake_file} i386/t-linux64"
x86_multilibs="${with_multilib_list}"
diff --git a/gcc/config/i386/gnu64.h b/gcc/config/i386/gnu64.h
new file mode 100644
index 000..a411f0e802a
--- /dev/null
+++ b/gcc/config/i386/gnu64.h
@@ -0,0 +1,40 @@
+/* Configuration for an x86_64 running GNU with ELF as the target machine.  */
+
+/*
+Copyright (C) 2023 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC.  If not, see .
+*/
+
+#define GNU_USER_LINK_EMULATION32 "elf_i386"
+#define GNU_USER_LINK_EMULATION64 "elf_x86_64"
+#define GNU_USER_LINK_EMULATIONX32 "elf32_x86_64"
+
+#undef GNU_USER_DYNAMIC_LINKER
+#define GNU_USER_DYNAMIC_LINKER32 "/lib/ld.so.1"
+#define GNU_USER_DYNAMIC_LINKER64 "/lib/ld-x86-64.so.1"
+#define GNU_USER_DYNAMIC_LINKERX32 "/lib/ld-x32.so.1"
+
+#undef STARTFILE_SPEC
+#if defined HAVE_LD_PIE
+#define STARTFILE_SPEC \
+  "%{!shared: 
%{pg|p|profile:%{static:gcrt0.o%s;:gcrt1.o%

[PATCH] Change i386 RPC subsystem to include descriptor instead of real_descriptor

2023-01-26 Thread Flavio Cruz
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 
-#include 
 
 /*
  * i386 segmentation.
@@ -117,6 +116,37 @@ struct real_gate {
 #include 
 #include 
 
+/*
+ * Real segment descriptor.
+ */
+struct real_descriptor {
+   unsigned intlimit_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 intlimit_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_tthread,
int first_selector,
-   struct real_descriptor  *desc_list,
+   const struct descriptor  *descriptor_list,
unsigned intcount,
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;
unsignedi;
@@ -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)
 {
+  

Re: [PATCH] [tls] use real_descriptor instead of descriptor

2023-01-26 Thread Samuel Thibault
Flavio Cruz, le jeu. 26 janv. 2023 01:49:43 -0500, a ecrit:
> Interface was changed in
> https://git.savannah.gnu.org/cgit/hurd/gnumach.git/commit/?id=b379d5afdf65cce11426ab0349a3778b3fd632f5
> where the signature of i386 RPCs are now using real_descriptor.

Ah... Can we rather revert the change in gnumach into something that is
compatible with existing source code? By keeping the existing
descriptor name for userland interface, and make gnumach itself use
something else.

Otherwise, such a flag-day is always a pain to handle for various
compatibilities.

Samuel



Re: [PATCH] Add support for x86_64-*-gnu-* targets to build x86_64 gnumach/hurd

2023-01-26 Thread Thomas Schwinge
Hi Flavio!

On 2022-12-26T12:34:28-0500, Flavio Cruz via Gcc-patches 
 wrote:
> Tested by building a toolchain and compiling gnumach for x86_64

Oh, wow, so this is indeed happening, finally!  :-D

> This is the basic version without unwind support which I think is only 
> required to
> implement exceptions.

ACK, this can all be tuned later.  We understand that ABI to be
completely unstable at this point.


Your patch generally looks good, and I'll drop it into my regular
x86_64-pc-linux-gnu testing, to verify that we don't accidentally break
things re 'x86_64-*-gnu*' matching (but I think we're safe).


As you don't have FSF Copyright Assignment on file for GCC (as far as I
can tell), are you either going to get that, or re-submit this patch with
DCO ('Signed-off-by:' tag), ?


While at that, please also adjust:

> --- /dev/null
> +++ b/gcc/config/i386/gnu64.h
> @@ -0,0 +1,40 @@
> +/* Configuration for an x86_64 running GNU with ELF as the target machine.  
> */
> +
> +/*
> +Copyright (C) 2022 Free Software Foundation, Inc.

^ 2023 ;-)


Grüße
 Thomas
-
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas 
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht 
München, HRB 106955