id = 1564 title = "stat64 on sparc64 failed to get correct major/minor dev" state = "opened" created_at = "2023-03-28T11:33:28.707Z" closed_at = "n/a" labels = ["linux-user", "target: sparc"] url = "https://gitlab.com/qemu-project/qemu/-/issues/1564" host-os = "Slackware 15.0" host-arch = "x86" qemu-version = "7.2.91" guest-os = "Slackware 14.2" guest-arch = "sparc64" description = """The reported device major/minor is not correct, e.g: stat /dev/zero: Reported: Device type: 0,10500000 Correct : Device type: 1,5""" reproduce = """1. "stat /dev/zero" or "ls -l /dev/zero"""" additional = """The problem is a missing padding into target_stat64 struct related to sparc64. Here patch to solve the issue (it also fixes some incorrect variables size): ``` --- qemu-20230327/linux-user/syscall_defs.h\t2023-03-27 15:41:42.000000000 +0200 +++ qemu-20230327/linux-user/syscall_defs.h.new\t2023-03-27 21:43:25.615115126 +0200 @@ -1450,7 +1450,7 @@ struct target_stat { \tunsigned int\tst_dev; \tabi_ulong\tst_ino; \tunsigned int\tst_mode; -\tunsigned int\tst_nlink; +\tshort int\tst_nlink; \tunsigned int\tst_uid; \tunsigned int\tst_gid; \tunsigned int\tst_rdev; @@ -1465,8 +1465,7 @@ struct target_stat { #define TARGET_HAS_STRUCT_STAT64 struct target_stat64 { -\tunsigned char\t__pad0[6]; -\tunsigned short\tst_dev; +\tuint64_t\tst_dev; \tuint64_t\tst_ino; \tuint64_t\tst_nlink; @@ -1476,14 +1475,13 @@ struct target_stat64 { \tunsigned int\tst_uid; \tunsigned int\tst_gid; -\tunsigned char\t__pad2[6]; -\tunsigned short\tst_rdev; +\tunsigned int\t__pad0; +\tuint64_t\tst_rdev; int64_t\t\tst_size; \tint64_t\t\tst_blksize; -\tunsigned char\t__pad4[4]; -\tunsigned int\tst_blocks; +\tint64_t\t\tst_blocks; \tabi_ulong\ttarget_st_atime; \tabi_ulong\ttarget_st_atime_nsec; @@ -1522,8 +1520,7 @@ struct target_stat { #define TARGET_HAS_STRUCT_STAT64 struct target_stat64 { -\tunsigned char\t__pad0[6]; -\tunsigned short\tst_dev; +\tuint64_t st_dev; \tuint64_t st_ino; @@ -1533,8 +1530,7 @@ struct target_stat64 { \tunsigned int\tst_uid; \tunsigned int\tst_gid; -\tunsigned char\t__pad2[6]; -\tunsigned short\tst_rdev; +\tuint64_t st_rdev; \tunsigned char\t__pad3[8]; ```"""