Skip to main content

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