Building for 32-bit RISC-V kernel
Subsystems (2)
v2 cover Building for 32-bit RISC-V kernel
These patches for building 32-bit RISC-V kernel.
- Fix the compile errors and warnings on RV32I.
- Fix some incompatible problem on RV32I.
- Add format.h for compatible of print format.
The fixed width integer types format for Elf_Addr will move to generic header by another patch. For now, there are some warning about unexpected argument of type on RV32I.
Change in v1:
- Fix some error in v1
- Remove implementation of fixed width integer types format for Elf_Addr.
Zong Li (4):
RISC-V: Add conditional macro for zone of DMA32
RISC-V: Select GENERIC_UCMPDI2 on RV32I
RISC-V: Add definiion of extract symbol's index and type for 32-bit
RISC-V: Change variable type for 32-bit compatible
arch/riscv/Kconfig | 1 + arch/riscv/include/uapi/asm/elf.h | 9 +++++++-- arch/riscv/kernel/module.c | 22 +++++++++++----------- arch/riscv/mm/init.c | 2 ++ 4 files changed, 21 insertions(+), 13 deletions(-)
Signature · 1 line
2.16.1
PATCH v2 1/4 RISC-V: Add conditional macro for zone of DMA32
The DMA32 is for 64-bit usage.
--- arch/riscv/mm/init.c | 2 ++ 1 file changed, 2 insertions(+)
arch/riscv/mm/init.c +2 -0
@@ -28,7 +28,9 @@ static void __init zone_sizes_init(void) {unsigned long max_zone_pfns[MAX_NR_ZONES ] = {0 , }; +#ifdef CONFIG_ZONE_DMA32 max_zone_pfns[ZONE_DMA32 ] =PFN_DOWN (min (4UL *SZ_1G , max_low_pfn)); +#endif max_zone_pfns[ZONE_NORMAL ] = max_low_pfn;free_area_init_nodes (max_zone_pfns);
Signature · 1 line
2.16.1
Re: [PATCH v2 1/4] RISC-V: Add conditional macro for zone of DMA32
Quoted 3 lines · Zong Li
The DMA32 is for 64-bit usage.
Signed-off-by Zong Li <[email protected]>
Looks good,
PATCH v2 2/4 RISC-V: Select GENERIC_UCMPDI2 on RV32I
In reply to Zong LiOn 32-bit, it need to use __ucmpdi2, otherwise, it can't find the __ucmpdi2 symbol.
--- arch/riscv/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/riscv/Kconfig +1 -0
@@ -122,6 +122,7 @@ config ARCH_RV32I select GENERIC_ASHLDI3 select GENERIC_ASHRDI3 select GENERIC_LSHRDI3 + select GENERIC_UCMPDI2 config ARCH_RV64I bool "RV64I"
Signature · 1 line
2.16.1
Re: [PATCH v2 2/4] RISC-V: Select GENERIC_UCMPDI2 on RV32I
Quoted 4 lines · Zong Li
On 32-bit, it need to use
__ucmpdi2, otherwise, it can't find the__ucmpdi2symbol.Signed-off-by Zong Li <[email protected]>
Looks good,
PATCH v2 3/4 RISC-V: Add definiion of extract symbol's index and type for 32-bit
In reply to Zong LiUse generic marco to get the index and type of symbol.
--- arch/riscv/include/uapi/asm/elf.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
arch/riscv/include/uapi/asm/elf.h +7 -2
@@ -21,8 +21,13 @@ typedef struct user_regs_struct elf_gregset_t;typedef union __riscv_fp_state elf_fpregset_t ; -#define ELF_RISCV_R_SYM (r_info) ((r_info) >> 32) -#define ELF_RISCV_R_TYPE (r_info) ((r_info) & 0xffffffff) +#if __riscv_xlen ==64 +#define ELF_RISCV_R_SYM (r_info) ELF64_R_SYM(r_info) +#define ELF_RISCV_R_TYPE (r_info) ELF64_R_TYPE(r_info) +#else +#define ELF_RISCV_R_SYM (r_info) ELF32_R_SYM(r_info) +#define ELF_RISCV_R_TYPE (r_info) ELF32_R_TYPE(r_info) +#endif /* * RISC-V relocation types
Signature · 1 line
2.16.1
Re: [PATCH v2 3/4] RISC-V: Add definiion of extract symbol's index and type for 32-bit
Quoted 1 line · Zong Li
Use generic marco to get the index and type of symbol.
Why do we even need this in a uapi header? Shouldn't ELF_RISCV_R_SYM and ELF_RISCV_R_TYPE move to module.c? In that case we could just use CONFIG_64BIT.
Re: [PATCH v2 3/4] RISC-V: Add definiion of extract symbol's index and type for 32-bit
Christoph Hellwig <[email protected]> ? 2018?6?29? ?? ??3:12???
Quoted 7 lines · Zong Li
Quoted 1 line
Use generic marco to get the index and type of symbol.
Why do we even need this in a uapi header? Shouldn't
ELF_RISCV_R_SYMandELF_RISCV_R_TYPEmove tomodule.c? In that case we could just useCONFIG_64BIT.
Make sense. I even think the all definitions can be move to include/asm/elf.h. How do you think about that?
Re: [PATCH v2 3/4] RISC-V: Add definiion of extract symbol's index and type for 32-bit
Quoted 11 lines · zongbox at gmail.com
Christoph Hellwig <[email protected]> ? 2018?6?29? ?? ??3:12???
Quoted 7 lines · Zong Li
Quoted 1 line
Use generic marco to get the index and type of symbol.
Why do we even need this in a uapi header? Shouldn't
ELF_RISCV_R_SYMandELF_RISCV_R_TYPEmove tomodule.c? In that case we could just useCONFIG_64BIT.Make sense. I even think the all definitions can be move to
include/asm/elf.h. How do you think about that?
Sorry I've been slow about reviewing this, but I think just in the interest of getting a sane RV32I port up and running quickly (so we can try to get glibc in shape) I'm going to take this for now.
Do you mind submitting a cleanup patch?
Re: [PATCH v2 3/4] RISC-V: Add definiion of extract symbol's index and type for 32-bit
Palmer Dabbelt <[email protected]> ? 2018?7?5? ?? ??4:58???
Quoted 11 lines · zongbox at gmail.com
Quoted 9 lines
Christoph Hellwig <[email protected]> ? 2018?6?29? ?? ??3:12???
Quoted 7 lines · Zong Li
Quoted 1 line
Use generic marco to get the index and type of symbol.
Why do we even need this in a uapi header? Shouldn't
ELF_RISCV_R_SYMandELF_RISCV_R_TYPEmove tomodule.c? In that case we could just useCONFIG_64BIT.
Quoted 8 lines
Quoted 2 lines
Make sense. I even think the all definitions can be move to
include/asm/elf.h. How do you think about that?Sorry I've been slow about reviewing this, but I think just in the interest of getting a sane RV32I port up and running quickly (so we can try to get glibc in shape) I'm going to take this for now.
Do you mind submitting a cleanup patch?
I will send a patch to clean up. Thanks everyone to review this patchset.
Re: [PATCH v2 3/4] RISC-V: Add definiion of extract symbol's index and type for 32-bit
Quoted 15 lines · zongbox at gmail.com
Palmer Dabbelt <[email protected]> ? 2018?7?5? ?? ??4:58???
Quoted 14 lines · zongbox at gmail.com
Quoted 11 lines
Christoph Hellwig <[email protected]> ? 2018?6?29? ?? ??3:12???
Quoted 7 lines · Zong Li
Quoted 1 line
Use generic marco to get the index and type of symbol.
Why do we even need this in a uapi header? Shouldn't
ELF_RISCV_R_SYMandELF_RISCV_R_TYPEmove tomodule.c? In that case we could just useCONFIG_64BIT.Make sense. I even think the all definitions can be move to
include/asm/elf.h. How do you think about that?
Quoted 7 lines
Quoted 5 lines
Sorry I've been slow about reviewing this, but I think just in the interest of getting a sane RV32I port up and running quickly (so we can try to get glibc in shape) I'm going to take this for now.
Do you mind submitting a cleanup patch?
I will send a patch to clean up. Thanks everyone to review this patchset.
Well, thanks for doing the work :).
PATCH v2 4/4 RISC-V: Change variable type for 32-bit compatible
In reply to Zong Li--- arch/riscv/kernel/module.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
arch/riscv/kernel/module.c +11 -11
@@ -39,7 +39,7 @@ static int apply_r_riscv_64_rela(struct module *me, u32 *location, Elf_Addr v)static int apply_r_riscv_branch_rela (struct module *me,u32 *location,Elf_Addr v) { -s64 offset = (void *)v - (void *)location; +ptrdiff_t offset = (void *)v - (void *)location;u32 imm12 = (offset &0x1000 ) << (31 -12 );u32 imm11 = (offset &0x800 ) >> (11 -7 );u32 imm10_5 = (offset &0x7e0 ) << (30 -10 );
@@ -52,7 +52,7 @@ static int apply_r_riscv_branch_rela(struct module *me, u32 *location,static int apply_r_riscv_jal_rela (struct module *me,u32 *location,Elf_Addr v) { -s64 offset = (void *)v - (void *)location; +ptrdiff_t offset = (void *)v - (void *)location;u32 imm20 = (offset &0x100000 ) << (31 -20 );u32 imm19_12 = (offset &0xff000 );u32 imm11 = (offset &0x800 ) << (20 -11 );
@@ -65,7 +65,7 @@ static int apply_r_riscv_jal_rela(struct module *me, u32 *location,static int apply_r_riscv_rcv_branch_rela (struct module *me,u32 *location,Elf_Addr v) { -s64 offset = (void *)v - (void *)location; +ptrdiff_t offset = (void *)v - (void *)location;u16 imm8 = (offset &0x100 ) << (12 -8 );u16 imm7_6 = (offset &0xc0 ) >> (6 -5 );u16 imm5 = (offset &0x20 ) >> (5 -2 );
@@ -80,7 +80,7 @@ static int apply_r_riscv_rcv_branch_rela(struct module *me, u32 *location,static int apply_r_riscv_rvc_jump_rela (struct module *me,u32 *location,Elf_Addr v) { -s64 offset = (void *)v - (void *)location; +ptrdiff_t offset = (void *)v - (void *)location;u16 imm11 = (offset &0x800 ) << (12 -11 );u16 imm10 = (offset &0x400 ) >> (10 -8 );u16 imm9_8 = (offset &0x300 ) << (12 -11 );
@@ -98,7 +98,7 @@ static int apply_r_riscv_rvc_jump_rela(struct module *me, u32 *location,static int apply_r_riscv_pcrel_hi20_rela (struct module *me,u32 *location,Elf_Addr v) { -s64 offset = (void *)v - (void *)location; +ptrdiff_t offset = (void *)v - (void *)location;s32 hi20;if (offset != (s32 )offset) {
@@ -180,7 +180,7 @@ static int apply_r_riscv_lo12_s_rela(struct module *me, u32 *location,static int apply_r_riscv_got_hi20_rela (struct module *me,u32 *location,Elf_Addr v) { -s64 offset = (void *)v - (void *)location; +ptrdiff_t offset = (void *)v - (void *)location;s32 hi20;/* Always emit the got entry */
@@ -202,7 +202,7 @@ static int apply_r_riscv_got_hi20_rela(struct module *me, u32 *location,static int apply_r_riscv_call_plt_rela (struct module *me,u32 *location,Elf_Addr v) { -s64 offset = (void *)v - (void *)location; +ptrdiff_t offset = (void *)v - (void *)location;s32 fill_v = offset;u32 hi20, lo12;
@@ -229,7 +229,7 @@ static int apply_r_riscv_call_plt_rela(struct module *me, u32 *location,static int apply_r_riscv_call_rela (struct module *me,u32 *location,Elf_Addr v) { -s64 offset = (void *)v - (void *)location; +ptrdiff_t offset = (void *)v - (void *)location;s32 fill_v = offset;u32 hi20, lo12;
@@ -349,7 +349,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,unsigned int j;for (j =0 ; j < sechdrs[relsec].sh_size /sizeof (*rel); j++) { -u64 hi20_loc = +unsigned long hi20_loc = sechdrs[sechdrs[relsec].sh_info].sh_addr + rel[j].r_offset;u32 hi20_type =ELF_RISCV_R_TYPE (rel[j].r_info);
@@ -362,12 +362,12 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,Elf_Sym *hi20_sym = (Elf_Sym *)sechdrs[symindex].sh_addr +ELF_RISCV_R_SYM (rel[j].r_info); -u64 hi20_sym_val = +unsigned long hi20_sym_val = hi20_sym->st_value + rel[j].r_addend;/* Calculate lo12 */ -u64 offset = hi20_sym_val - hi20_loc; +size_t offset = hi20_sym_val - hi20_loc;if (IS_ENABLED (CONFIG_MODULE_SECTIONS ) && hi20_type ==R_RISCV_GOT_HI20 ) { offset = module_emit_got_entry(
Signature · 1 line
2.16.1
Re: [PATCH v2 4/4] RISC-V: Change variable type for 32-bit compatible
Quoted 1 line · Zong Li
Signed-off-by Zong Li <[email protected]>
Looks good,
Btw, what kind of userspace do you use for riscv32? Do you have an easy to use root file system available somewhere (or a way to build one)?
Christoph Hellwig <[email protected]> ? 2018?6?29? ?? ??3:23???
Quoted 4 lines
Btw, what kind of userspace do you use for riscv32? Do you have an easy to use root file system available somewhere (or a way to build one)?
I'm porting 32 bit riscv glibc now, and it is almost completion but still has few fail cases of glibc testsuite.
I built the root file system consist of busybox, bash and dropbear and so on. I can push the
rootfs I used or a build script to github if somebody need it.