* [PATCH] linux-user: Fix struct statfs ABI on loongarch64
@ 2022-10-06 9:58 WANG Xuerui
2022-10-06 11:11 ` Philippe Mathieu-Daudé via
0 siblings, 1 reply; 2+ messages in thread
From: WANG Xuerui @ 2022-10-06 9:58 UTC (permalink / raw)
To: qemu-devel
Cc: Richard Henderson, Philippe Mathieu-Daudé,
WANG Xuerui, Song Gao, Xiaojuan Yang, Andreas K . Hüttel
Previously the 32-bit version was incorrectly chosen, leading to funny
but incorrect output from e.g. df(1). Simply select the version
corresponding to the 64-bit asm-generic definition.
For reference, this program should produce the same output no matter
natively compiled or not, for loongarch64 or not:
```c
#include <stdio.h>
#include <sys/statfs.h>
int main(int argc, const char *argv[])
{
struct statfs b;
if (statfs(argv[0], &b))
return 1;
printf("f_type = 0x%lx\n", b.f_type);
printf("f_bsize = %ld\n", b.f_bsize);
printf("f_blocks = %ld\n", b.f_blocks);
printf("f_bfree = %ld\n", b.f_bfree);
printf("f_bavail = %ld\n", b.f_bavail);
return 0;
}
// Native and expected emulated output after the fix:
//
// f_type = 0x9123683e
// f_bsize = 4096
// f_blocks = 268435456
// f_bfree = 168406890
// f_bavail = 168355058
// Output before the fix, note the messed layout:
//
// f_type = 0x10009123683e
// f_bsize = 723302085239504896
// f_blocks = 168355058
// f_bfree = 2250817541779750912
// f_bavail = 1099229433104
```
Fixes: 1f63019632 ("linux-user: Add LoongArch syscall support")
Signed-off-by: WANG Xuerui <xen0n@gentoo.org>
Cc: Song Gao <gaosong@loongson.cn>
Cc: Xiaojuan Yang <yangxiaojuan@loongson.cn>
Cc: Andreas K. Hüttel <dilfridge@gentoo.org>
---
linux-user/syscall_defs.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index 01ee10a88f..77864de57f 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -2262,7 +2262,8 @@ struct target_statfs64 {
};
#elif (defined(TARGET_PPC64) || defined(TARGET_X86_64) || \
defined(TARGET_SPARC64) || defined(TARGET_AARCH64) || \
- defined(TARGET_RISCV)) && !defined(TARGET_ABI32)
+ defined(TARGET_RISCV) || defined(TARGET_LOONGARCH64)) && \
+ !defined(TARGET_ABI32)
struct target_statfs {
abi_long f_type;
abi_long f_bsize;
--
2.38.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] linux-user: Fix struct statfs ABI on loongarch64
2022-10-06 9:58 [PATCH] linux-user: Fix struct statfs ABI on loongarch64 WANG Xuerui
@ 2022-10-06 11:11 ` Philippe Mathieu-Daudé via
0 siblings, 0 replies; 2+ messages in thread
From: Philippe Mathieu-Daudé via @ 2022-10-06 11:11 UTC (permalink / raw)
To: WANG Xuerui, qemu-devel
Cc: Richard Henderson, Song Gao, Xiaojuan Yang, Andreas K . Hüttel
On 6/10/22 11:58, WANG Xuerui wrote:
> Previously the 32-bit version was incorrectly chosen, leading to funny
> but incorrect output from e.g. df(1). Simply select the version
> corresponding to the 64-bit asm-generic definition.
>
> For reference, this program should produce the same output no matter
> natively compiled or not, for loongarch64 or not:
>
> ```c
> #include <stdio.h>
> #include <sys/statfs.h>
>
> int main(int argc, const char *argv[])
> {
> struct statfs b;
> if (statfs(argv[0], &b))
> return 1;
>
> printf("f_type = 0x%lx\n", b.f_type);
> printf("f_bsize = %ld\n", b.f_bsize);
> printf("f_blocks = %ld\n", b.f_blocks);
> printf("f_bfree = %ld\n", b.f_bfree);
> printf("f_bavail = %ld\n", b.f_bavail);
>
> return 0;
> }
>
> // Native and expected emulated output after the fix:
> //
> // f_type = 0x9123683e
> // f_bsize = 4096
> // f_blocks = 268435456
> // f_bfree = 168406890
> // f_bavail = 168355058
>
> // Output before the fix, note the messed layout:
> //
> // f_type = 0x10009123683e
> // f_bsize = 723302085239504896
> // f_blocks = 168355058
> // f_bfree = 2250817541779750912
> // f_bavail = 1099229433104
> ```
>
> Fixes: 1f63019632 ("linux-user: Add LoongArch syscall support")
> Signed-off-by: WANG Xuerui <xen0n@gentoo.org>
> Cc: Song Gao <gaosong@loongson.cn>
> Cc: Xiaojuan Yang <yangxiaojuan@loongson.cn>
> Cc: Andreas K. Hüttel <dilfridge@gentoo.org>
> ---
> linux-user/syscall_defs.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
> index 01ee10a88f..77864de57f 100644
> --- a/linux-user/syscall_defs.h
> +++ b/linux-user/syscall_defs.h
> @@ -2262,7 +2262,8 @@ struct target_statfs64 {
> };
> #elif (defined(TARGET_PPC64) || defined(TARGET_X86_64) || \
> defined(TARGET_SPARC64) || defined(TARGET_AARCH64) || \
> - defined(TARGET_RISCV)) && !defined(TARGET_ABI32)
> + defined(TARGET_RISCV) || defined(TARGET_LOONGARCH64)) && \
> + !defined(TARGET_ABI32)
> struct target_statfs {
> abi_long f_type;
> abi_long f_bsize;
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-10-06 11:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-06 9:58 [PATCH] linux-user: Fix struct statfs ABI on loongarch64 WANG Xuerui
2022-10-06 11:11 ` Philippe Mathieu-Daudé via
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.