Message ID | 87y0zfs26i.fsf_-_@email.froward.int.ebiederm.org (mailing list archive) |
---|---|
State | Handled Elsewhere |
Headers | show |
Series | [v2] alpha/elf: Fix misc/setarch test of util-linux by removing 32bit support | expand |
On Sun, Jan 12, 2025 at 11:39:01PM -0600, Eric W. Biederman wrote: ... > --- a/arch/alpha/include/asm/pgtable.h > +++ b/arch/alpha/include/asm/pgtable.h > @@ -360,7 +360,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte) > > extern void paging_init(void); > > -/* We have our own get_unmapped_area to cope with ADDR_LIMIT_32BIT. */ > +/* We have our own get_unmapped_area */ > #define HAVE_ARCH_UNMAPPED_AREA Just remove the definition. As the comment suggests, the only reason it exists is ADDR_LIMIT_32BIT, which is gone. > --- a/arch/alpha/kernel/osf_sys.c > +++ b/arch/alpha/kernel/osf_sys.c > @@ -1210,8 +1210,7 @@ SYSCALL_DEFINE1(old_adjtimex, struct timex32 __user *, txc_p) > return ret; > } > > -/* Get an address range which is currently unmapped. Similar to the > - generic version except that we know how to honor ADDR_LIMIT_32BIT. */ > +/* Get an address range which is currently unmapped. */ > > static unsigned long > arch_get_unmapped_area_1(unsigned long addr, unsigned long len, > @@ -1230,13 +1229,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, > unsigned long len, unsigned long pgoff, > unsigned long flags, vm_flags_t vm_flags) > { > - unsigned long limit; > - > - /* "32 bit" actually means 31 bit, since pointers sign extend. */ > - if (current->personality & ADDR_LIMIT_32BIT) > - limit = 0x80000000; > - else > - limit = TASK_SIZE; > + unsigned long limit = TASK_SIZE; > > if (len > limit) > return -ENOMEM; Likewise, just remove these functions. The generic_get_unmapped_area() works fine, tested on up1500. Ivan.
Hi Eric, On Sat, 2025-01-18 at 11:35 +0100, Ivan Kokshaysky wrote: > On Sun, Jan 12, 2025 at 11:39:01PM -0600, Eric W. Biederman wrote: > ... > > --- a/arch/alpha/include/asm/pgtable.h > > +++ b/arch/alpha/include/asm/pgtable.h > > @@ -360,7 +360,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte) > > > > extern void paging_init(void); > > > > -/* We have our own get_unmapped_area to cope with ADDR_LIMIT_32BIT. */ > > +/* We have our own get_unmapped_area */ > > #define HAVE_ARCH_UNMAPPED_AREA > > Just remove the definition. As the comment suggests, the only reason > it exists is ADDR_LIMIT_32BIT, which is gone. > > > --- a/arch/alpha/kernel/osf_sys.c > > +++ b/arch/alpha/kernel/osf_sys.c > > @@ -1210,8 +1210,7 @@ SYSCALL_DEFINE1(old_adjtimex, struct timex32 __user *, txc_p) > > return ret; > > } > > > > -/* Get an address range which is currently unmapped. Similar to the > > - generic version except that we know how to honor ADDR_LIMIT_32BIT. */ > > +/* Get an address range which is currently unmapped. */ > > > > static unsigned long > > arch_get_unmapped_area_1(unsigned long addr, unsigned long len, > > @@ -1230,13 +1229,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, > > unsigned long len, unsigned long pgoff, > > unsigned long flags, vm_flags_t vm_flags) > > { > > - unsigned long limit; > > - > > - /* "32 bit" actually means 31 bit, since pointers sign extend. */ > > - if (current->personality & ADDR_LIMIT_32BIT) > > - limit = 0x80000000; > > - else > > - limit = TASK_SIZE; > > + unsigned long limit = TASK_SIZE; > > > > if (len > limit) > > return -ENOMEM; > > Likewise, just remove these functions. The generic_get_unmapped_area() > works fine, tested on up1500. Can you send a follow-up integrating those changes? It would be good if SET_PERSONALITY() could be fixed on alpha for v6.14. Adrian
On Sun, Jan 26, 2025 at 06:15:43PM +0100, John Paul Adrian Glaubitz wrote: > Hi Eric, > > On Sat, 2025-01-18 at 11:35 +0100, Ivan Kokshaysky wrote: > > On Sun, Jan 12, 2025 at 11:39:01PM -0600, Eric W. Biederman wrote: > > ... > > > --- a/arch/alpha/include/asm/pgtable.h > > > +++ b/arch/alpha/include/asm/pgtable.h > > > @@ -360,7 +360,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte) > > > > > > extern void paging_init(void); > > > > > > -/* We have our own get_unmapped_area to cope with ADDR_LIMIT_32BIT. */ > > > +/* We have our own get_unmapped_area */ > > > #define HAVE_ARCH_UNMAPPED_AREA > > > > Just remove the definition. As the comment suggests, the only reason > > it exists is ADDR_LIMIT_32BIT, which is gone. > > > > > --- a/arch/alpha/kernel/osf_sys.c > > > +++ b/arch/alpha/kernel/osf_sys.c > > > @@ -1210,8 +1210,7 @@ SYSCALL_DEFINE1(old_adjtimex, struct timex32 __user *, txc_p) > > > return ret; > > > } > > > > > > -/* Get an address range which is currently unmapped. Similar to the > > > - generic version except that we know how to honor ADDR_LIMIT_32BIT. */ > > > +/* Get an address range which is currently unmapped. */ > > > > > > static unsigned long > > > arch_get_unmapped_area_1(unsigned long addr, unsigned long len, > > > @@ -1230,13 +1229,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, > > > unsigned long len, unsigned long pgoff, > > > unsigned long flags, vm_flags_t vm_flags) > > > { > > > - unsigned long limit; > > > - > > > - /* "32 bit" actually means 31 bit, since pointers sign extend. */ > > > - if (current->personality & ADDR_LIMIT_32BIT) > > > - limit = 0x80000000; > > > - else > > > - limit = TASK_SIZE; > > > + unsigned long limit = TASK_SIZE; > > > > > > if (len > limit) > > > return -ENOMEM; > > > > Likewise, just remove these functions. The generic_get_unmapped_area() > > works fine, tested on up1500. > > Can you send a follow-up integrating those changes? It would be good if > SET_PERSONALITY() could be fixed on alpha for v6.14. Oh, the changes I proposed are mere cleanup suggestions. The original patch would do just fine. Ivan.
diff --git a/arch/alpha/include/asm/elf.h b/arch/alpha/include/asm/elf.h index 4d7c46f50382..50c82187e60e 100644 --- a/arch/alpha/include/asm/elf.h +++ b/arch/alpha/include/asm/elf.h @@ -74,7 +74,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; /* * This is used to ensure we don't load something for the wrong architecture. */ -#define elf_check_arch(x) ((x)->e_machine == EM_ALPHA) +#define elf_check_arch(x) (((x)->e_machine == EM_ALPHA) && !((x)->e_flags & EF_ALPHA_32BIT)) /* * These are used to set parameters in the core dumps. @@ -137,10 +137,6 @@ extern int dump_elf_task(elf_greg_t *dest, struct task_struct *task); : amask (AMASK_CIX) ? "ev6" : "ev67"); \ }) -#define SET_PERSONALITY(EX) \ - set_personality(((EX).e_flags & EF_ALPHA_32BIT) \ - ? PER_LINUX_32BIT : PER_LINUX) - extern int alpha_l1i_cacheshape; extern int alpha_l1d_cacheshape; extern int alpha_l2_cacheshape; diff --git a/arch/alpha/include/asm/pgtable.h b/arch/alpha/include/asm/pgtable.h index 635f0a5f5bbd..02e8817a8921 100644 --- a/arch/alpha/include/asm/pgtable.h +++ b/arch/alpha/include/asm/pgtable.h @@ -360,7 +360,7 @@ static inline pte_t pte_swp_clear_exclusive(pte_t pte) extern void paging_init(void); -/* We have our own get_unmapped_area to cope with ADDR_LIMIT_32BIT. */ +/* We have our own get_unmapped_area */ #define HAVE_ARCH_UNMAPPED_AREA #endif /* _ALPHA_PGTABLE_H */ diff --git a/arch/alpha/include/asm/processor.h b/arch/alpha/include/asm/processor.h index 55bb1c09fd39..5dce5518a211 100644 --- a/arch/alpha/include/asm/processor.h +++ b/arch/alpha/include/asm/processor.h @@ -8,23 +8,19 @@ #ifndef __ASM_ALPHA_PROCESSOR_H #define __ASM_ALPHA_PROCESSOR_H -#include <linux/personality.h> /* for ADDR_LIMIT_32BIT */ - /* * We have a 42-bit user address space: 4TB user VM... */ #define TASK_SIZE (0x40000000000UL) -#define STACK_TOP \ - (current->personality & ADDR_LIMIT_32BIT ? 0x80000000 : 0x00120000000UL) +#define STACK_TOP (0x00120000000UL) #define STACK_TOP_MAX 0x00120000000UL /* This decides where the kernel will search for a free chunk of vm * space during mmap's. */ -#define TASK_UNMAPPED_BASE \ - ((current->personality & ADDR_LIMIT_32BIT) ? 0x40000000 : TASK_SIZE / 2) +#define TASK_UNMAPPED_BASE (TASK_SIZE / 2) /* This is dead. Everything has been moved to thread_info. */ struct thread_struct { }; diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 86185021f75a..a08e8edef1a4 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c @@ -1210,8 +1210,7 @@ SYSCALL_DEFINE1(old_adjtimex, struct timex32 __user *, txc_p) return ret; } -/* Get an address range which is currently unmapped. Similar to the - generic version except that we know how to honor ADDR_LIMIT_32BIT. */ +/* Get an address range which is currently unmapped. */ static unsigned long arch_get_unmapped_area_1(unsigned long addr, unsigned long len, @@ -1230,13 +1229,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags, vm_flags_t vm_flags) { - unsigned long limit; - - /* "32 bit" actually means 31 bit, since pointers sign extend. */ - if (current->personality & ADDR_LIMIT_32BIT) - limit = 0x80000000; - else - limit = TASK_SIZE; + unsigned long limit = TASK_SIZE; if (len > limit) return -ENOMEM;