esp_rom_sys/syscall/
mod.rs

1#![allow(non_camel_case_types)]
2
3use core::ffi::{c_char, c_int, c_long, c_void};
4
5// future chips or ECOs _might_ be different - at least ESP-IDF defines the struct per chip
6#[cfg_attr(
7    any(
8        esp32, esp32s2, esp32s3, esp32c2, esp32c3, esp32c5, esp32c6, esp32c61, esp32h2
9    ),
10    path = "v1.rs"
11)]
12pub(crate) mod chip_specific;
13
14pub type clock_t = c_long;
15
16#[repr(C)]
17#[derive(Debug, Copy, Clone)]
18pub struct tms {
19    _unused: [u8; 0],
20}
21
22#[repr(C)]
23#[derive(Debug, Copy, Clone)]
24pub struct timeval {
25    _unused: [u8; 0],
26}
27
28#[repr(C)]
29#[derive(Debug, Copy, Clone)]
30pub struct stat {
31    _unused: [u8; 0],
32}
33
34#[repr(C)]
35#[derive(Debug, Copy, Clone)]
36pub struct __lock {
37    _unused: [u8; 0],
38}
39
40pub type _LOCK_T = *mut __lock;
41
42pub type _lock_t = _LOCK_T;
43
44#[repr(C)]
45#[derive(Debug, Copy, Clone)]
46pub struct _iobuf {
47    pub _placeholder: *mut c_void,
48}
49
50#[allow(clippy::upper_case_acronyms)]
51pub type __FILE = _iobuf;
52
53#[allow(clippy::upper_case_acronyms)]
54pub type FILE = __FILE;
55
56pub type __tm = ();
57pub type _rand48 = ();
58pub type _misc_reent = ();
59pub type __locale_t = ();
60pub type _mprec = ();
61pub type _on_exit_args = ();
62
63#[repr(C)]
64#[derive(Copy, Clone)]
65pub struct _atexit {
66    pub _next: *mut _atexit,
67    pub _ind: c_int,
68    pub _fns: [Option<unsafe extern "C" fn()>; 32],
69    pub _on_exit_args_ptr: *mut _on_exit_args,
70}
71
72#[repr(C)]
73#[derive(Copy, Clone)]
74pub struct _glue {
75    pub _next: *mut _glue,
76    pub _niobs: c_int,
77    pub _iobs: *mut __FILE,
78}
79
80/// Reentrancy struct.
81#[repr(C)]
82#[derive(Copy, Clone)]
83pub struct _reent {
84    // Consider as opaque for now.
85    _errno: c_int,
86    _stdin: *mut __FILE,
87    _stdout: *mut __FILE,
88    _stderr: *mut __FILE,
89    _inc: c_int,
90    _emergency: *mut c_char,
91    _reserved_0: c_int,
92    _reserved_1: c_int,
93    _locale: *mut __locale_t,
94    _mp: *mut _mprec,
95    __cleanup: Option<unsafe extern "C" fn(arg1: *mut _reent)>,
96    _gamma_signgam: c_int,
97    _cvtlen: c_int,
98    _cvtbuf: *mut c_char,
99    _r48: *mut _rand48,
100    _localtime_buf: *mut __tm,
101    _asctime_buf: *mut c_char,
102    _sig_func: *mut Option<unsafe extern "C" fn(arg1: c_int)>,
103    _reserved_6: *mut _atexit,
104    _reserved_7: _atexit,
105    _reserved_8: _glue,
106    __sf: *mut __FILE,
107    _misc: *mut _misc_reent,
108    _signal_buf: *mut c_char,
109}
110
111pub type va_list = *mut ::core::ffi::c_char;
112
113/// The syscall table that ROM functions use.
114#[allow(clippy::missing_transmute_annotations)]
115pub static mut SYSCALL_TABLE: chip_specific::syscall_stub_table = unsafe {
116    chip_specific::syscall_stub_table {
117        __getreent: Some(core::mem::transmute(not_implemented as *const fn())),
118        _malloc_r: Some(core::mem::transmute(not_implemented as *const fn())),
119        _free_r: Some(core::mem::transmute(not_implemented as *const fn())),
120        _realloc_r: Some(core::mem::transmute(not_implemented as *const fn())),
121        _calloc_r: Some(core::mem::transmute(not_implemented as *const fn())),
122        _abort: Some(abort_wrapper),
123        _system_r: Some(core::mem::transmute(not_implemented as *const fn())),
124        _rename_r: Some(core::mem::transmute(not_implemented as *const fn())),
125        _times_r: Some(core::mem::transmute(not_implemented as *const fn())),
126        _gettimeofday_r: Some(core::mem::transmute(not_implemented as *const fn())),
127        _raise_r: Some(core::mem::transmute(not_implemented as *const fn())),
128        _unlink_r: Some(core::mem::transmute(not_implemented as *const fn())),
129        _link_r: Some(core::mem::transmute(not_implemented as *const fn())),
130        _stat_r: Some(core::mem::transmute(not_implemented as *const fn())),
131        _fstat_r: Some(core::mem::transmute(not_implemented as *const fn())),
132        _sbrk_r: Some(core::mem::transmute(not_implemented as *const fn())),
133        _getpid_r: Some(core::mem::transmute(not_implemented as *const fn())),
134        _kill_r: Some(core::mem::transmute(not_implemented as *const fn())),
135        _exit_r: Some(core::mem::transmute(not_implemented as *const fn())),
136        _close_r: Some(core::mem::transmute(not_implemented as *const fn())),
137        _open_r: Some(core::mem::transmute(not_implemented as *const fn())),
138        _write_r: Some(core::mem::transmute(not_implemented as *const fn())),
139        _lseek_r: Some(core::mem::transmute(not_implemented as *const fn())),
140        _read_r: Some(core::mem::transmute(not_implemented as *const fn())),
141        _retarget_lock_init: Some(core::mem::transmute(not_implemented as *const fn())),
142        _retarget_lock_init_recursive: Some(core::mem::transmute(not_implemented as *const fn())),
143        _retarget_lock_close: Some(core::mem::transmute(not_implemented as *const fn())),
144        _retarget_lock_close_recursive: Some(core::mem::transmute(not_implemented as *const fn())),
145        _retarget_lock_acquire: Some(core::mem::transmute(not_implemented as *const fn())),
146        _retarget_lock_acquire_recursive: Some(core::mem::transmute(
147            not_implemented as *const fn(),
148        )),
149        _retarget_lock_try_acquire: Some(core::mem::transmute(not_implemented as *const fn())),
150        _retarget_lock_try_acquire_recursive: Some(core::mem::transmute(
151            not_implemented as *const fn(),
152        )),
153        _retarget_lock_release: Some(core::mem::transmute(not_implemented as *const fn())),
154        _retarget_lock_release_recursive: Some(core::mem::transmute(
155            not_implemented as *const fn(),
156        )),
157        _printf_float: Some(core::mem::transmute(not_implemented as *const fn())),
158        _scanf_float: Some(core::mem::transmute(not_implemented as *const fn())),
159        __assert_func: Some(super::__assert_func),
160        __sinit: Some(core::mem::transmute(not_implemented as *const fn())),
161        _cleanup_r: Some(core::mem::transmute(not_implemented as *const fn())),
162    }
163};
164
165unsafe extern "C" fn not_implemented() {
166    panic!("Function called via syscall table is not implemented!");
167}
168
169unsafe extern "C" fn abort_wrapper() {
170    panic!("Abort called from ROM code!");
171}
172
173/// Initialize the syscall table.
174///
175/// # Safety
176/// Should only get called once.
177#[allow(clippy::missing_transmute_annotations)]
178pub unsafe fn init_syscall_table() {
179    cfg_if::cfg_if! {
180        if #[cfg(esp32)] {
181            unsafe extern "C" {
182                static mut syscall_table_ptr_pro: *const chip_specific::syscall_stub_table;
183                static mut syscall_table_ptr_app: *const chip_specific::syscall_stub_table;
184            }
185            unsafe {
186                syscall_table_ptr_pro = &raw const SYSCALL_TABLE;
187                syscall_table_ptr_app = &raw const SYSCALL_TABLE;
188            }
189        } else if #[cfg(esp32s2)] {
190            unsafe extern "C" {
191                static mut syscall_table_ptr_pro: *const chip_specific::syscall_stub_table;
192            }
193            unsafe { syscall_table_ptr_pro = &raw const SYSCALL_TABLE; }
194        } else {
195            unsafe extern "C" {
196                static mut syscall_table_ptr: *const chip_specific::syscall_stub_table;
197            }
198            unsafe { syscall_table_ptr = &raw const SYSCALL_TABLE; }
199        }
200    };
201}