From: Guo Ren <ren_guo@c-sky.com> To: akpm@linux-foundation.org, arnd@arndb.de, daniel.lezcano@linaro.org, davem@davemloft.net, gregkh@linuxfoundation.org, hch@infradead.org, marc.zyngier@arm.com, mark.rutland@arm.com, peterz@infradead.org, robh@kernel.org, tglx@linutronix.de Cc: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, devicetree@vger.kernel.org, robh+dt@kernel.org, c-sky_gcc_upstream@c-sky.com, Guo Ren <ren_guo@c-sky.com> Subject: [PATCH V9 12/21] csky: ELF and module probe Date: Tue, 16 Oct 2018 10:58:31 +0800 [thread overview] Message-ID: <27589f69f513177892d39868050dccb5f21023aa.1539655732.git.ren_guo@c-sky.com> (raw) In-Reply-To: <cover.1539655731.git.ren_guo@c-sky.com> In-Reply-To: <cover.1539655731.git.ren_guo@c-sky.com> This patch adds ELF definition and module relocate codes. Signed-off-by: Guo Ren <ren_guo@c-sky.com> Cc: Arnd Bergmann <arnd@arndb.de> --- arch/csky/abiv1/inc/abi/elf.h | 26 ++++++++++++ arch/csky/abiv2/inc/abi/elf.h | 43 ++++++++++++++++++++ arch/csky/include/asm/elf.h | 85 +++++++++++++++++++++++++++++++++++++++ arch/csky/kernel/module.c | 92 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 246 insertions(+) create mode 100644 arch/csky/abiv1/inc/abi/elf.h create mode 100644 arch/csky/abiv2/inc/abi/elf.h create mode 100644 arch/csky/include/asm/elf.h create mode 100644 arch/csky/kernel/module.c diff --git a/arch/csky/abiv1/inc/abi/elf.h b/arch/csky/abiv1/inc/abi/elf.h new file mode 100644 index 0000000..3058cc0 --- /dev/null +++ b/arch/csky/abiv1/inc/abi/elf.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __ABI_CSKY_ELF_H +#define __ABI_CSKY_ELF_H + +#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \ + pr_reg[0] = regs->pc; \ + pr_reg[1] = regs->regs[9]; \ + pr_reg[2] = regs->usp; \ + pr_reg[3] = regs->sr; \ + pr_reg[4] = regs->a0; \ + pr_reg[5] = regs->a1; \ + pr_reg[6] = regs->a2; \ + pr_reg[7] = regs->a3; \ + pr_reg[8] = regs->regs[0]; \ + pr_reg[9] = regs->regs[1]; \ + pr_reg[10] = regs->regs[2]; \ + pr_reg[11] = regs->regs[3]; \ + pr_reg[12] = regs->regs[4]; \ + pr_reg[13] = regs->regs[5]; \ + pr_reg[14] = regs->regs[6]; \ + pr_reg[15] = regs->regs[7]; \ + pr_reg[16] = regs->regs[8]; \ + pr_reg[17] = regs->lr; \ +} while (0); +#endif /* __ABI_CSKY_ELF_H */ diff --git a/arch/csky/abiv2/inc/abi/elf.h b/arch/csky/abiv2/inc/abi/elf.h new file mode 100644 index 0000000..290f49e --- /dev/null +++ b/arch/csky/abiv2/inc/abi/elf.h @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef __ABI_CSKY_ELF_H +#define __ABI_CSKY_ELF_H + +/* The member sort in array pr_reg[x] is defined by GDB. */ +#define ELF_CORE_COPY_REGS(pr_reg, regs) do { \ + pr_reg[0] = regs->pc; \ + pr_reg[1] = regs->a1; \ + pr_reg[2] = regs->a0; \ + pr_reg[3] = regs->sr; \ + pr_reg[4] = regs->a2; \ + pr_reg[5] = regs->a3; \ + pr_reg[6] = regs->regs[0]; \ + pr_reg[7] = regs->regs[1]; \ + pr_reg[8] = regs->regs[2]; \ + pr_reg[9] = regs->regs[3]; \ + pr_reg[10] = regs->regs[4]; \ + pr_reg[11] = regs->regs[5]; \ + pr_reg[12] = regs->regs[6]; \ + pr_reg[13] = regs->regs[7]; \ + pr_reg[14] = regs->regs[8]; \ + pr_reg[15] = regs->regs[9]; \ + pr_reg[16] = regs->usp; \ + pr_reg[17] = regs->lr; \ + pr_reg[18] = regs->exregs[0]; \ + pr_reg[19] = regs->exregs[1]; \ + pr_reg[20] = regs->exregs[2]; \ + pr_reg[21] = regs->exregs[3]; \ + pr_reg[22] = regs->exregs[4]; \ + pr_reg[23] = regs->exregs[5]; \ + pr_reg[24] = regs->exregs[6]; \ + pr_reg[25] = regs->exregs[7]; \ + pr_reg[26] = regs->exregs[8]; \ + pr_reg[27] = regs->exregs[9]; \ + pr_reg[28] = regs->exregs[10]; \ + pr_reg[29] = regs->exregs[11]; \ + pr_reg[30] = regs->exregs[12]; \ + pr_reg[31] = regs->exregs[13]; \ + pr_reg[32] = regs->exregs[14]; \ + pr_reg[33] = regs->tls; \ +} while (0); +#endif /* __ABI_CSKY_ELF_H */ diff --git a/arch/csky/include/asm/elf.h b/arch/csky/include/asm/elf.h new file mode 100644 index 0000000..773b133 --- /dev/null +++ b/arch/csky/include/asm/elf.h @@ -0,0 +1,85 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#ifndef __ASM_CSKY_ELF_H +#define __ASM_CSKY_ELF_H + +#include <asm/ptrace.h> +#include <abi/regdef.h> + +#define ELF_ARCH 252 + +/* CSKY Relocations */ +#define R_CSKY_NONE 0 +#define R_CSKY_32 1 +#define R_CSKY_PCIMM8BY4 2 +#define R_CSKY_PCIMM11BY2 3 +#define R_CSKY_PCIMM4BY2 4 +#define R_CSKY_PC32 5 +#define R_CSKY_PCRELJSR_IMM11BY2 6 +#define R_CSKY_GNU_VTINHERIT 7 +#define R_CSKY_GNU_VTENTRY 8 +#define R_CSKY_RELATIVE 9 +#define R_CSKY_COPY 10 +#define R_CSKY_GLOB_DAT 11 +#define R_CSKY_JUMP_SLOT 12 +#define R_CSKY_ADDR_HI16 24 +#define R_CSKY_ADDR_LO16 25 +#define R_CSKY_PCRELJSR_IMM26BY2 40 + +typedef unsigned long elf_greg_t; + +typedef struct user_fp elf_fpregset_t; + +#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) + +typedef elf_greg_t elf_gregset_t[ELF_NGREG]; + +/* + * This is used to ensure we don't load something for the wrong architecture. + */ +#define elf_check_arch(x) ((x)->e_machine == ELF_ARCH) + +/* + * These are used to set parameters in the core dumps. + */ +#define USE_ELF_CORE_DUMP +#define ELF_EXEC_PAGESIZE 4096 +#define ELF_CLASS ELFCLASS32 +#define ELF_PLAT_INIT(_r, load_addr) { _r->a0 = 0; } + +#ifdef __cskyBE__ +#define ELF_DATA ELFDATA2MSB +#else +#define ELF_DATA ELFDATA2LSB +#endif + +/* + * This is the location that an ET_DYN program is loaded if exec'ed. Typical + * use of this is to invoke "./ld.so someprog" to test out a new version of + * the loader. We need to make sure that it is out of the way of the program + * that it will "exec", and that there is sufficient room for the brk. + */ +#define ELF_ET_DYN_BASE 0x0UL +#include <abi/elf.h> + +/* Similar, but for a thread other than current. */ +struct task_struct; +extern int dump_task_regs(struct task_struct *tsk, elf_gregset_t *elf_regs); +#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs) + +#define ELF_HWCAP (0) + +/* + * This yields a string that ld.so will use to load implementation specific + * libraries for optimization. This is more specific in intent than poking + * at uname or /proc/cpuinfo. + */ +#define ELF_PLATFORM (NULL) +#define SET_PERSONALITY(ex) set_personality(PER_LINUX) + +#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 +struct linux_binprm; +extern int arch_setup_additional_pages(struct linux_binprm *bprm, + int uses_interp); +#endif /* __ASM_CSKY_ELF_H */ diff --git a/arch/csky/kernel/module.c b/arch/csky/kernel/module.c new file mode 100644 index 0000000..65abab0 --- /dev/null +++ b/arch/csky/kernel/module.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. + +#include <linux/moduleloader.h> +#include <linux/elf.h> +#include <linux/mm.h> +#include <linux/vmalloc.h> +#include <linux/slab.h> +#include <linux/fs.h> +#include <linux/string.h> +#include <linux/kernel.h> +#include <linux/spinlock.h> +#include <asm/pgtable.h> + +#if defined(__CSKYABIV2__) +#define IS_BSR32(hi16, lo16) (((hi16) & 0xFC00) == 0xE000) +#define IS_JSRI32(hi16, lo16) ((hi16) == 0xEAE0) + +#define CHANGE_JSRI_TO_LRW(addr) do { \ + *(uint16_t *)(addr) = (*(uint16_t *)(addr) & 0xFF9F) | 0x001a; \ + *((uint16_t *)(addr) + 1) = *((uint16_t *)(addr) + 1) & 0xFFFF; \ +} while (0) + +#define SET_JSR32_R26(addr) do { \ + *(uint16_t *)(addr) = 0xE8Fa; \ + *((uint16_t *)(addr) + 1) = 0x0000; \ +} while (0) +#endif + +int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, + unsigned int symindex, unsigned int relsec, struct module *me) +{ + unsigned int i; + Elf32_Rela *rel = (void *) sechdrs[relsec].sh_addr; + Elf32_Sym *sym; + uint32_t *location; + short *temp; +#if defined(__CSKYABIV2__) + uint16_t *location_tmp; +#endif + + for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { + /* This is where to make the change */ + location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr + + rel[i].r_offset; + sym = (Elf32_Sym *)sechdrs[symindex].sh_addr + + ELF32_R_SYM(rel[i].r_info); + + switch (ELF32_R_TYPE(rel[i].r_info)) { + case R_CSKY_32: + /* We add the value into the location given */ + *location = rel[i].r_addend + sym->st_value; + break; + case R_CSKY_PC32: + /* Add the value, subtract its postition */ + *location = rel[i].r_addend + sym->st_value + - (uint32_t)location; + break; + case R_CSKY_PCRELJSR_IMM11BY2: + break; + case R_CSKY_PCRELJSR_IMM26BY2: +#if defined(__CSKYABIV2__) + location_tmp = (uint16_t *)location; + if (IS_BSR32(*location_tmp, *(location_tmp + 1))) + break; + + if (IS_JSRI32(*location_tmp, *(location_tmp + 1))) { + /* jsri 0x... --> lrw r26, 0x... */ + CHANGE_JSRI_TO_LRW(location); + /* lsli r0, r0 --> jsr r26 */ + SET_JSR32_R26(location + 1); + } +#endif + break; + case R_CSKY_ADDR_HI16: + temp = ((short *)location) + 1; + *temp = (short) + ((rel[i].r_addend + sym->st_value) >> 16); + break; + case R_CSKY_ADDR_LO16: + temp = ((short *)location) + 1; + *temp = (short) + ((rel[i].r_addend + sym->st_value) & 0xffff); + break; + default: + pr_err("module %s: Unknown relocation: %u\n", + me->name, ELF32_R_TYPE(rel[i].r_info)); + return -ENOEXEC; + } + } + return 0; +} -- 2.7.4
next prev parent reply other threads:[~2018-10-16 3:02 UTC|newest] Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-10-16 2:58 [PATCH V9 00/21] C-SKY(csky) Linux Kernel Port Guo Ren 2018-10-16 2:58 ` [PATCH V9 01/21] csky: Build infrastructure Guo Ren 2018-10-23 0:08 ` Guo Ren 2018-10-24 22:53 ` Arnd Bergmann 2018-10-25 17:04 ` Guo Ren 2018-10-16 2:58 ` [PATCH V9 02/21] csky: defconfig Guo Ren 2018-10-17 14:56 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 03/21] csky: Kernel booting Guo Ren 2018-10-17 14:58 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 04/21] csky: Exception handling and mm-fault Guo Ren 2018-10-17 14:59 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 05/21] csky: System Call Guo Ren 2018-10-17 15:02 ` Arnd Bergmann 2018-10-18 2:02 ` Guo Ren 2018-10-16 2:58 ` [PATCH V9 06/21] csky: Cache and TLB routines Guo Ren 2018-10-17 15:08 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 07/21] csky: MMU and page table management Guo Ren 2018-10-17 15:06 ` Arnd Bergmann 2018-10-18 2:05 ` Guo Ren 2018-10-16 2:58 ` [PATCH V9 08/21] csky: Process management and Signal Guo Ren 2018-10-17 15:11 ` Arnd Bergmann 2018-10-18 2:37 ` Guo Ren 2018-10-16 2:58 ` [PATCH V9 09/21] csky: VDSO and rt_sigreturn Guo Ren 2018-10-17 15:13 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 10/21] csky: IRQ handling Guo Ren 2018-10-17 15:14 ` Arnd Bergmann 2018-10-18 2:39 ` Guo Ren 2018-10-16 2:58 ` [PATCH V9 11/21] csky: Atomic operations Guo Ren 2018-10-17 15:17 ` Arnd Bergmann 2018-10-18 2:40 ` Guo Ren 2018-10-21 20:55 ` Peter Zijlstra 2018-10-22 1:52 ` Guo Ren 2018-10-16 2:58 ` Guo Ren [this message] 2018-10-17 15:18 ` [PATCH V9 12/21] csky: ELF and module probe Arnd Bergmann 2018-10-18 2:49 ` Guo Ren 2018-10-18 8:31 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 13/21] csky: Library functions Guo Ren 2018-10-17 15:24 ` Arnd Bergmann 2018-10-18 3:10 ` Guo Ren 2018-10-16 2:58 ` [PATCH V9 14/21] csky: User access Guo Ren 2018-10-17 15:37 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 15/21] csky: Debug and Ptrace GDB Guo Ren 2018-10-17 15:46 ` Arnd Bergmann 2018-10-18 3:17 ` Guo Ren 2018-10-16 2:58 ` [PATCH V9 16/21] csky: SMP support Guo Ren 2018-10-17 15:47 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 17/21] csky: Misc headers Guo Ren 2018-10-17 15:49 ` Arnd Bergmann 2018-10-16 2:58 ` [PATCH V9 18/21] dt-bindings: csky CPU Bindings Guo Ren 2018-10-17 15:50 ` Arnd Bergmann 2018-10-18 3:21 ` Guo Ren 2018-10-18 3:45 ` Guo Ren 2018-10-18 14:31 ` Rob Herring 2018-10-19 2:19 ` Guo Ren 2018-10-16 2:58 ` [PATCH V9 19/21] dt-bindings: Add vendor prefix for csky Guo Ren 2018-10-16 2:58 ` [PATCH V9 20/21] MAINTAINERS: Add csky Guo Ren 2018-10-17 15:51 ` Arnd Bergmann 2018-10-16 5:48 ` [PATCH V9 21/21] csky: support dword access for get_user_size() Guo Ren 2018-10-17 15:44 ` Arnd Bergmann 2018-10-18 3:41 ` Guo Ren 2018-10-18 8:34 ` Arnd Bergmann 2018-10-18 8:57 ` Guo Ren 2018-10-24 7:17 ` Arnd Bergmann 2018-10-25 17:08 ` Guo Ren 2018-10-17 15:58 ` [PATCH V9 00/21] C-SKY(csky) Linux Kernel Port Arnd Bergmann 2018-10-18 4:10 ` Guo Ren 2018-10-18 8:36 ` Arnd Bergmann 2018-10-18 9:03 ` Guo Ren
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=27589f69f513177892d39868050dccb5f21023aa.1539655732.git.ren_guo@c-sky.com \ --to=ren_guo@c-sky.com \ --cc=akpm@linux-foundation.org \ --cc=arnd@arndb.de \ --cc=c-sky_gcc_upstream@c-sky.com \ --cc=daniel.lezcano@linaro.org \ --cc=davem@davemloft.net \ --cc=devicetree@vger.kernel.org \ --cc=gregkh@linuxfoundation.org \ --cc=hch@infradead.org \ --cc=linux-arch@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=marc.zyngier@arm.com \ --cc=mark.rutland@arm.com \ --cc=peterz@infradead.org \ --cc=robh+dt@kernel.org \ --cc=robh@kernel.org \ --cc=tglx@linutronix.de \ --subject='Re: [PATCH V9 12/21] csky: ELF and module probe' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).