esp_rom_sys/syscall/
mod.rs

1#![allow(non_camel_case_types)]
2
3// future chips or ECOs _might_ be different - at least ESP-IDF defines the struct per chip
4#[cfg_attr(
5    any(esp32, esp32s2, esp32s3, esp32c2, esp32c3, esp32c6, esp32h2),
6    path = "v1.rs"
7)]
8pub(crate) mod chip_specific;
9
10#[repr(C)]
11#[derive(Debug, Copy, Clone)]
12pub struct _reent {
13    _unused: [u8; 0],
14    // the real struct is found here: https://sourceware.org/git/?p=newlib-cygwin.git;a=blob;f=newlib/libc/include/sys/reent.h;h=eafac960fd6ca374b7503f50bf8aa2bd1ee1573e;hb=refs/heads/main#l379
15}
16
17pub type clock_t = ::core::ffi::c_long;
18
19#[repr(C)]
20#[derive(Debug, Copy, Clone)]
21pub struct tms {
22    _unused: [u8; 0],
23}
24
25#[repr(C)]
26#[derive(Debug, Copy, Clone)]
27pub struct timeval {
28    _unused: [u8; 0],
29}
30
31#[repr(C)]
32#[derive(Debug, Copy, Clone)]
33pub struct stat {
34    _unused: [u8; 0],
35}
36
37#[repr(C)]
38#[derive(Debug, Copy, Clone)]
39pub struct __lock {
40    _unused: [u8; 0],
41}
42
43pub type _LOCK_T = *mut __lock;
44
45pub type _lock_t = _LOCK_T;
46
47#[repr(C)]
48#[derive(Debug, Copy, Clone)]
49pub struct _iobuf {
50    pub _placeholder: *mut ::core::ffi::c_void,
51}
52
53#[allow(clippy::upper_case_acronyms)]
54pub type FILE = _iobuf;
55
56pub type va_list = *mut ::core::ffi::c_char;
57
58static mut S_STUB_TABLE: core::mem::MaybeUninit<chip_specific::syscall_stub_table> =
59    core::mem::MaybeUninit::uninit();
60
61unsafe extern "C" fn not_implemented() {
62    panic!("Function called via syscall table is not implemented!");
63}
64
65unsafe extern "C" fn abort_wrapper() {
66    panic!("Abort called from ROM code!");
67}
68
69/// Initialize the syscall table.
70///
71/// # Safety
72/// Should only get called once.
73#[allow(clippy::missing_transmute_annotations)]
74pub unsafe fn init_syscall_table() {
75    let syscall_table = unsafe {
76        (&mut *core::ptr::addr_of_mut!(S_STUB_TABLE)).write(chip_specific::syscall_stub_table {
77            __getreent: Some(core::mem::transmute(not_implemented as usize)),
78            _malloc_r: Some(core::mem::transmute(not_implemented as usize)),
79            _free_r: Some(core::mem::transmute(not_implemented as usize)),
80            _realloc_r: Some(core::mem::transmute(not_implemented as usize)),
81            _calloc_r: Some(core::mem::transmute(not_implemented as usize)),
82            _abort: Some(abort_wrapper),
83            _system_r: Some(core::mem::transmute(not_implemented as usize)),
84            _rename_r: Some(core::mem::transmute(not_implemented as usize)),
85            _times_r: Some(core::mem::transmute(not_implemented as usize)),
86            _gettimeofday_r: Some(core::mem::transmute(not_implemented as usize)),
87            _raise_r: Some(core::mem::transmute(not_implemented as usize)),
88            _unlink_r: Some(core::mem::transmute(not_implemented as usize)),
89            _link_r: Some(core::mem::transmute(not_implemented as usize)),
90            _stat_r: Some(core::mem::transmute(not_implemented as usize)),
91            _fstat_r: Some(core::mem::transmute(not_implemented as usize)),
92            _sbrk_r: Some(core::mem::transmute(not_implemented as usize)),
93            _getpid_r: Some(core::mem::transmute(not_implemented as usize)),
94            _kill_r: Some(core::mem::transmute(not_implemented as usize)),
95            _exit_r: Some(core::mem::transmute(not_implemented as usize)),
96            _close_r: Some(core::mem::transmute(not_implemented as usize)),
97            _open_r: Some(core::mem::transmute(not_implemented as usize)),
98            _write_r: Some(core::mem::transmute(not_implemented as usize)),
99            _lseek_r: Some(core::mem::transmute(not_implemented as usize)),
100            _read_r: Some(core::mem::transmute(not_implemented as usize)),
101            _retarget_lock_init: Some(core::mem::transmute(not_implemented as usize)),
102            _retarget_lock_init_recursive: Some(core::mem::transmute(not_implemented as usize)),
103            _retarget_lock_close: Some(core::mem::transmute(not_implemented as usize)),
104            _retarget_lock_close_recursive: Some(core::mem::transmute(not_implemented as usize)),
105            _retarget_lock_acquire: Some(core::mem::transmute(not_implemented as usize)),
106            _retarget_lock_acquire_recursive: Some(core::mem::transmute(not_implemented as usize)),
107            _retarget_lock_try_acquire: Some(core::mem::transmute(not_implemented as usize)),
108            _retarget_lock_try_acquire_recursive: Some(core::mem::transmute(
109                not_implemented as usize,
110            )),
111            _retarget_lock_release: Some(core::mem::transmute(not_implemented as usize)),
112            _retarget_lock_release_recursive: Some(core::mem::transmute(not_implemented as usize)),
113            _printf_float: Some(core::mem::transmute(not_implemented as usize)),
114            _scanf_float: Some(core::mem::transmute(not_implemented as usize)),
115            __assert_func: Some(super::__assert_func),
116            __sinit: Some(core::mem::transmute(not_implemented as usize)),
117            _cleanup_r: Some(core::mem::transmute(not_implemented as usize)),
118        })
119    };
120
121    cfg_if::cfg_if! {
122        if #[cfg(esp32)] {
123            unsafe extern "C" {
124                static mut syscall_table_ptr_pro: *const chip_specific::syscall_stub_table;
125                static mut syscall_table_ptr_app: *const chip_specific::syscall_stub_table;
126            }
127            unsafe {
128                syscall_table_ptr_pro = syscall_table;
129                syscall_table_ptr_app = syscall_table;
130            }
131        } else if #[cfg(esp32s2)] {
132            unsafe extern "C" {
133                static mut syscall_table_ptr_pro: *const chip_specific::syscall_stub_table;
134            }
135            unsafe { syscall_table_ptr_pro = syscall_table; }
136        } else {
137            unsafe extern "C" {
138                static mut syscall_table_ptr: *const chip_specific::syscall_stub_table;
139            }
140            unsafe { syscall_table_ptr = syscall_table; }
141        }
142    };
143}