libc_core/arch/mod.rs
1//! This module provides the `libc` types for each architecture.
2
3#[cfg(target_arch = "aarch64")]
4pub mod aarch64;
5#[cfg(target_arch = "aarch64")]
6pub use aarch64::{MContext, UContext};
7#[cfg(target_arch = "loongarch64")]
8pub mod loongarch64;
9#[cfg(target_arch = "loongarch64")]
10pub use loongarch64::{MContext, UContext};
11#[cfg(target_arch = "riscv64")]
12pub mod riscv64;
13#[cfg(target_arch = "riscv64")]
14pub use riscv64::{MContext, UContext};
15#[cfg(target_arch = "x86_64")]
16pub mod x86_64;
17#[cfg(target_arch = "x86_64")]
18pub use x86_64::{MContext, UContext};
19
20use crate::types::TimeSpec;
21
22bitflags! {
23 /// 信号处理栈的标志位,控制备用信号栈(alternate signal stack)的行为。
24 #[derive(Debug, Clone)]
25 pub struct SignalStackFlags: u32 {
26 /// 当前正在备用信号栈上执行(内核设置此位,用户态只读)。
27 const ONSTACK = 1;
28 /// 禁用备用信号栈(不会在该栈上调用信号处理函数)。
29 const DISABLE = 2;
30 /// 当信号处理程序在备用栈上返回时自动禁用备用栈(Linux 特有)。
31 const AUTODISARM = 0x80000000;
32 }
33}
34
35/// 备用信号栈(alternate signal stack)
36///
37/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/x86_64/bits/signal.h#L91>
38#[repr(C)]
39#[derive(Debug, Clone)]
40pub struct UStack {
41 /// 栈顶指针(备用信号栈的栈顶地址,通常是向下增长的内存区域)。
42 /// 对应 C 中的 void *ss_sp;
43 pub sp: usize,
44 /// 标志位,表示备用栈的状态,比如是否启用、是否正在使用等。
45 /// 对应 C 中的 int ss_flags;
46 pub flags: SignalStackFlags,
47 /// 栈的大小(以字节为单位),表示备用信号栈的长度。
48 /// 对应 C 中的 size_t ss_size;
49 pub size: usize,
50}
51
52/// 文件的状态信息,类似于 Linux 中的 `stat` 结构体。
53#[derive(Debug, Default, Clone, PartialEq, Eq)]
54#[cfg_attr(
55 feature = "zerocopy",
56 derive(
57 zerocopy::FromBytes,
58 zerocopy::Immutable,
59 zerocopy::IntoBytes,
60 zerocopy::KnownLayout
61 )
62)]
63pub struct StatMode(u32);
64
65bitflags! {
66 impl StatMode: u32 {
67 /// Null
68 const NULL = 0;
69 /// Type
70 const TYPE_MASK = 0o170000;
71 /// FIFO
72 const FIFO = 0o010000;
73 /// character device
74 const CHAR = 0o020000;
75 /// directory
76 const DIR = 0o040000;
77 /// block device
78 const BLOCK = 0o060000;
79 /// ordinary regular file
80 const FILE = 0o100000;
81 /// symbolic link
82 const LINK = 0o120000;
83 /// socket
84 const SOCKET = 0o140000;
85
86 /// Set-user-ID on execution.
87 const SET_UID = 0o4000;
88 /// Set-group-ID on execution.
89 const SET_GID = 0o2000;
90
91 /// Read, write, execute/search by owner.
92 const OWNER_MASK = 0o700;
93 /// Read permission, owner.
94 const OWNER_READ = 0o400;
95 /// Write permission, owner.
96 const OWNER_WRITE = 0o200;
97 /// Execute/search permission, owner.
98 const OWNER_EXEC = 0o100;
99
100 /// Read, write, execute/search by group.
101 const GROUP_MASK = 0o70;
102 /// Read permission, group.
103 const GROUP_READ = 0o40;
104 /// Write permission, group.
105 const GROUP_WRITE = 0o20;
106 /// Execute/search permission, group.
107 const GROUP_EXEC = 0o10;
108
109 /// Read, write, execute/search by others.
110 const OTHER_MASK = 0o7;
111 /// Read permission, others.
112 const OTHER_READ = 0o4;
113 /// Write permission, others.
114 const OTHER_WRITE = 0o2;
115 /// Execute/search permission, others.
116 const OTHER_EXEC = 0o1;
117 }
118}
119
120#[repr(C)]
121#[cfg_attr(
122 feature = "zerocopy",
123 derive(
124 zerocopy::FromBytes,
125 zerocopy::Immutable,
126 zerocopy::IntoBytes,
127 zerocopy::KnownLayout
128 )
129)]
130#[derive(Debug, Default, Clone)]
131#[cfg(not(target_arch = "x86_64"))]
132/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/aarch64/kstat.h#L1>
133/// 文件的状态信息,类似于 Linux 中的 `stat` 结构体。
134pub struct Stat {
135 /// 设备号,表示文件所在设备的标识符。
136 pub dev: u64,
137 /// inode 号,表示文件在文件系统中的唯一标识符。
138 pub ino: u64,
139 /// 文件类型和访问权限,使用 `StatMode` 类型表示。
140 pub mode: StatMode,
141 /// 文件的硬链接数,表示指向该文件的链接数量。
142 pub nlink: u32,
143 /// 文件所有者的用户ID(UID)。
144 pub uid: u32,
145 /// 文件所有者的组ID(GID)。
146 pub gid: u32,
147 /// 设备文件的设备号,表示特殊设备文件的主设备号和次设备号。
148 pub rdev: u64,
149 /// 保留字段,用于对齐或将来扩展使用。
150 pub __pad: u64,
151 /// 文件的大小,以字节为单位。
152 pub size: u64,
153 /// 文件的块大小,文件系统为文件分配的块的大小。
154 pub blksize: u32,
155 /// 保留字段,用于对齐或将来扩展使用。
156 pub __pad2: u32,
157 /// 文件的占用块数,文件占用的实际磁盘块数。
158 pub blocks: u64,
159 /// 文件的最后访问时间(以 `TimeSpec` 表示)。
160 pub atime: TimeSpec,
161 /// 文件的最后修改时间(以 `TimeSpec` 表示)。
162 pub mtime: TimeSpec,
163 /// 文件的最后状态变更时间(以 `TimeSpec` 表示)。
164 pub ctime: TimeSpec,
165}
166
167#[repr(C)]
168#[cfg_attr(
169 feature = "zerocopy",
170 derive(
171 zerocopy::FromBytes,
172 zerocopy::Immutable,
173 zerocopy::IntoBytes,
174 zerocopy::KnownLayout
175 )
176)]
177#[derive(Debug, Default, Clone)]
178#[cfg(target_arch = "x86_64")]
179/// 文件的状态信息,类似于 Linux 中的 `stat` 结构体。
180///
181/// MUSL: <https://github.com/bminor/musl/blob/c47ad25ea3b484e10326f933e927c0bc8cded3da/arch/x86_64/bits/stat.h#L4>
182/// 在 x86_64上, blksize_t 的大小为 8 字节, 而不是 4 字节,指向 long
183pub struct Stat {
184 /// 设备号,表示文件所在设备的标识符。
185 pub dev: u64,
186 /// inode 号,表示文件在文件系统中的唯一标识符。
187 pub ino: u64,
188 /// 文件的硬链接数,表示指向该文件的链接数量。
189 pub nlink: u64,
190 /// 文件类型和访问权限,使用 `StatMode` 类型表示。
191 pub mode: StatMode,
192 /// 文件所有者的用户ID(UID)。
193 pub uid: u32,
194 /// 文件所有者的组ID(GID)。
195 pub gid: u32,
196 /// 填充字段,确保结构体大小对齐。
197 pub _pad0: u32,
198 /// 设备文件的设备号,表示特殊设备文件的主设备号和次设备号。
199 pub rdev: u64,
200 /// 文件的大小,以字节为单位。
201 pub size: u64,
202 /// 文件的块大小,文件系统为文件分配的块的大小。
203 pub blksize: u64,
204 /// 文件的占用块数,文件占用的实际磁盘块数。
205 pub blocks: u64,
206 /// 文件的最后访问时间(以 `TimeSpec` 表示)。
207 pub atime: TimeSpec,
208 /// 文件的最后修改时间(以 `TimeSpec` 表示)。
209 pub mtime: TimeSpec,
210 /// 文件的最后状态变更时间(以 `TimeSpec` 表示)。
211 pub ctime: TimeSpec,
212}