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