Skip to content
This repository was archived by the owner on Nov 26, 2025. It is now read-only.

Commit c883b84

Browse files
authored
fix: x86 fstat testcase fail (#37)
1 parent 4c70ea5 commit c883b84

File tree

2 files changed

+96
-23
lines changed

2 files changed

+96
-23
lines changed

api/src/imp/fs/stat.rs

Lines changed: 95 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,48 @@ use crate::{
88
syscall_instrument,
99
};
1010

11+
#[cfg(target_arch = "x86_64")]
12+
#[derive(Debug, Clone, Copy, Default)]
13+
#[repr(C)]
14+
pub struct Kstat {
15+
/// 设备
16+
pub st_dev: u64,
17+
/// inode 编号
18+
pub st_ino: u64,
19+
/// 硬链接数
20+
pub st_nlink: u64,
21+
/// 文件类型
22+
pub st_mode: u32,
23+
/// 用户id
24+
pub st_uid: u32,
25+
/// 用户组id
26+
pub st_gid: u32,
27+
/// padding
28+
pub __pad0: u32,
29+
/// 设备号
30+
pub st_rdev: u64,
31+
/// 文件大小
32+
pub st_size: i64,
33+
/// 块大小
34+
pub st_blksize: i64,
35+
/// 块个数
36+
pub st_blocks: i64,
37+
/// 最后一次访问时间(秒)
38+
pub st_atime_sec: u64,
39+
/// 最后一次访问时间(纳秒)
40+
pub st_atime_nsec: u64,
41+
/// 最后一次修改时间(秒)
42+
pub st_mtime_sec: u64,
43+
/// 最后一次修改时间(纳秒)
44+
pub st_mtime_nsec: u64,
45+
/// 最后一次改变状态时间(秒)
46+
pub st_ctime_sec: u64,
47+
/// 最后一次改变状态时间(纳秒)
48+
pub st_ctime_nsec: u64,
49+
pub __unused: [i64; 3],
50+
}
51+
52+
#[cfg(not(target_arch = "x86_64"))]
1153
#[derive(Debug, Clone, Copy, Default)]
1254
#[repr(C)]
1355
pub struct Kstat {
@@ -26,29 +68,58 @@ pub struct Kstat {
2668
/// 设备号
2769
pub st_rdev: u64,
2870
/// padding
29-
pub _pad0: u64,
71+
pub __pad1: u64,
3072
/// 文件大小
31-
pub st_size: u64,
73+
pub st_size: i64,
3274
/// 块大小
33-
pub st_blksize: u32,
75+
pub st_blksize: i32,
3476
/// padding
35-
pub _pad1: u32,
77+
pub __pad2: i32,
3678
/// 块个数
37-
pub st_blocks: u64,
79+
pub st_blocks: i64,
3880
/// 最后一次访问时间(秒)
39-
pub st_atime_sec: isize,
81+
pub st_atime_sec: i64,
4082
/// 最后一次访问时间(纳秒)
41-
pub st_atime_nsec: isize,
83+
pub st_atime_nsec: u64,
4284
/// 最后一次修改时间(秒)
43-
pub st_mtime_sec: isize,
85+
pub st_mtime_sec: i64,
4486
/// 最后一次修改时间(纳秒)
45-
pub st_mtime_nsec: isize,
87+
pub st_mtime_nsec: u64,
4688
/// 最后一次改变状态时间(秒)
47-
pub st_ctime_sec: isize,
89+
pub st_ctime_sec: i64,
4890
/// 最后一次改变状态时间(纳秒)
49-
pub st_ctime_nsec: isize,
91+
pub st_ctime_nsec: u64,
92+
pub __unused4: u32,
93+
pub __unused5: u32,
94+
}
95+
96+
#[cfg(target_arch = "x86_64")]
97+
impl From<arceos_posix_api::ctypes::stat> for Kstat {
98+
fn from(stat: arceos_posix_api::ctypes::stat) -> Self {
99+
Self {
100+
st_dev: stat.st_dev,
101+
st_ino: stat.st_ino,
102+
st_nlink: stat.st_nlink as u64,
103+
st_mode: stat.st_mode,
104+
st_uid: stat.st_uid,
105+
st_gid: stat.st_gid,
106+
__pad0: 0_u32,
107+
st_rdev: stat.st_rdev,
108+
st_size: stat.st_size,
109+
st_blksize: stat.st_blksize,
110+
st_blocks: stat.st_blocks,
111+
st_atime_sec: stat.st_atime.tv_sec as u64,
112+
st_atime_nsec: stat.st_atime.tv_nsec as u64,
113+
st_mtime_sec: stat.st_mtime.tv_sec as u64,
114+
st_mtime_nsec: stat.st_mtime.tv_nsec as u64,
115+
st_ctime_sec: stat.st_ctime.tv_sec as u64,
116+
st_ctime_nsec: stat.st_ctime.tv_nsec as u64,
117+
__unused: [0_i64; 3],
118+
}
119+
}
50120
}
51121

122+
#[cfg(not(target_arch = "x86_64"))]
52123
impl From<arceos_posix_api::ctypes::stat> for Kstat {
53124
fn from(stat: arceos_posix_api::ctypes::stat) -> Self {
54125
Self {
@@ -59,17 +130,19 @@ impl From<arceos_posix_api::ctypes::stat> for Kstat {
59130
st_uid: stat.st_uid,
60131
st_gid: stat.st_gid,
61132
st_rdev: stat.st_rdev,
62-
_pad0: 0,
63-
st_size: stat.st_size as u64,
64-
st_blksize: stat.st_blksize as u32,
65-
_pad1: 0,
66-
st_blocks: stat.st_blocks as u64,
67-
st_atime_sec: stat.st_atime.tv_sec as isize,
68-
st_atime_nsec: stat.st_atime.tv_nsec as isize,
69-
st_mtime_sec: stat.st_mtime.tv_sec as isize,
70-
st_mtime_nsec: stat.st_mtime.tv_nsec as isize,
71-
st_ctime_sec: stat.st_ctime.tv_sec as isize,
72-
st_ctime_nsec: stat.st_ctime.tv_nsec as isize,
133+
__pad1: 0_u64,
134+
st_size: stat.st_size,
135+
st_blksize: stat.st_blksize as i32,
136+
__pad2: 0_i32,
137+
st_blocks: stat.st_blocks,
138+
st_atime_sec: stat.st_atime.tv_sec,
139+
st_atime_nsec: stat.st_atime.tv_nsec as u64,
140+
st_mtime_sec: stat.st_mtime.tv_sec,
141+
st_mtime_nsec: stat.st_mtime.tv_nsec as u64,
142+
st_ctime_sec: stat.st_ctime.tv_sec,
143+
st_ctime_nsec: stat.st_ctime.tv_nsec as u64,
144+
__unused4: 0_u32,
145+
__unused5: 0_u32,
73146
}
74147
}
75148
}

src/syscall.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use starry_core::task::{time_stat_from_kernel_to_user, time_stat_from_user_to_ke
88
use syscalls::Sysno;
99

1010
#[register_trap_handler(SYSCALL)]
11-
fn handle_syscall(tf: &TrapFrame, syscall_num: usize) -> isize {
11+
fn handle_syscall(tf: &mut TrapFrame, syscall_num: usize) -> isize {
1212
info!("Syscall {:?}", Sysno::from(syscall_num as u32));
1313
time_stat_from_user_to_kernel();
1414
let result: LinuxResult<isize> = match Sysno::from(syscall_num as u32) {

0 commit comments

Comments
 (0)