File tree Expand file tree Collapse file tree 2 files changed +34
-0
lines changed Expand file tree Collapse file tree 2 files changed +34
-0
lines changed Original file line number Diff line number Diff line change @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
8
8
## [ Unreleased]
9
9
10
10
- MSRV is 1.61 to match cortex-m-rt crate
11
+ - Add ` enter_unprivileged ` function to switch to unprivileged mode (on the Process Stack, or ` PSP ` )
11
12
12
13
## [ v0.7.7] - 2023-01-03
13
14
Original file line number Diff line number Diff line change @@ -171,6 +171,39 @@ pub unsafe fn semihosting_syscall(nr: u32, arg: u32) -> u32 {
171
171
call_asm ! ( __sh_syscall( nr: u32 , arg: u32 ) -> u32 )
172
172
}
173
173
174
+ /// Switch to unprivileged mode.
175
+ ///
176
+ /// Sets CONTROL.SPSEL (setting the program stack to be the active
177
+ /// stack) and CONTROL.nPRIV (setting unprivileged mode), updates the
178
+ /// program stack pointer to the address in `psp`, then jumps to the
179
+ /// address in `entry`.
180
+ ///
181
+ /// # Safety
182
+ ///
183
+ /// * `psp` and `entry` must point to valid stack memory and executable code,
184
+ /// respectively.
185
+ /// * `psp` must be 8 bytes aligned and point to stack top as stack grows
186
+ /// towards lower addresses.
187
+ /// * The size of the stack provided here must be large enough for your
188
+ /// program - stack overflows are obviously UB. If your processor supports
189
+ /// it, you may wish to set the `PSPLIM` register to guard against this.
190
+ #[ cfg( cortex_m) ]
191
+ #[ inline( always) ]
192
+ pub unsafe fn enter_unprivileged ( psp : * const u32 , entry : fn ( ) -> !) -> ! {
193
+ core:: arch:: asm!(
194
+ "mrs {tmp}, CONTROL" ,
195
+ "orr {tmp}, #3" ,
196
+ "msr PSP, {psp}" ,
197
+ "msr CONTROL, {tmp}" ,
198
+ "isb" ,
199
+ "bx {ent}" ,
200
+ tmp = in( reg) 0 ,
201
+ psp = in( reg) psp,
202
+ ent = in( reg) entry,
203
+ options( noreturn, nomem, nostack)
204
+ ) ;
205
+ }
206
+
174
207
/// Bootstrap.
175
208
///
176
209
/// Clears CONTROL.SPSEL (setting the main stack to be the active stack),
You can’t perform that action at this time.
0 commit comments