Zephyr Project API  3.3.0
A Scalable Open Source RTOS
arch_interface.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2019 Intel Corporation.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
26#ifndef ZEPHYR_INCLUDE_SYS_ARCH_INTERFACE_H_
27#define ZEPHYR_INCLUDE_SYS_ARCH_INTERFACE_H_
28
29#ifndef _ASMLANGUAGE
30#include <zephyr/toolchain.h>
31#include <stddef.h>
32#include <zephyr/types.h>
33#include <zephyr/arch/cpu.h>
34#include <zephyr/irq_offload.h>
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
40/* NOTE: We cannot pull in kernel.h here, need some forward declarations */
41struct k_thread;
42struct k_mem_domain;
43
44typedef struct z_thread_stack_element k_thread_stack_t;
45
46typedef void (*k_thread_entry_t)(void *p1, void *p2, void *p3);
47
59static inline uint32_t arch_k_cycle_get_32(void);
60
66static inline uint64_t arch_k_cycle_get_64(void);
67
167void arch_cpu_idle(void);
168
187void arch_cpu_atomic_idle(unsigned int key);
188
202typedef FUNC_NORETURN void (*arch_cpustart_t)(void *data);
203
224void arch_start_cpu(int cpu_num, k_thread_stack_t *stack, int sz,
225 arch_cpustart_t fn, void *arg);
226
232bool arch_cpu_active(int cpu_num);
233
247static inline unsigned int arch_irq_lock(void);
248
254static inline void arch_irq_unlock(unsigned int key);
255
263static inline bool arch_irq_unlocked(unsigned int key);
264
279void arch_irq_disable(unsigned int irq);
280
286void arch_irq_enable(unsigned int irq);
287
293int arch_irq_is_enabled(unsigned int irq);
294
306int arch_irq_connect_dynamic(unsigned int irq, unsigned int priority,
307 void (*routine)(const void *parameter),
308 const void *parameter, uint32_t flags);
309
316#ifdef CONFIG_PCIE
322#endif /* CONFIG_PCIE */
323
354#ifndef CONFIG_PCIE_CONTROLLER
364unsigned int arch_irq_allocate(void);
365
374void arch_irq_set_used(unsigned int irq);
375
383bool arch_irq_is_used(unsigned int irq);
384
385#endif /* CONFIG_PCIE_CONTROLLER */
386
402#ifdef CONFIG_IRQ_OFFLOAD
419void arch_irq_offload(irq_offload_routine_t routine, const void *parameter);
420#endif /* CONFIG_IRQ_OFFLOAD */
421
430#ifdef CONFIG_SMP
432static inline struct _cpu *arch_curr_cpu(void);
433
434
454static inline uint32_t arch_proc_id(void);
455
461void arch_sched_ipi(void);
462
463#endif /* CONFIG_SMP */
464
473static inline unsigned int arch_num_cpus(void);
474
484#ifdef CONFIG_USERSPACE
507
519 uintptr_t call_id);
520
533 uintptr_t call_id);
534
548 uintptr_t arg3,
549 uintptr_t call_id);
550
565 uintptr_t arg3, uintptr_t arg4,
566 uintptr_t call_id);
567
583 uintptr_t arg3, uintptr_t arg4,
584 uintptr_t arg5,
585 uintptr_t call_id);
586
603 uintptr_t arg3, uintptr_t arg4,
604 uintptr_t arg5, uintptr_t arg6,
605 uintptr_t call_id);
606
612static inline bool arch_is_user_context(void);
613
620
621#ifdef CONFIG_ARCH_MEM_DOMAIN_DATA
643int arch_mem_domain_init(struct k_mem_domain *domain);
644#endif /* CONFIG_ARCH_MEM_DOMAIN_DATA */
645
646#ifdef CONFIG_ARCH_MEM_DOMAIN_SYNCHRONOUS_API
664int arch_mem_domain_thread_add(struct k_thread *thread);
665
680int arch_mem_domain_thread_remove(struct k_thread *thread);
681
699int arch_mem_domain_partition_remove(struct k_mem_domain *domain,
700 uint32_t partition_id);
701
714int arch_mem_domain_partition_add(struct k_mem_domain *domain,
715 uint32_t partition_id);
716#endif /* CONFIG_ARCH_MEM_DOMAIN_SYNCHRONOUS_API */
717
746int arch_buffer_validate(void *addr, size_t size, int write);
747
761size_t arch_virt_region_align(uintptr_t phys, size_t size);
762
781FUNC_NORETURN void arch_user_mode_enter(k_thread_entry_t user_entry,
782 void *p1, void *p2, void *p3);
783
798FUNC_NORETURN void arch_syscall_oops(void *ssf);
799
812size_t arch_user_string_nlen(const char *s, size_t maxsize, int *err);
813#endif /* CONFIG_USERSPACE */
814
829#ifndef CONFIG_ARCH_HAS_COHERENCE
830static inline bool arch_mem_coherent(void *ptr)
831{
832 ARG_UNUSED(ptr);
833 return true;
834}
835#endif
836
877#ifndef CONFIG_KERNEL_COHERENCE
878static inline void arch_cohere_stacks(struct k_thread *old_thread,
879 void *old_switch_handle,
880 struct k_thread *new_thread)
881{
882 ARG_UNUSED(old_thread);
883 ARG_UNUSED(old_switch_handle);
884 ARG_UNUSED(new_thread);
885}
886#endif
887
896#ifdef CONFIG_GDBSTUB
897struct gdb_ctx;
898
904void arch_gdb_init(void);
905
912
918void arch_gdb_step(void);
919
933size_t arch_gdb_reg_readall(struct gdb_ctx *ctx, uint8_t *buf, size_t buflen);
934
948size_t arch_gdb_reg_writeall(struct gdb_ctx *ctx, uint8_t *hex, size_t hexlen);
949
964size_t arch_gdb_reg_readone(struct gdb_ctx *ctx, uint8_t *buf, size_t buflen,
965 uint32_t regno);
966
981size_t arch_gdb_reg_writeone(struct gdb_ctx *ctx, uint8_t *hex, size_t hexlen,
982 uint32_t regno);
983
997 uintptr_t addr, uint32_t kind);
998
1012 uintptr_t addr, uint32_t kind);
1013
1014#endif
1023#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_ARCH_CACHE)
1024#if defined(CONFIG_DCACHE)
1025
1032void arch_dcache_enable(void);
1033
1039void arch_dcache_disable(void);
1040
1050int arch_dcache_flush_all(void);
1051
1061int arch_dcache_invd_all(void);
1062
1072int arch_dcache_flush_and_invd_all(void);
1073
1086int arch_dcache_flush_range(void *addr, size_t size);
1087
1100int arch_dcache_invd_range(void *addr, size_t size);
1101
1114int arch_dcache_flush_and_invd_range(void *addr, size_t size);
1115
1116#if defined(CONFIG_DCACHE_LINE_SIZE_DETECT)
1130size_t arch_dcache_line_size_get(void);
1131#endif /* CONFIG_DCACHE_LINE_SIZE_DETECT */
1132
1133#endif /* CONFIG_DCACHE */
1134
1135#if defined(CONFIG_ICACHE)
1141void arch_icache_enable(void);
1142
1148void arch_icache_disable(void);
1149
1159int arch_icache_flush_all(void);
1160
1170int arch_icache_invd_all(void);
1171
1181int arch_icache_flush_and_invd_all(void);
1182
1195int arch_icache_flush_range(void *addr, size_t size);
1196
1209int arch_icache_invd_range(void *addr, size_t size);
1210
1223int arch_icache_flush_and_invd_range(void *addr, size_t size);
1224
1225#if defined(CONFIG_ICACHE_LINE_SIZE_DETECT)
1239size_t arch_icache_line_size_get(void);
1240#endif /* CONFIG_ICACHE_LINE_SIZE_DETECT */
1241
1242#endif /* CONFIG_ICACHE */
1243#endif /* CONFIG_CACHE_MANAGEMENT && CONFIG_ARCH_CACHE */
1244
1247#ifdef CONFIG_TIMING_FUNCTIONS
1248#include <zephyr/timing/types.h>
1249
1263
1277
1291
1311
1327 volatile timing_t *const end);
1328
1337
1347
1358
1367
1370#endif /* CONFIG_TIMING_FUNCTIONS */
1371
1372#ifdef CONFIG_PCIE_MSI_MULTI_VECTOR
1373
1374struct msi_vector;
1375typedef struct msi_vector msi_vector_t;
1376
1386uint8_t arch_pcie_msi_vectors_allocate(unsigned int priority,
1387 msi_vector_t *vectors,
1388 uint8_t n_vector);
1389
1400bool arch_pcie_msi_vector_connect(msi_vector_t *vector,
1401 void (*routine)(const void *parameter),
1402 const void *parameter,
1403 uint32_t flags);
1404
1405#endif /* CONFIG_PCIE_MSI_MULTI_VECTOR */
1406
1407#ifdef __cplusplus
1408}
1409#endif /* __cplusplus */
1410
1412
1413#endif /* _ASMLANGUAGE */
1414
1415#endif /* ZEPHYR_INCLUDE_SYS_ARCH_INTERFACE_H_ */
struct z_thread_stack_element k_thread_stack_t
Typedef of struct z_thread_stack_element.
Definition: arch_interface.h:44
void(* k_thread_entry_t)(void *p1, void *p2, void *p3)
Thread entry point function type.
Definition: arch_interface.h:46
irp nz macro MOVR cc s mov cc s endm endr irp aw macro LDR aa s
Definition: asm-macro-32-bit-gnu.h:17
static struct k_thread thread[2]
Definition: atomic.c:26
ZTEST_BMEM int count
Definition: main.c:33
size_t arch_gdb_reg_writeall(struct gdb_ctx *ctx, uint8_t *hex, size_t hexlen)
Take a hexadecimal string and update all registers.
void arch_gdb_init(void)
Architecture layer debug start.
void arch_gdb_step(void)
Continue with one step.
size_t arch_gdb_reg_readall(struct gdb_ctx *ctx, uint8_t *buf, size_t buflen)
Read all registers, and outputs as hexadecimal string.
int arch_gdb_remove_breakpoint(struct gdb_ctx *ctx, uint8_t type, uintptr_t addr, uint32_t kind)
Remove breakpoint or watchpoint.
void arch_gdb_continue(void)
Continue running program.
size_t arch_gdb_reg_readone(struct gdb_ctx *ctx, uint8_t *buf, size_t buflen, uint32_t regno)
Read one register, and outputs as hexadecimal string.
int arch_gdb_add_breakpoint(struct gdb_ctx *ctx, uint8_t type, uintptr_t addr, uint32_t kind)
Add breakpoint or watchpoint.
size_t arch_gdb_reg_writeone(struct gdb_ctx *ctx, uint8_t *hex, size_t hexlen, uint32_t regno)
Take a hexadecimal string and update one register.
static bool arch_irq_unlocked(unsigned int key)
void arch_irq_disable(unsigned int irq)
static unsigned int arch_irq_lock(void)
int arch_irq_is_enabled(unsigned int irq)
bool arch_irq_is_used(unsigned int irq)
Arch-specific hook for checking if an IRQ is being used already.
void arch_irq_set_used(unsigned int irq)
Arch-specific hook for declaring an IRQ being used.
void arch_irq_enable(unsigned int irq)
static void arch_irq_unlock(unsigned int key)
int arch_irq_connect_dynamic(unsigned int irq, unsigned int priority, void(*routine)(const void *parameter), const void *parameter, uint32_t flags)
unsigned int arch_irq_allocate(void)
Arch-specific hook for allocating IRQs.
void arch_cpu_atomic_idle(unsigned int key)
Atomically re-enable interrupts and enter low power mode.
void arch_cpu_idle(void)
Power save idle routine.
static unsigned int arch_num_cpus(void)
Returns the number of CPUs.
bool arch_cpu_active(int cpu_num)
Return CPU power status.
FUNC_NORETURN void(* arch_cpustart_t)(void *data)
Definition: arch_interface.h:202
void arch_start_cpu(int cpu_num, k_thread_stack_t *stack, int sz, arch_cpustart_t fn, void *arg)
Start a numbered CPU on a MP-capable system.
static struct _cpu * arch_curr_cpu(void)
static uint32_t arch_proc_id(void)
Processor hardware ID.
void arch_sched_ipi(void)
uint64_t arch_timing_freq_get(void)
Get frequency of counter used (in Hz).
uint32_t arch_timing_freq_get_mhz(void)
Get frequency of counter used (in MHz).
uint64_t arch_timing_cycles_get(volatile timing_t *const start, volatile timing_t *const end)
Get number of cycles between start and end.
void arch_timing_stop(void)
Signal the end of the timing information gathering.
void arch_timing_init(void)
Initialize the timing subsystem.
uint64_t arch_timing_cycles_to_ns(uint64_t cycles)
Convert number of cycles into nanoseconds.
uint64_t arch_timing_cycles_to_ns_avg(uint64_t cycles, uint32_t count)
Convert number of cycles into nanoseconds with averaging.
static uint32_t arch_k_cycle_get_32(void)
static uint64_t arch_k_cycle_get_64(void)
timing_t arch_timing_counter_get(void)
Return timing counter.
void arch_timing_start(void)
Signal the start of the timing information gathering.
static uintptr_t arch_syscall_invoke4(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t call_id)
int arch_buffer_validate(void *addr, size_t size, int write)
Check memory region permissions.
size_t arch_user_string_nlen(const char *s, size_t maxsize, int *err)
Safely take the length of a potentially bad string.
static uintptr_t arch_syscall_invoke2(uintptr_t arg1, uintptr_t arg2, uintptr_t call_id)
static void arch_cohere_stacks(struct k_thread *old_thread, void *old_switch_handle, struct k_thread *new_thread)
Ensure cache coherence prior to context switch.
Definition: arch_interface.h:878
FUNC_NORETURN void arch_user_mode_enter(k_thread_entry_t user_entry, void *p1, void *p2, void *p3)
size_t arch_virt_region_align(uintptr_t phys, size_t size)
static uintptr_t arch_syscall_invoke1(uintptr_t arg1, uintptr_t call_id)
static uintptr_t arch_syscall_invoke0(uintptr_t call_id)
int arch_mem_domain_max_partitions_get(void)
Get the maximum number of partitions for a memory domain.
static bool arch_is_user_context(void)
static bool arch_mem_coherent(void *ptr)
Detect memory coherence type.
Definition: arch_interface.h:830
static uintptr_t arch_syscall_invoke5(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, uintptr_t call_id)
static uintptr_t arch_syscall_invoke3(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t call_id)
static uintptr_t arch_syscall_invoke6(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, uintptr_t arg6, uintptr_t call_id)
FUNC_NORETURN void arch_syscall_oops(void *ssf)
Induce a kernel oops that appears to come from a specific location.
uint64_t timing_t
Definition: types.h:10
IRQ Offload interface.
void(* irq_offload_routine_t)(const void *parameter)
Definition: irq_offload.h:18
flags
Definition: parser.h:96
uint32_t hex
Definition: printk.c:118
void * ptr
Definition: printk.c:120
char stack[2048]
Definition: main.c:22
static k_spinlock_key_t key
Definition: spinlock_error_case.c:15
__UINT32_TYPE__ uint32_t
Definition: stdint.h:90
__UINT64_TYPE__ uint64_t
Definition: stdint.h:91
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition: stdint.h:105
Definition: gdbstub.h:78
Memory Domain.
Definition: mem_domain.h:80
Definition: thread.h:245
Definition: msi.h:44
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
Macros to abstract toolchain specific capabilities.