Loading...
Searching...
No Matches
native_internal.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2013-2014 Ludwig Knüpfer
3 * SPDX-FileCopyrightText: 2025 carl-tud
4 * SPDX-License-Identifier: LGPL-2.1-only
5 */
6
7#pragma once
8
22
27
34
35#include "util/ucontext.h"
36#include <stdio.h>
37#include <stdint.h>
38#include <poll.h>
39
40#include <stdbool.h>
41#include <netdb.h>
42#include <ifaddrs.h>
43#include <time.h>
44#include <sys/time.h>
45#include <sys/stat.h>
46#include <sys/statvfs.h>
47#include <sys/uio.h>
48#include <dirent.h>
49
50#include "cpu_conf.h"
51#include "thread.h"
52#include "sched.h"
53
54#ifdef __cplusplus
55extern "C" {
56#endif
57
58#include "syscalls.h"
59
60/* MARK: - Internal native CPU API */
65
69typedef void (*_native_callback_t)(void);
70
74void native_cpu_init(void);
76
77/* MARK: - Native Signal Handling */
82
87extern volatile bool _native_interrupts_enabled;
88
95extern int _signal_pipe_fd[2];
96
101extern volatile int _native_pending_signals;
102
107
117
126
136void _native_call_sig_handlers_and_switch(void);
137
143extern void _native_sig_leave_tramp(void);
145
146/* MARK: - System Calls */
157extern volatile int _native_pending_syscalls;
158
162static inline void _native_pending_syscalls_up(void) {
163 _native_pending_syscalls += 1;
164}
165
169static inline void _native_pending_syscalls_down(void) {
170 _native_pending_syscalls -= 1;
171}
172
183void _native_syscall_leave(void);
184
191void _native_syscall_enter(void);
192
200
201/* MARK: - Native Context Switching */
206
210extern volatile uintptr_t _native_user_fptr;
211
215extern volatile int _native_in_isr;
216
221
225extern ucontext_t *_native_isr_context;
226
234extern void _native_isr_leave(void);
235
241static inline void _native_isr_context_make(void (*func)(void)) {
242 _native_isr_context->uc_stack.ss_sp = _isr_stack;
243 _native_isr_context->uc_stack.ss_size = sizeof(_isr_stack);
244 _native_isr_context->uc_stack.ss_flags = 0;
245
246 /* Create the ISR context, will execute _isr_schedule_and_switch */
247 makecontext(_native_isr_context, func, 0);
248}
249
254static inline ucontext_t* _native_user_context(void) {
255 /* Use intermediate cast to uintptr_t to silence -Wcast-align.
256 * stacks are manually word aligned in thread_static_init() */
257 return (ucontext_t *)(uintptr_t)thread_get_active()->sp;
258}
259
260
261/* MARK: - Native Process State */
270extern const char *_progname;
271
276extern char **_native_argv;
277
282extern pid_t _native_pid;
283
288extern pid_t _native_id;
289
294extern unsigned int _native_rng_seed;
295
303extern int _native_rng_mode;
305
306/* MARK: - Native Read/Write Methods */
314ssize_t _native_read(int fd, void *buf, size_t count);
315
319ssize_t _native_write(int fd, const void *buf, size_t count);
320
324ssize_t _native_writev(int fildes, const struct iovec *iov, int iovcnt);
326
327#ifdef __cplusplus
328}
329#endif
330
static thread_t * thread_get_active(void)
Returns a pointer to the Thread Control Block of the currently running thread.
Definition thread.h:413
void _native_sig_leave_tramp(void)
Switches to ISR context, then enables IRQ and returns to userspace.
static void _native_pending_syscalls_up(void)
Increment spending system call counter.
static void _native_isr_context_make(void(*func)(void))
Makes ISR context so that execution continues at func when the context is applied.
void native_cpu_init(void)
Initializes native CPU.
volatile int _native_in_isr
A boolean variable indicating whether program execution currently takes place in an ISR context.
ssize_t _native_read(int fd, void *buf, size_t count)
Reads file, populates given buffer.
volatile uintptr_t _native_user_fptr
Points to instruction in userspace where RIOT left off and switched to ISR context.
ssize_t _native_write(int fd, const void *buf, size_t count)
Writes given data into file.
void _native_init_syscalls(void)
Registers system calls.
void native_interrupt_init(void)
Registers signal handlers for the native CPU.
int native_register_interrupt(int sig, _native_callback_t handler)
Register interrupt handler handler for interrupt signal.
char _isr_stack[THREAD_STACKSIZE_DEFAULT]
Stack used in ISR context.
ssize_t _native_writev(int fildes, const struct iovec *iov, int iovcnt)
Performs a vectored write operation.
void(* _native_callback_t)(void)
Prototype for native's internal callbacks.
static void _native_pending_syscalls_down(void)
Decrements pending system call counter.
int native_unregister_interrupt(int sig)
Unregister interrupt handler for interrupt signal.
static ucontext_t * _native_user_context(void)
Retrieves user context.
ucontext_t * _native_isr_context
ISR context.
Native CPU configuration.
Scheduler API definition.
POSIX compatible sys/statvfs.h definitions.
char * sp
thread's stack pointer
Definition thread.h:171
Structure for scatter/gather I/O.
Definition uio.h:33
#define THREAD_STACKSIZE_DEFAULT
A reasonable default stack size that will suffice most smaller tasks.
libc header for scatter/gather I/O