Skip to content
Snippets Groups Projects
  • Helge Deller's avatar
    4c184e70
    linux-user/hppa: Allow PROT_GROWSUP and PROT_GROWSDOWN in mprotect() · 4c184e70
    Helge Deller authored
    
    The hppa platform uses an upwards-growing stack and required in Linux
    kernels < 5.18 an executable stack for signal processing.  For that some
    executables and libraries are marked to have an executable stack, for
    which glibc uses the mprotect() syscall to mark the stack like this:
     mprotect(xfa000000,4096,PROT_EXEC|PROT_READ|PROT_WRITE|PROT_GROWSUP).
    
    Currently qemu will return -TARGET_EINVAL for this syscall because of the
    checks in validate_prot_to_pageflags(), which doesn't allow the
    PROT_GROWSUP or PROT_GROWSDOWN flags and thus triggers this error in the
    guest:
     error while loading shared libraries: libc.so.6: cannot enable executable stack as shared object requires: Invalid argument
    
    Allow mprotect() to handle both flags and thus fix the guest.
    The glibc tst-execstack testcase can be used to reproduce the issue.
    
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    Message-Id: <20220924114501.21767-7-deller@gmx.de>
    [lvivier: s/elif TARGET_HPPA/elif defined(TARGET_HPPA)/]
    Signed-off-by: default avatarLaurent Vivier <laurent@vivier.eu>
    4c184e70
    History
    linux-user/hppa: Allow PROT_GROWSUP and PROT_GROWSDOWN in mprotect()
    Helge Deller authored
    
    The hppa platform uses an upwards-growing stack and required in Linux
    kernels < 5.18 an executable stack for signal processing.  For that some
    executables and libraries are marked to have an executable stack, for
    which glibc uses the mprotect() syscall to mark the stack like this:
     mprotect(xfa000000,4096,PROT_EXEC|PROT_READ|PROT_WRITE|PROT_GROWSUP).
    
    Currently qemu will return -TARGET_EINVAL for this syscall because of the
    checks in validate_prot_to_pageflags(), which doesn't allow the
    PROT_GROWSUP or PROT_GROWSDOWN flags and thus triggers this error in the
    guest:
     error while loading shared libraries: libc.so.6: cannot enable executable stack as shared object requires: Invalid argument
    
    Allow mprotect() to handle both flags and thus fix the guest.
    The glibc tst-execstack testcase can be used to reproduce the issue.
    
    Signed-off-by: default avatarHelge Deller <deller@gmx.de>
    Message-Id: <20220924114501.21767-7-deller@gmx.de>
    [lvivier: s/elif TARGET_HPPA/elif defined(TARGET_HPPA)/]
    Signed-off-by: default avatarLaurent Vivier <laurent@vivier.eu>