[PATCH V3 12/27] csky: ELF and module probe
Signed-off-by: Guo Ren --- arch/csky/include/asm/elf.h | 149 arch/csky/kernel/module.c | 82 2 files changed, 231 insertions(+) create mode 100644 arch/csky/include/asm/elf.h create mode 100644 arch/csky/kernel/module.c diff --git a/arch/csky/include/asm/elf.h b/arch/csky/include/asm/elf.h new file mode 100644 index 000..9eef4a1 --- /dev/null +++ b/arch/csky/include/asm/elf.h @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASMCSKY_ELF_H +#define __ASMCSKY_ELF_H + +/* + * ELF register definitions.. + */ + +#include +#include + +#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_VTENTRY8 +#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_BASE0x0UL + +/* The member sort in array pr_reg[x] is pc, r1, r0, psr, r2, r3,r4, + r5, r6.. Because GDB difine */ +#if defined(__CSKYABIV2__) + #define ELF_CORE_COPY_REGS(pr_reg, regs) \ +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; +#else + #define ELF_CORE_COPY_REGS(pr_reg, regs) \ +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] =
[PATCH V3 12/27] csky: ELF and module probe
Signed-off-by: Guo Ren --- arch/csky/include/asm/elf.h | 149 arch/csky/kernel/module.c | 82 2 files changed, 231 insertions(+) create mode 100644 arch/csky/include/asm/elf.h create mode 100644 arch/csky/kernel/module.c diff --git a/arch/csky/include/asm/elf.h b/arch/csky/include/asm/elf.h new file mode 100644 index 000..9eef4a1 --- /dev/null +++ b/arch/csky/include/asm/elf.h @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. +#ifndef __ASMCSKY_ELF_H +#define __ASMCSKY_ELF_H + +/* + * ELF register definitions.. + */ + +#include +#include + +#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_VTENTRY8 +#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_BASE0x0UL + +/* The member sort in array pr_reg[x] is pc, r1, r0, psr, r2, r3,r4, + r5, r6.. Because GDB difine */ +#if defined(__CSKYABIV2__) + #define ELF_CORE_COPY_REGS(pr_reg, regs) \ +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; +#else + #define ELF_CORE_COPY_REGS(pr_reg, regs) \ +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] =