From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/8366 Path: news.gmane.org!not-for-mail From: Rich Felker Newsgroups: gmane.linux.lib.musl.general Subject: Re: musl-based toolchain for J2/SH-2 - kernel patches Date: Wed, 26 Aug 2015 14:08:13 -0400 Message-ID: <20150826180813.GP32742@brightrain.aerifal.cx> References: <20150826174212.GO32742@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="LSp5EJdfMPwZcMS1" X-Trace: ger.gmane.org 1440612537 24371 80.91.229.3 (26 Aug 2015 18:08:57 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 26 Aug 2015 18:08:57 +0000 (UTC) Cc: musl@lists.openwall.com, nommu@nommu.org To: 0pf@nommu.org Original-X-From: musl-return-8378-gllmg-musl=m.gmane.org@lists.openwall.com Wed Aug 26 20:08:42 2015 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1ZUf7l-0007BM-6b for gllmg-musl@m.gmane.org; Wed, 26 Aug 2015 20:08:37 +0200 Original-Received: (qmail 8153 invoked by uid 550); 26 Aug 2015 18:08:34 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 8097 invoked from network); 26 Aug 2015 18:08:28 -0000 Content-Disposition: inline In-Reply-To: <20150826174212.GO32742@brightrain.aerifal.cx> User-Agent: Mutt/1.5.21 (2010-09-15) Original-Sender: Rich Felker Xref: news.gmane.org gmane.linux.lib.musl.general:8366 Archived-At: --LSp5EJdfMPwZcMS1 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Aug 26, 2015 at 01:42:12PM -0400, Rich Felker wrote: > I've packaged up a small cross-compiler-toolchain build script that's > especially geared towards use with the Open Processor Foundation's J2 > Core, which uses the SH-2 ISA, and in the future other NOMMU archs: > > https://github.com/richfelker/musl-cross-make One more thing: A couple kernel-side patches are needed to support the binaries produced by this toolchain on SH-2/J2 and other NOMMU systems. One adds the unified syscall trap number for SH-2/3/4; the other enables loading of ELF files on NOMMU. Early versions of both were included in this email to the musl list: http://www.openwall.com/lists/musl/2015/06/16/5 The version of the SH unified syscall trap patch that's been proposed upstream is available here as well: http://lkml.iu.edu/hypermail/linux/kernel/1508.3/01702.html It touches some of the same code touched by the 0pf/J2 patches: http://lkml.iu.edu/hypermail/linux/kernel/1506.2/02538.html so some minor work to merge them is needed for using this on the real J2 hardware. I'm attaching both patches to this email as well. Rich --LSp5EJdfMPwZcMS1 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="sh-unified-syscall-v2.diff" diff -urp ../linux-4.2-rc6.orig/arch/sh/kernel/cpu/sh2/entry.S ./arch/sh/kernel/cpu/sh2/entry.S --- ../linux-4.2-rc6.orig/arch/sh/kernel/cpu/sh2/entry.S 2015-08-09 19:54:30.000000000 +0000 +++ ./arch/sh/kernel/cpu/sh2/entry.S 2015-08-24 03:23:34.159387924 +0000 @@ -144,9 +144,9 @@ ENTRY(exception_handler) mov #64,r8 cmp/hs r8,r9 bt interrupt_entry ! vec >= 64 is interrupt - mov #32,r8 + mov #31,r8 cmp/hs r8,r9 - bt trap_entry ! 64 > vec >= 32 is trap + bt trap_entry ! 64 > vec >= 31 is trap mov.l 4f,r8 mov r9,r4 @@ -178,9 +178,9 @@ interrupt_entry: trap_entry: mov #0x30,r8 - cmp/ge r8,r9 ! vector 0x20-0x2f is systemcall + cmp/ge r8,r9 ! vector 0x1f-0x2f is systemcall bt 1f - add #-0x10,r9 ! convert SH2 to SH3/4 ABI + mov #0x1f,r9 ! convert to unified SH2/3/4 trap number 1: shll2 r9 ! TRA bra system_call ! jump common systemcall entry diff -urp ../linux-4.2-rc6.orig/arch/sh/kernel/cpu/sh2a/entry.S ./arch/sh/kernel/cpu/sh2a/entry.S --- ../linux-4.2-rc6.orig/arch/sh/kernel/cpu/sh2a/entry.S 2015-08-09 19:54:30.000000000 +0000 +++ ./arch/sh/kernel/cpu/sh2a/entry.S 2015-08-24 03:23:58.849386418 +0000 @@ -109,9 +109,9 @@ ENTRY(exception_handler) mov #64,r8 cmp/hs r8,r9 bt interrupt_entry ! vec >= 64 is interrupt - mov #32,r8 + mov #31,r8 cmp/hs r8,r9 - bt trap_entry ! 64 > vec >= 32 is trap + bt trap_entry ! 64 > vec >= 31 is trap mov.l 4f,r8 mov r9,r4 @@ -143,9 +143,9 @@ interrupt_entry: trap_entry: mov #0x30,r8 - cmp/ge r8,r9 ! vector 0x20-0x2f is systemcall + cmp/ge r8,r9 ! vector 0x1f-0x2f is systemcall bt 1f - add #-0x10,r9 ! convert SH2 to SH3/4 ABI + mov #0x1f,r9 ! convert to unified SH2/3/4 trap number 1: shll2 r9 ! TRA bra system_call ! jump common systemcall entry diff -urp ../linux-4.2-rc6.orig/arch/sh/kernel/entry-common.S ./arch/sh/kernel/entry-common.S --- ../linux-4.2-rc6.orig/arch/sh/kernel/entry-common.S 2015-08-09 19:54:30.000000000 +0000 +++ ./arch/sh/kernel/entry-common.S 2015-08-25 21:08:15.835463227 +0000 @@ -268,20 +268,29 @@ debug_trap: * Syscall #: R3 * Arguments #0 to #3: R4--R7 * Arguments #4 to #6: R0, R1, R2 - * TRA: (number of arguments + ABI revision) x 4 + * TRA: See following table. * - * This code also handles delegating other traps to the BIOS/gdb stub - * according to: - * - * Trap number * (TRA>>2) Purpose * -------- ------- * 0x00-0x0f original SH-3/4 syscall ABI (not in general use). * 0x10-0x1f general SH-3/4 syscall ABI. - * 0x20-0x2f syscall ABI for SH-2 parts. + * 0x1f unified SH-2/3/4 syscall ABI (preferred). + * 0x20-0x2f original SH-2 syscall ABI. * 0x30-0x3f debug traps used by the kernel. * 0x40-0xff Not supported by all parts, so left unhandled. * + * For making system calls, any trap number in the range for the + * given cpu model may be used, but the unified trap number 0x1f is + * preferred for compatibility with all models. + * + * The low bits of the trap number were once documented as matching + * the number of arguments, but they were never actually used as such + * by the kernel. SH-2 originally used its own separate trap range + * because several hardware exceptions fell in the range used for the + * SH-3/4 syscall ABI. + * + * This code also handles delegating other traps to the BIOS/gdb stub. + * * Note: When we're first called, the TRA value must be shifted * right 2 bits in order to get the value that was used as the "trapa" * argument. --LSp5EJdfMPwZcMS1 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="fdpic_elf_loader.diff" --- fs/binfmt_elf_fdpic.c.orig +++ fs/binfmt_elf_fdpic.c @@ -103,14 +103,27 @@ core_initcall(init_elf_fdpic_binfmt); module_exit(exit_elf_fdpic_binfmt); +static int is_fdpic(struct elfhdr *hdr) +{ +#ifdef CONFIG_MMU + return 1; +#else + return elf_check_fdpic(hdr); +#endif +} + static int is_elf_fdpic(struct elfhdr *hdr, struct file *file) { if (memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0) return 0; if (hdr->e_type != ET_EXEC && hdr->e_type != ET_DYN) return 0; - if (!elf_check_arch(hdr) || !elf_check_fdpic(hdr)) + if (!elf_check_arch(hdr)) return 0; +#ifdef CONFIG_MMU + if (!elf_check_fdpic(hdr)) + return 0; +#endif if (!file->f_op->mmap) return 0; return 1; @@ -269,7 +282,7 @@ } - if (elf_check_const_displacement(&exec_params.hdr)) + if (elf_check_const_displacement(&exec_params.hdr) || !is_fdpic(&exec_params.hdr)) exec_params.flags |= ELF_FDPIC_FLAG_CONSTDISP; /* perform insanity checks on the interpreter */ @@ -306,9 +319,9 @@ retval = -ENOEXEC; if (stack_size == 0) - goto error; + stack_size = 131072; - if (elf_check_const_displacement(&interp_params.hdr)) + if (elf_check_const_displacement(&interp_params.hdr) || !is_fdpic(&interp_params.hdr)) interp_params.flags |= ELF_FDPIC_FLAG_CONSTDISP; /* flush all traces of the currently running executable */ @@ -319,7 +332,8 @@ /* there's now no turning back... the old userspace image is dead, * defunct, deceased, etc. */ - set_personality(PER_LINUX_FDPIC); + if (is_fdpic(&exec_params.hdr)) + set_personality(PER_LINUX_FDPIC); if (elf_read_implies_exec(&exec_params.hdr, executable_stack)) current->personality |= READ_IMPLIES_EXEC; @@ -400,8 +414,6 @@ current->mm->brk = current->mm->start_brk; current->mm->context.end_brk = current->mm->start_brk; - current->mm->context.end_brk += - (stack_size > PAGE_SIZE) ? (stack_size - PAGE_SIZE) : 0; current->mm->start_stack = current->mm->start_brk + stack_size; #endif --LSp5EJdfMPwZcMS1--