1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
stat64 on sparc64 failed to get correct major/minor dev
Description of problem:
The reported device major/minor is not correct, e.g: stat /dev/zero:
Reported: Device type: 0,10500000
Correct : Device type: 1,5
Steps to reproduce:
1. "stat /dev/zero" or "ls -l /dev/zero"
Additional information:
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 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;
uint64_t st_ino;
uint64_t st_nlink;
@@ -1476,14 +1475,13 @@ struct target_stat64 {
unsigned int st_uid;
unsigned int st_gid;
- unsigned char __pad2[6];
- unsigned short st_rdev;
+ unsigned int __pad0;
+ uint64_t st_rdev;
int64_t st_size;
int64_t st_blksize;
- unsigned char __pad4[4];
- unsigned int st_blocks;
+ int64_t st_blocks;
abi_ulong target_st_atime;
abi_ulong target_st_atime_nsec;
@@ -1522,8 +1520,7 @@ struct target_stat {
#define TARGET_HAS_STRUCT_STAT64
struct target_stat64 {
- unsigned char __pad0[6];
- unsigned short st_dev;
+ uint64_t st_dev;
uint64_t st_ino;
@@ -1533,8 +1530,7 @@ struct target_stat64 {
unsigned int st_uid;
unsigned int st_gid;
- unsigned char __pad2[6];
- unsigned short st_rdev;
+ uint64_t st_rdev;
unsigned char __pad3[8];
```
|