Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
K
kernel
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
redox-os
kernel
Commits
0ed9f033
Verified
Commit
0ed9f033
authored
2 years ago
by
Jeremy Soller
Browse files
Options
Downloads
Patches
Plain Diff
Use push/pop scratch for aarch64 signal handler
parent
613968dc
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/context/arch/aarch64.rs
+26
-114
26 additions, 114 deletions
src/context/arch/aarch64.rs
with
26 additions
and
114 deletions
src/context/arch/aarch64.rs
+
26
−
114
View file @
0ed9f033
...
@@ -4,6 +4,8 @@ use core::mem;
...
@@ -4,6 +4,8 @@ use core::mem;
use
core
::
sync
::
atomic
::{
AtomicBool
,
Ordering
};
use
core
::
sync
::
atomic
::{
AtomicBool
,
Ordering
};
use
spin
::
Once
;
use
spin
::
Once
;
use
crate
::{
push_scratch
,
pop_scratch
};
use
crate
::
interrupt
::
handler
::
ScratchRegisters
;
use
crate
::
device
::
cpu
::
registers
::{
control_regs
,
tlb
};
use
crate
::
device
::
cpu
::
registers
::{
control_regs
,
tlb
};
use
crate
::
paging
::{
RmmA
,
RmmArch
,
TableKind
};
use
crate
::
paging
::{
RmmA
,
RmmArch
,
TableKind
};
use
crate
::
syscall
::
FloatRegisters
;
use
crate
::
syscall
::
FloatRegisters
;
...
@@ -118,10 +120,10 @@ impl Context {
...
@@ -118,10 +120,10 @@ impl Context {
}
}
pub
unsafe
fn
signal_stack
(
&
mut
self
,
handler
:
extern
fn
(
usize
),
sig
:
u8
)
{
pub
unsafe
fn
signal_stack
(
&
mut
self
,
handler
:
extern
fn
(
usize
),
sig
:
u8
)
{
self
.push_stack
(
sig
as
usize
);
self
.push_stack
(
handler
as
usize
);
let
lr
=
self
.lr
.clone
();
let
lr
=
self
.lr
.clone
();
self
.push_stack
(
lr
);
self
.push_stack
(
lr
);
self
.push_stack
(
sig
as
usize
);
self
.push_stack
(
handler
as
usize
);
self
.set_lr
(
signal_handler_wrapper
as
usize
);
self
.set_lr
(
signal_handler_wrapper
as
usize
);
}
}
...
@@ -408,127 +410,37 @@ unsafe extern "C" fn switch_to_inner(prev: &mut Context, next: &mut Context) {
...
@@ -408,127 +410,37 @@ unsafe extern "C" fn switch_to_inner(prev: &mut Context, next: &mut Context) {
#[allow(dead_code)]
#[allow(dead_code)]
#[repr(packed)]
#[repr(packed)]
pub
struct
SignalHandlerStack
{
pub
struct
SignalHandlerStack
{
x28
:
usize
,
/* Callee saved Register */
scratch
:
ScratchRegisters
,
x27
:
usize
,
/* Callee saved Register */
padding
:
usize
,
x26
:
usize
,
/* Callee saved Register */
x25
:
usize
,
/* Callee saved Register */
x24
:
usize
,
/* Callee saved Register */
x23
:
usize
,
/* Callee saved Register */
x22
:
usize
,
/* Callee saved Register */
x21
:
usize
,
/* Callee saved Register */
x20
:
usize
,
/* Callee saved Register */
x19
:
usize
,
/* Callee saved Register */
x18
:
usize
,
x17
:
usize
,
x16
:
usize
,
x15
:
usize
,
/* Temporary Register */
x14
:
usize
,
/* Temporary Register */
x13
:
usize
,
/* Temporary Register */
x12
:
usize
,
/* Temporary Register */
x11
:
usize
,
/* Temporary Register */
x10
:
usize
,
/* Temporary Register */
x9
:
usize
,
/* Temporary Register */
x8
:
usize
,
/* Indirect location Register */
x7
:
usize
,
x6
:
usize
,
x5
:
usize
,
x4
:
usize
,
x3
:
usize
,
x2
:
usize
,
x1
:
usize
,
x0
:
usize
,
lr
:
usize
,
handler
:
extern
fn
(
usize
),
handler
:
extern
fn
(
usize
),
sig
:
usize
,
sig
:
usize
,
lr
:
usize
,
}
}
#[naked]
#[naked]
unsafe
extern
fn
signal_handler_wrapper
()
{
unsafe
extern
fn
signal_handler_wrapper
()
{
core
::
arch
::
asm!
(
"
udf #0
"
,
options
(
noreturn
)
);
/*TODO: convert to asm!
#[inline(never)]
#[inline(never)]
unsafe fn inner(stack: &SignalHandlerStack) {
unsafe
extern
"C"
fn
inner
(
stack
:
&
SignalHandlerStack
)
{
(
stack
.handler
)(
stack
.sig
);
(
stack
.handler
)(
stack
.sig
);
}
}
// Push scratch registers
// Push scratch registers
llvm_asm!("str x0, [sp, #-8]!
core
::
arch
::
asm!
(
str x1, [sp, #-8]!
concat!
(
str x2, [sp, #-8]!
"sub sp, sp, 8"
,
str x3, [sp, #-8]!
push_scratch!
(),
str x4, [sp, #-8]!
"
str x5, [sp, #-8]!
mov x0, sp
str x6, [sp, #-8]!
bl {inner}
str x7, [sp, #-8]!
"
,
str x8, [sp, #-8]!
pop_scratch!
(),
str x9, [sp, #-8]!
"
str x10, [sp, #-8]!
add sp, sp, 24
str x11, [sp, #-8]!
ldr x30, [sp], #8
str x12, [sp, #-8]!
ret
str x13, [sp, #-8]!
"
str x14, [sp, #-8]!
),
str x15, [sp, #-8]!
inner
=
sym
inner
,
str x16, [sp, #-8]!
options
(
noreturn
),
str x17, [sp, #-8]!
);
str x18, [sp, #-8]!
str x19, [sp, #-8]!
str x20, [sp, #-8]!
str x21, [sp, #-8]!
str x22, [sp, #-8]!
str x23, [sp, #-8]!
str x24, [sp, #-8]!
str x25, [sp, #-8]!
str x26, [sp, #-8]!
str x27, [sp, #-8]!
str x28, [sp, #-8]!"
: : : : "volatile");
// Get reference to stack variables
let sp: usize;
llvm_asm!("" : "={sp}"(sp) : : : "volatile");
let ptr = sp as *const SignalHandlerStack;
let final_lr = (*ptr).lr;
// Call inner rust function
inner(&*(sp as *const SignalHandlerStack));
// Pop scratch registers, error code, and return
llvm_asm!("ldr x28, [sp], #8
ldr x27, [sp], #8
ldr x26, [sp], #8
ldr x25, [sp], #8
ldr x24, [sp], #8
ldr x23, [sp], #8
ldr x22, [sp], #8
ldr x21, [sp], #8
ldr x20, [sp], #8
ldr x19, [sp], #8
ldr x18, [sp], #8
ldr x17, [sp], #8
ldr x16, [sp], #8
ldr x15, [sp], #8
ldr x14, [sp], #8
ldr x13, [sp], #8
ldr x12, [sp], #8
ldr x11, [sp], #8
ldr x10, [sp], #8
ldr x9, [sp], #8
ldr x8, [sp], #8
ldr x7, [sp], #8
ldr x6, [sp], #8
ldr x5, [sp], #8
ldr x4, [sp], #8
ldr x3, [sp], #8
ldr x2, [sp], #8
ldr x1, [sp], #8"
: : : : "volatile");
llvm_asm!("mov x30, $0" : : "r"(final_lr) : "memory" : "volatile");
*/
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment