Message ID | 1634561247-25499-22-git-send-email-gaosong@loongson.cn |
---|---|
State | New |
Headers | show |
Series | Add LoongArch linux-user emulation support | expand |
Hi Song, On 10/18/21 20:47, Song Gao wrote: > Signed-off-by: Song Gao <gaosong@loongson.cn> > Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> > Reviewed-by: Richard Henderson <richard.henderson@linaro.org> > --- > scripts/qemu-binfmt-conf.sh | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh > index 7de996d..5575bdd 100755 > --- a/scripts/qemu-binfmt-conf.sh > +++ b/scripts/qemu-binfmt-conf.sh > @@ -4,7 +4,7 @@ > qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \ > ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \ > sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \ > -microblaze microblazeel or1k x86_64 hexagon" > +microblaze microblazeel or1k x86_64 hexagon loongarch64" > > i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' > i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' > @@ -140,6 +140,10 @@ hexagon_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x > hexagon_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' > hexagon_family=hexagon > > +loongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01' > +loongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' Here the EI_OSABI (7th, 0-based offset) byte is ignored which is okay (we want at least ELFOSABI_SYSV=0 and ELFOSABI_GNU=3 but not others, mask of this byte could be "\xfc" to exclude values > 3). However, the EI_ABIVERSION (8th) byte is fixed to be zero; according to the draft LoongArch ELF psABI spec [1] there might be future revision(s) to necessitate a bump of ABI version, but it's highly unlikely to in turn require modifications to QEMU code, with almost all logic happening in the dynamic loader. I suggest unmasking this whole byte (setting mask for this byte to "\x00"). [1]: https://github.com/loongson/LoongArch-Documentation/blob/50e62f196afd4fae7f25dc98854167f97528046b/docs/LoongArch-ELF-ABI-EN.adoc > +loongarch64_family=loongarch > + > qemu_get_family() { > cpu=${HOST_ARCH:-$(uname -m)} > case "$cpu" in
Hi, Xuerui On 10/18/2021 11:49 PM, WANG Xuerui wrote: > Hi Song, > > On 10/18/21 20:47, Song Gao wrote: >> Signed-off-by: Song Gao <gaosong@loongson.cn> >> Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> >> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> >> --- >> scripts/qemu-binfmt-conf.sh | 6 +++++- >> 1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh >> index 7de996d..5575bdd 100755 >> --- a/scripts/qemu-binfmt-conf.sh >> +++ b/scripts/qemu-binfmt-conf.sh >> @@ -4,7 +4,7 @@ >> qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \ >> ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \ >> sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \ >> -microblaze microblazeel or1k x86_64 hexagon" >> +microblaze microblazeel or1k x86_64 hexagon loongarch64" >> i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' >> i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> @@ -140,6 +140,10 @@ hexagon_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x >> hexagon_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> hexagon_family=hexagon >> +loongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01' >> +loongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' > > Here the EI_OSABI (7th, 0-based offset) byte is ignored which is okay (we want at least ELFOSABI_SYSV=0 and ELFOSABI_GNU=3 but not others, mask of this byte could be "\xfc" to exclude values > 3). > The EI_OSABI can not be modified. If we support FreeBSD and OpenBSD in the future. > However, the EI_ABIVERSION (8th) byte is fixed to be zero; according to the draft LoongArch ELF psABI spec [1] there might be future revision(s) to necessitate a bump of ABI version, but it's highly unlikely to in turn require modifications to QEMU code, with almost all logic happening in the dynamic loader. I suggest unmasking this whole byte (setting mask for this byte to "\x00"). >That's a good suggestion, thank you very much. Thanks Song Gao
On 2021/10/21 14:24, Song Gao wrote: > Hi, Xuerui > > On 10/18/2021 11:49 PM, WANG Xuerui wrote: >> Hi Song, >> >> On 10/18/21 20:47, Song Gao wrote: >>> Signed-off-by: Song Gao <gaosong@loongson.cn> >>> Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn> >>> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> >>> --- >>> scripts/qemu-binfmt-conf.sh | 6 +++++- >>> 1 file changed, 5 insertions(+), 1 deletion(-) >>> >>> diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh >>> index 7de996d..5575bdd 100755 >>> --- a/scripts/qemu-binfmt-conf.sh >>> +++ b/scripts/qemu-binfmt-conf.sh >>> @@ -4,7 +4,7 @@ >>> qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \ >>> ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \ >>> sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \ >>> -microblaze microblazeel or1k x86_64 hexagon" >>> +microblaze microblazeel or1k x86_64 hexagon loongarch64" >>> i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' >>> i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >>> @@ -140,6 +140,10 @@ hexagon_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x >>> hexagon_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >>> hexagon_family=hexagon >>> +loongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01' >>> +loongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' >> Here the EI_OSABI (7th, 0-based offset) byte is ignored which is okay (we want at least ELFOSABI_SYSV=0 and ELFOSABI_GNU=3 but not others, mask of this byte could be "\xfc" to exclude values > 3). >> > The EI_OSABI can not be modified. If we support FreeBSD and OpenBSD in the future. Then the respective changes would belong to a different place than here, i.e. "binfmt" which is IIRC Linux-only? We can't support running BSD binaries on top of Linux with user-only emulation AFAIK. But again, leaving this as-is should pose minimal risk. Even if we only accept 0~3 at binfmt_misc matching time, we would still let through 1 and 2, so that's not enough and wouldn't make any difference. So while I don't think you're right wrt the reason you stated, I'd still agree with not touching this EI_OSABI mask byte.
diff --git a/scripts/qemu-binfmt-conf.sh b/scripts/qemu-binfmt-conf.sh index 7de996d..5575bdd 100755 --- a/scripts/qemu-binfmt-conf.sh +++ b/scripts/qemu-binfmt-conf.sh @@ -4,7 +4,7 @@ qemu_target_list="i386 i486 alpha arm armeb sparc sparc32plus sparc64 \ ppc ppc64 ppc64le m68k mips mipsel mipsn32 mipsn32el mips64 mips64el \ sh4 sh4eb s390x aarch64 aarch64_be hppa riscv32 riscv64 xtensa xtensaeb \ -microblaze microblazeel or1k x86_64 hexagon" +microblaze microblazeel or1k x86_64 hexagon loongarch64" i386_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' i386_mask='\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' @@ -140,6 +140,10 @@ hexagon_magic='\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x hexagon_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' hexagon_family=hexagon +loongarch64_magic='\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01' +loongarch64_mask='\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff' +loongarch64_family=loongarch + qemu_get_family() { cpu=${HOST_ARCH:-$(uname -m)} case "$cpu" in