lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <bc680815-b67b-638f-a920-03a0ac65540d@loongson.cn>
Date: Mon, 4 Aug 2025 10:51:17 +0800
From: Bibo Mao <maobibo@...ngson.cn>
To: Jiaxun Yang <jiaxun.yang@...goat.com>
Cc: Huacai Chen <chenhuacai@...nel.org>, Xuerui Wang <kernel@...0n.name>,
 Xi Ruoyao <xry111@...111.site>, loongarch@...ts.linux.dev,
 linux-kernel@...r.kernel.org
Subject: Re: [PATCH v3] LoongArch: Implement physical address with ELF program
 header



On 2025/8/1 下午4:57, Jiaxun Yang wrote:
> 
> 
>> 2025年7月23日 16:06,Bibo Mao <maobibo@...ngson.cn> 写道:
>>
>> With structure elf64_phdr, field p_paddr is physical address of the
>> segment. And it is convenient for qemu to calculate the physical
>> address when directly boot ELF kernel image.
>>
>> Otherwise QEMU needs convert virtual address p_vaddr into physical
>> address, the conversion logic assumes that DMW method is used where
>> 48 bit physical address is supported. However with direct MMU mapping
>> method with start address from 0xFFFF800000000000, only 47 bit physical
>> address is supported. QEMU cannot assume the kernel behavior at kernel
>> loading stage.
>>
>> Here add physical address indication in ELF program header, it is
>> convenient to get physical kernel loading address.
> 
> Hi Bibo,
> 
> Thanks for your patch. Unfortunately it breaks PMON’s DWARF debugging
> Feature, causing exception on list symbols.
> 
> I’ll try to investigate.
Hi Jiaxun.

Thanks for reporting it. Could you describe the problem with more 
detailed information? such as which command of PMON etc.

Regards
Bibo Mao
> 
> Thanks
> Jiaxun
> 
> 
> 
>>
>> Here is output with command readelf -l vmlinux with patch:
>> Elf file type is EXEC (Executable file)
>> Entry point 0x90000000015f5000
>> There are 2 program headers, starting at offset 64
>> Program Headers:
>>    Type           Offset             VirtAddr           PhysAddr
>>                   FileSiz            MemSiz              Flags  Align
>>    LOAD           0x0000000000010000 0x9000000000200000 0x0000000000200000
>>                   0x000000000293b000 0x0000000002a79b98  RWE    0x10000
>>
>> And output with command readelf -l vmlinux without the patch:
>> Elf file type is EXEC (Executable file)
>> Entry point 0x90000000015f5000
>> There are 2 program headers, starting at offset 64
>> Program Headers:
>>    Type           Offset             VirtAddr           PhysAddr
>>                   FileSiz            MemSiz              Flags  Align
>>    LOAD           0x0000000000010000 0x9000000000200000 0x9000000000200000
>>                   0x000000000293b000 0x0000000002a79b98  RWE    0x10000
>>
>> Signed-off-by: Bibo Mao <maobibo@...ngson.cn>
>> ---
>> v2 ... v3:
>> 1. Fix compile issue where macro PHYS_OFFSET is not defined with assemble
>>     code.
>> v1 ... v2:
>> 1. Set LOAD_OFFSET with PAGE_OFFSET rather than CACHE_BASE, since it
>>     is generic with PAGE_OFFSET.
>> 2. Add AT information with missing edata_padding section.
>> ---
>> arch/loongarch/include/asm/addrspace.h |  2 +-
>> arch/loongarch/kernel/vmlinux.lds.S    | 36 +++++++++++++++++---------
>> 2 files changed, 25 insertions(+), 13 deletions(-)
>>
>> diff --git a/arch/loongarch/include/asm/addrspace.h b/arch/loongarch/include/asm/addrspace.h
>> index e739dbc6329d..18f6c2b469bb 100644
>> --- a/arch/loongarch/include/asm/addrspace.h
>> +++ b/arch/loongarch/include/asm/addrspace.h
>> @@ -18,10 +18,10 @@
>> /*
>> * This gives the physical RAM offset.
>> */
>> -#ifndef __ASSEMBLER__
>> #ifndef PHYS_OFFSET
>> #define PHYS_OFFSET	_UL(0)
>> #endif
>> +#ifndef __ASSEMBLER__
>> extern unsigned long vm_map_base;
>> #endif /* __ASSEMBLER__ */
>>
>> diff --git a/arch/loongarch/kernel/vmlinux.lds.S b/arch/loongarch/kernel/vmlinux.lds.S
>> index 08ea921cdec1..8ce6b0d948f4 100644
>> --- a/arch/loongarch/kernel/vmlinux.lds.S
>> +++ b/arch/loongarch/kernel/vmlinux.lds.S
>> @@ -3,10 +3,12 @@
>> #include <asm/asm-offsets.h>
>> #include <asm/thread_info.h>
>> #include <asm/orc_lookup.h>
>> +#include <asm/addrspace.h>
>>
>> #define PAGE_SIZE _PAGE_SIZE
>> #define RO_EXCEPTION_TABLE_ALIGN	4
>> #define PHYSADDR_MASK			0xffffffffffff /* 48-bit */
>> +#define LOAD_OFFSET			PAGE_OFFSET
>>
>> /*
>> * Put .bss..swapper_pg_dir as the first thing in .bss. This will
>> @@ -42,7 +44,7 @@ SECTIONS
>>
>> 	. = ALIGN(PECOFF_SEGMENT_ALIGN);
>> 	_stext = .;
>> -	.text : {
>> +	.text : AT(ADDR(.text) - LOAD_OFFSET) {
>> 		TEXT_TEXT
>> 		SCHED_TEXT
>> 		LOCK_TEXT
>> @@ -60,7 +62,7 @@ SECTIONS
>> 	__inittext_begin = .;
>>
>> 	INIT_TEXT_SECTION(PAGE_SIZE)
>> -	.exit.text : {
>> +	.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {
>> 		EXIT_TEXT
>> 	}
>>
>> @@ -82,7 +84,7 @@ SECTIONS
>> 	}
>>
>> 	INIT_DATA_SECTION(16)
>> -	.exit.data : {
>> +	.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {
>> 		EXIT_DATA
>> 	}
>>
>> @@ -90,7 +92,7 @@ SECTIONS
>> 	PERCPU_SECTION(1 << CONFIG_L1_CACHE_SHIFT)
>> #endif
>>
>> -	.init.bss : {
>> +	.init.bss : AT(ADDR(.init.bss) - LOAD_OFFSET) {
>> 		*(.init.bss)
>> 	}
>> 	. = ALIGN(PECOFF_SEGMENT_ALIGN);
>> @@ -101,27 +103,34 @@ SECTIONS
>> 	_sdata = .;
>> 	RO_DATA(4096)
>>
>> -	.got : ALIGN(16) { *(.got) }
>> -	.plt : ALIGN(16) { *(.plt) }
>> -	.got.plt : ALIGN(16) { *(.got.plt) }
>> +	. =  ALIGN(16);
>> +	.got : AT(ADDR(.got) - LOAD_OFFSET) { *(.got) }
>> +	. =  ALIGN(16);
>> +	.plt : AT(ADDR(.plt) - LOAD_OFFSET) { *(.plt) }
>> +	. =  ALIGN(16);
>> +	.got.plt : AT(ADDR(.got.plt) - LOAD_OFFSET) { *(.got.plt) }
>>
>> 	RW_DATA(1 << CONFIG_L1_CACHE_SHIFT, PAGE_SIZE, THREAD_SIZE)
>>
>> -	.rela.dyn : ALIGN(8) {
>> +	. = ALIGN(8);
>> +	.rela.dyn : AT(ADDR(.rela.dyn) - LOAD_OFFSET) {
>> 		__rela_dyn_begin = .;
>> 		 *(.rela.dyn) *(.rela*)
>> 		__rela_dyn_end = .;
>> 	}
>>
>> #ifdef CONFIG_RELR
>> -	.relr.dyn : ALIGN(8) {
>> +	. = ALIGN(8);
>> +	.relr.dyn : AT(ADDR(.relr.dyn) - LOAD_OFFSET) {
>> 		__relr_dyn_begin = .;
>> 		 *(.relr.dyn)
>> 		__relr_dyn_end = .;
>> 	}
>> #endif
>>
>> -	.data.rel : { *(.data.rel*) }
>> +	.data.rel : AT(ADDR(.data.rel) - LOAD_OFFSET) {
>> +		*(.data.rel*)
>> +	}
>>
>> #ifdef CONFIG_RELOCATABLE
>> 	. = ALIGN(8);
>> @@ -134,10 +143,13 @@ SECTIONS
>>
>> 	ORC_UNWIND_TABLE
>>
>> -	.sdata : {
>> +	.sdata : AT(ADDR(.sdata) - LOAD_OFFSET) {
>> 		*(.sdata)
>> 	}
>> -	.edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGN); }
>> +	.edata_padding : AT(ADDR(.edata_padding) - LOAD_OFFSET) {
>> +		BYTE(0);
>> +		. = ALIGN(PECOFF_FILE_ALIGN);
>> +	}
>> 	_edata =  .;
>>
>> 	BSS_SECTION(0, SZ_64K, 8)
>>
>> base-commit: 89be9a83ccf1f88522317ce02f854f30d6115c41
>> -- 
>> 2.39.3
>>
>>


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ