On 3/28/23 04:48, Luca Bonissi wrote:
On qemu-sparc64 (userspace) the struct "target_stat64" is not correctly padded, so the
field st_rdev is not correctly aligned and will report wrong major/minor (e.g. for
/dev/zero it reports 0,0x10500000 instead of 1,5).
Here patch to solve the issue (it also fixes incorrect size on some fields):
--- qemu-20230327/linux-user/syscall_defs.h 2023-03-27 15:41:42.000000000
+0200
+++ qemu-20230327/linux-user/syscall_defs.h.new 2023-03-27
21:43:25.615115126 +0200
@@ -1450,7 +1450,7 @@ struct target_stat {
unsigned int st_dev;
abi_ulong st_ino;
unsigned int st_mode;
- unsigned int st_nlink;
+ short int st_nlink;
unsigned int st_uid;
unsigned int st_gid;
unsigned int st_rdev;
@@ -1465,8 +1465,7 @@ struct target_stat {
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 {
- unsigned char __pad0[6];
- unsigned short st_dev;
+ uint64_t st_dev;
All use of the normal C types is wrong for target structs.
You must use abi_{short,int,long} etc.
Otherwise, you may not get the alignment you're expecting.
r~