Skip to content

Commit 8408a5c

Browse files
committed
Merge branch '🐛-sym' into 🦆
2 parents dc55bd4 + 1a82ed7 commit 8408a5c

File tree

17 files changed

+206
-244
lines changed

17 files changed

+206
-244
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ The R3 original kernel is provided as a separate package [`r3_kernel`][].
5050
#![feature(const_fn_trait_bound)]
5151
#![feature(const_refs_to_cell)]
5252
#![feature(const_trait_impl)]
53+
#![feature(naked_functions)]
5354
#![feature(const_mut_refs)]
55+
#![feature(asm_const)]
5456
#![feature(asm_sym)]
5557
#![no_std]
5658
#![no_main]

examples/basic_gr_peach/src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#![feature(const_trait_impl)]
55
#![feature(const_mut_refs)]
66
#![feature(naked_functions)]
7+
#![feature(asm_const)]
78
#![feature(asm_sym)]
89
#![deny(unsafe_op_in_unsafe_fn)]
910
#![no_std]

examples/basic_nucleo_f401re/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
#![feature(const_fn_trait_bound)]
33
#![feature(const_refs_to_cell)]
44
#![feature(const_trait_impl)]
5+
#![feature(naked_functions)]
56
#![feature(const_mut_refs)]
7+
#![feature(asm_const)]
68
#![feature(asm_sym)]
79
#![deny(unsafe_op_in_unsafe_fn)]
810
#![no_std]

examples/basic_rp_pico/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
#![feature(const_fn_trait_bound)]
33
#![feature(const_refs_to_cell)]
44
#![feature(const_trait_impl)]
5+
#![feature(naked_functions)]
56
#![feature(const_mut_refs)]
7+
#![feature(asm_const)]
68
#![feature(asm_sym)]
79
#![deny(unsafe_op_in_unsafe_fn)]
810
#![no_std]

examples/basic_wio_terminal/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
#![feature(const_fn_trait_bound)]
33
#![feature(const_refs_to_cell)]
44
#![feature(const_trait_impl)]
5+
#![feature(naked_functions)]
56
#![feature(const_mut_refs)]
7+
#![feature(asm_const)]
68
#![feature(let_else)]
79
#![feature(asm_sym)]
810
#![deny(unsafe_op_in_unsafe_fn)]

examples/smp_rp_pico/src/main.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
#![feature(const_fn_trait_bound)]
33
#![feature(const_refs_to_cell)]
44
#![feature(const_trait_impl)]
5+
#![feature(naked_functions)]
56
#![feature(const_mut_refs)]
7+
#![feature(asm_const)]
68
#![feature(asm_sym)]
79
#![deny(unsafe_op_in_unsafe_fn)]
810
#![no_std]

src/r3_port_arm/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub extern crate r3_core;
2727
#[doc(hidden)]
2828
pub extern crate r3_kernel;
2929

30-
/// Used by `use_sp804!`
30+
/// Used by `use_sp804!` and `use_port!`
3131
#[doc(hidden)]
3232
pub extern crate r3_portkit;
3333

src/r3_port_arm/src/threading/cfg.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,17 @@ macro_rules! use_port {
9393
cfg::{ThreadingOptions, EntryPoint},
9494
};
9595

96-
unsafe impl PortInstance for $Traits {}
96+
static PORT_STATE: State = $crate::r3_core::utils::Init::INIT;
97+
98+
unsafe impl PortInstance for $Traits {
99+
$crate::r3_portkit::sym::sym_static!(
100+
#[sym(p_port_state)] fn port_state() -> &State { &PORT_STATE });
101+
}
97102

98103
impl EntryPoint for $Traits {
99104
#[inline]
100105
unsafe fn start() -> ! {
101-
unsafe { <Self as PortInstance>::port_state().port_boot::<Self>() }
106+
unsafe { PORT_STATE.port_boot::<Self>() }
102107
}
103108

104109
const IRQ_ENTRY: unsafe extern "C" fn() -> ! = State::irq_entry::<Self>;
@@ -122,52 +127,52 @@ macro_rules! use_port {
122127

123128
#[inline(always)]
124129
unsafe fn dispatch_first_task() -> ! {
125-
<Self as PortInstance>::port_state().dispatch_first_task::<Self>()
130+
PORT_STATE.dispatch_first_task::<Self>()
126131
}
127132

128133
#[inline(always)]
129134
unsafe fn yield_cpu() {
130-
<Self as PortInstance>::port_state().yield_cpu::<Self>()
135+
PORT_STATE.yield_cpu::<Self>()
131136
}
132137

133138
#[inline(always)]
134139
unsafe fn exit_and_dispatch(task: &'static TaskCb<Self>) -> ! {
135-
<Self as PortInstance>::port_state().exit_and_dispatch::<Self>(task)
140+
PORT_STATE.exit_and_dispatch::<Self>(task)
136141
}
137142

138143
#[inline(always)]
139144
unsafe fn enter_cpu_lock() {
140-
<Self as PortInstance>::port_state().enter_cpu_lock::<Self>()
145+
PORT_STATE.enter_cpu_lock::<Self>()
141146
}
142147

143148
#[inline(always)]
144149
unsafe fn leave_cpu_lock() {
145-
<Self as PortInstance>::port_state().leave_cpu_lock::<Self>()
150+
PORT_STATE.leave_cpu_lock::<Self>()
146151
}
147152

148153
#[inline(always)]
149154
unsafe fn initialize_task_state(task: &'static TaskCb<Self>) {
150-
<Self as PortInstance>::port_state().initialize_task_state::<Self>(task)
155+
PORT_STATE.initialize_task_state::<Self>(task)
151156
}
152157

153158
#[inline(always)]
154159
fn is_cpu_lock_active() -> bool {
155-
<Self as PortInstance>::port_state().is_cpu_lock_active::<Self>()
160+
PORT_STATE.is_cpu_lock_active::<Self>()
156161
}
157162

158163
#[inline(always)]
159164
fn is_task_context() -> bool {
160-
<Self as PortInstance>::port_state().is_task_context::<Self>()
165+
PORT_STATE.is_task_context::<Self>()
161166
}
162167

163168
#[inline(always)]
164169
fn is_interrupt_context() -> bool {
165-
<Self as PortInstance>::port_state().is_interrupt_context::<Self>()
170+
PORT_STATE.is_interrupt_context::<Self>()
166171
}
167172

168173
#[inline(always)]
169174
fn is_scheduler_active() -> bool {
170-
<Self as PortInstance>::port_state().is_scheduler_active::<Self>()
175+
PORT_STATE.is_scheduler_active::<Self>()
171176
}
172177
}
173178
}

src/r3_port_arm/src/threading/imp.rs

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
use core::{arch::asm, cell::UnsafeCell, mem::MaybeUninit, slice};
22
use memoffset::offset_of;
3-
use r3_core::{
4-
kernel::traits,
5-
utils::{Init, ZeroInit},
6-
};
3+
use r3_core::{kernel::traits, utils::Init};
74
use r3_kernel::{KernelTraits, Port, PortToKernel, System, TaskCb};
8-
use r3_portkit::sym::{sym_static, SymStaticExt};
5+
use r3_portkit::sym::sym_static;
96

107
use super::cfg::{InterruptController, ThreadingOptions, Timer};
118

@@ -17,12 +14,7 @@ use super::cfg::{InterruptController, ThreadingOptions, Timer};
1714
pub unsafe trait PortInstance:
1815
KernelTraits + Port<PortTaskState = TaskState> + ThreadingOptions + InterruptController + Timer
1916
{
20-
sym_static!(static PORT_STATE: SymStatic<State> = zeroed!());
21-
22-
#[inline(always)]
23-
fn port_state() -> &'static State {
24-
sym_static(Self::PORT_STATE).as_ref()
25-
}
17+
sym_static!(#[sym(p_port_state)] fn port_state() -> &State);
2618
}
2719

2820
#[repr(C)]
@@ -42,7 +34,14 @@ impl State {
4234
}
4335

4436
unsafe impl Sync for State {}
45-
unsafe impl ZeroInit for State {}
37+
38+
impl Init for State {
39+
const INIT: Self = Self {
40+
dispatch_pending: UnsafeCell::new(false),
41+
main_stack: UnsafeCell::new(0),
42+
running_task_ptr: UnsafeCell::new(core::ptr::null_mut()),
43+
};
44+
}
4645

4746
#[derive(Debug)]
4847
#[repr(C)]
@@ -180,8 +179,9 @@ impl State {
180179

181180
unsafe {
182181
asm!("
183-
movw r0, :lower16:{PORT_STATE}_
184-
movt r0, :upper16:{PORT_STATE}_
182+
movw r0, :lower16:{p_port_state}_
183+
movt r0, :upper16:{p_port_state}_
184+
ldr r0, [r0]
185185
186186
# Skip saving the second-level state if the current context
187187
# is an idle task. Also, in this case, we don't have a stack,
@@ -205,8 +205,8 @@ impl State {
205205
206206
# Store SP to `TaskState`.
207207
#
208-
# <r0 = &PORT_STATE>
209-
# r0 = *PORT_STATE.running_task_ptr // == running_task
208+
# <r0 = &port_state>
209+
# r0 = *port_state.running_task_ptr // == running_task
210210
# r0.port_task_state.sp = sp_usr
211211
#
212212
ldr r0, [r0, #{OFFSET_RUNNING_TASK_PTR}]
@@ -260,7 +260,7 @@ impl State {
260260
push_second_level_state_and_dispatch =
261261
sym Self::push_second_level_state_and_dispatch::<Traits>,
262262
idle_task = sym Self::idle_task::<Traits>,
263-
PORT_STATE = sym Traits::PORT_STATE,
263+
p_port_state = sym Traits::p_port_state,
264264
OFFSET_RUNNING_TASK_PTR = const Self::OFFSET_RUNNING_TASK_PTR,
265265
OFFSET_MAIN_STACK = const Self::OFFSET_MAIN_STACK,
266266
options(noreturn),
@@ -278,8 +278,9 @@ impl State {
278278
asm!("
279279
# Read `port_state().dispatch_pending`. If it's clear, branch
280280
# to `NotShortcutting`
281-
movw r0, :lower16:{PORT_STATE}_
282-
movt r0, :upper16:{PORT_STATE}_
281+
movw r0, :lower16:{p_port_state}_
282+
movt r0, :upper16:{p_port_state}_
283+
ldr r0, [r0]
283284
ldrb r1, [r0, #{OFFSET_DISPATCH_PENDING}]
284285
tst r1, r1
285286
bne 0f
@@ -307,7 +308,7 @@ impl State {
307308
push_second_level_state_and_dispatch =
308309
sym Self::push_second_level_state_and_dispatch::<Traits>,
309310
idle_task = sym Self::idle_task::<Traits>,
310-
PORT_STATE = sym Traits::PORT_STATE,
311+
p_port_state = sym Traits::p_port_state,
311312
OFFSET_DISPATCH_PENDING = const Self::OFFSET_DISPATCH_PENDING,
312313
options(noreturn),
313314
);

src/r3_port_arm_m/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,8 @@ pub extern crate r3_core;
6060
pub extern crate r3_kernel;
6161
/// Used by `use_port!`
6262
#[doc(hidden)]
63+
pub extern crate r3_portkit;
64+
/// Used by `use_port!`
65+
#[doc(hidden)]
6366
#[cfg(target_os = "none")]
6467
pub use cortex_m_rt;

0 commit comments

Comments
 (0)