Skip to content

Commit ba188b1

Browse files
committed
convert inline assmebly to the new assembly format
1 parent c5d27ad commit ba188b1

File tree

3 files changed

+112
-60
lines changed

3 files changed

+112
-60
lines changed

src/arch/x86_64/mod.rs

Lines changed: 69 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ pub mod task;
1010

1111
pub use crate::arch::x86_64::syscall::syscall_handler;
1212

13-
global_asm!(include_str!("user_land.s"));
13+
global_asm!(include_str!("user_land.s"), options(att_syntax));
1414

1515
pub fn register_task() {
1616
let sel: u16 = 6u16 << 3;
1717

1818
unsafe {
19-
llvm_asm!("ltr $0" :: "r"(sel) :: "volatile");
19+
asm!("ltr ax", in("ax") sel, options(nostack, nomem));
2020
}
2121
}
2222

@@ -49,7 +49,7 @@ macro_rules! syscall {
4949
$arg2 as u64,
5050
$arg3 as u64,
5151
$arg4 as u64,
52-
)
52+
)
5353
};
5454

5555
($arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr) => {
@@ -60,7 +60,7 @@ macro_rules! syscall {
6060
$arg3 as u64,
6161
$arg4 as u64,
6262
$arg5 as u64,
63-
)
63+
)
6464
};
6565

6666
($arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr, $arg6:expr) => {
@@ -72,7 +72,7 @@ macro_rules! syscall {
7272
$arg4 as u64,
7373
$arg5 as u64,
7474
$arg6 as u64,
75-
)
75+
)
7676
};
7777

7878
($arg0:expr, $arg1:expr, $arg2:expr, $arg3:expr, $arg4:expr, $arg5:expr, $arg6:expr, $arg7:expr) => {
@@ -85,7 +85,7 @@ macro_rules! syscall {
8585
$arg5 as u64,
8686
$arg6 as u64,
8787
$arg7 as u64,
88-
)
88+
)
8989
};
9090
}
9191

@@ -94,7 +94,12 @@ macro_rules! syscall {
9494
pub fn syscall0(arg0: u64) -> u64 {
9595
let mut ret: u64;
9696
unsafe {
97-
llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0) : "rcx", "r11", "memory" : "volatile");
97+
asm!("syscall",
98+
inlateout("rax") arg0 => ret,
99+
lateout("rcx") _,
100+
lateout("r11") _,
101+
options(preserves_flags, nostack)
102+
);
98103
}
99104
ret
100105
}
@@ -104,8 +109,13 @@ pub fn syscall0(arg0: u64) -> u64 {
104109
pub fn syscall1(arg0: u64, arg1: u64) -> u64 {
105110
let mut ret: u64;
106111
unsafe {
107-
llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0), "{rdi}" (arg1)
108-
: "rcx", "r11", "memory" : "volatile");
112+
asm!("syscall",
113+
inlateout("rax") arg0 => ret,
114+
in("rdi") arg1,
115+
lateout("rcx") _,
116+
lateout("r11") _,
117+
options(preserves_flags, nostack)
118+
);
109119
}
110120
ret
111121
}
@@ -115,8 +125,14 @@ pub fn syscall1(arg0: u64, arg1: u64) -> u64 {
115125
pub fn syscall2(arg0: u64, arg1: u64, arg2: u64) -> u64 {
116126
let mut ret: u64;
117127
unsafe {
118-
llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2)
119-
: "rcx", "r11", "memory" : "volatile");
128+
asm!("syscall",
129+
inlateout("rax") arg0 => ret,
130+
in("rdi") arg1,
131+
in("rsi") arg2,
132+
lateout("rcx") _,
133+
lateout("r11") _,
134+
options(preserves_flags, nostack)
135+
);
120136
}
121137
ret
122138
}
@@ -126,8 +142,15 @@ pub fn syscall2(arg0: u64, arg1: u64, arg2: u64) -> u64 {
126142
pub fn syscall3(arg0: u64, arg1: u64, arg2: u64, arg3: u64) -> u64 {
127143
let mut ret: u64;
128144
unsafe {
129-
llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2),
130-
"{rdx}" (arg3) : "rcx", "r11", "memory" : "volatile");
145+
asm!("syscall",
146+
inlateout("rax") arg0 => ret,
147+
in("rdi") arg1,
148+
in("rsi") arg2,
149+
in("rdx") arg3,
150+
lateout("rcx") _,
151+
lateout("r11") _,
152+
options(preserves_flags, nostack)
153+
);
131154
}
132155
ret
133156
}
@@ -137,9 +160,16 @@ pub fn syscall3(arg0: u64, arg1: u64, arg2: u64, arg3: u64) -> u64 {
137160
pub fn syscall4(arg0: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64) -> u64 {
138161
let mut ret: u64;
139162
unsafe {
140-
llvm_asm!("syscall" : "={rax}" (ret)
141-
: "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2), "{rdx}" (arg3),
142-
"{r10}" (arg4) : "rcx", "r11", "memory" : "volatile");
163+
asm!("syscall",
164+
inlateout("rax") arg0 => ret,
165+
in("rdi") arg1,
166+
in("rsi") arg2,
167+
in("rdx") arg3,
168+
in("r10") arg4,
169+
lateout("rcx") _,
170+
lateout("r11") _,
171+
options(preserves_flags, nostack)
172+
);
143173
}
144174
ret
145175
}
@@ -149,9 +179,17 @@ pub fn syscall4(arg0: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64) -> u64 {
149179
pub fn syscall5(arg0: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) -> u64 {
150180
let mut ret: u64;
151181
unsafe {
152-
llvm_asm!("syscall" : "={rax}" (ret)
153-
: "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2), "{rdx}" (arg3),
154-
"{r10}" (arg4), "{r8}" (arg5) : "rcx", "r11", "memory" : "volatile");
182+
asm!("syscall",
183+
inlateout("rax") arg0 => ret,
184+
in("rdi") arg1,
185+
in("rsi") arg2,
186+
in("rdx") arg3,
187+
in("r10") arg4,
188+
in("r8") arg5,
189+
lateout("rcx") _,
190+
lateout("r11") _,
191+
options(preserves_flags, nostack)
192+
);
155193
}
156194
ret
157195
}
@@ -169,9 +207,18 @@ pub fn syscall6(
169207
) -> u64 {
170208
let mut ret: u64;
171209
unsafe {
172-
llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2),
173-
"{rdx}" (arg3), "{r10}" (arg4), "{r8}" (arg5), "{r9}" (arg6)
174-
: "rcx", "r11", "memory" : "volatile");
210+
asm!("syscall",
211+
inlateout("rax") arg0 => ret,
212+
in("rdi") arg1,
213+
in("rsi") arg2,
214+
in("rdx") arg3,
215+
in("r10") arg4,
216+
in("r8") arg5,
217+
in("r9") arg6,
218+
lateout("rcx") _,
219+
lateout("r11") _,
220+
options(preserves_flags, nostack)
221+
);
175222
}
176223
ret
177224
}

src/arch/x86_64/processor.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const EFER_TCE: u64 = 1 << 15;
2121
#[inline(always)]
2222
pub fn mb() {
2323
unsafe {
24-
llvm_asm!("mfence" ::: "memory" : "volatile");
24+
asm!("mfence", options(preserves_flags, nostack));
2525
}
2626
}
2727

@@ -33,9 +33,9 @@ pub fn msb(value: u64) -> Option<u64> {
3333
let ret: u64;
3434
unsafe {
3535
asm!("bsr {0}, {1}",
36-
out(reg) ret,
36+
out(reg) ret,
3737
in(reg) value,
38-
options(nomem, nostack)
38+
options(nomem, nostack)
3939
);
4040
}
4141
println!("value {} {}", value, ret);
@@ -52,9 +52,9 @@ pub fn lsb(value: u64) -> Option<u64> {
5252
let ret: u64;
5353
unsafe {
5454
asm!("bsf {0}, {1}",
55-
out(reg) ret,
55+
out(reg) ret,
5656
in(reg) value,
57-
options(nomem, nostack)
57+
options(nomem, nostack)
5858
);
5959
}
6060
Some(ret)

src/arch/x86_64/syscall.rs

Lines changed: 38 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,44 +5,49 @@
55
// http://opensource.org/licenses/MIT>, at your option. This file may not be
66
// copied, modified, or distributed except according to those terms.
77

8+
use crate::syscall::SYSHANDLER_TABLE;
9+
810
#[no_mangle]
911
#[naked]
1012
pub unsafe extern "C" fn syscall_handler() {
11-
llvm_asm!(
13+
asm!(
1214
// save context, see x86_64 ABI
13-
"push %rcx\n\t\
14-
push %rdx\n\t\
15-
push %rsi\n\t\
16-
push %rdi\n\t\
17-
push %r8\n\t\
18-
push %r9\n\t\
19-
push %r10\n\t\
20-
push %r11\n\t\
15+
"push rcx",
16+
"push rdx",
17+
"push rsi",
18+
"push rdi",
19+
"push r8",
20+
"push r9",
21+
"push r10",
22+
"push r11",
2123
// save ds/es and set to kernel data descriptor \n\t\
22-
mov %ds, %rcx\n\t\
23-
push %rcx\n\t\
24-
mov %es, %rcx\n\t\
25-
push %rcx\n\t\
26-
mov $$0x10, %rcx\n\t\
27-
mov %rcx, %ds\n\t\
28-
mov %rcx, %es\n\t\
24+
"mov rcx, ds",
25+
"push rcx",
26+
"mov rcx, es",
27+
"push rcx",
28+
"mov rcx, {kernel_ds}",
29+
"mov ds, rcx",
30+
"mov es, rcx",
2931
// copy 4th argument to rcx to adhere x86_64 ABI \n\t\
30-
mov %r10, %rcx\n\t\
31-
sti\n\t\
32-
call *SYSHANDLER_TABLE(,%rax,8)\n\t
32+
"mov rcx, r10",
33+
"sti",
34+
"call [{sys_handler}+8*rax]",
3335
// restore context, see x86_64 ABI \n\t\
34-
cli\n\t\
35-
pop %rcx\n\t\
36-
mov %rcx, %es\n\t\
37-
pop %rcx\n\t\
38-
mov %rcx, %ds\n\t\
39-
pop %r11\n\t\
40-
pop %r10\n\t\
41-
pop %r9\n\t\
42-
pop %r8\n\t\
43-
pop %rdi\n\t\
44-
pop %rsi\n\t\
45-
pop %rdx\n\t\
46-
pop %rcx\n\t\
47-
sysretq" :::: "volatile");
36+
"cli",
37+
"pop rcx",
38+
"mov es, rcx",
39+
"pop rcx",
40+
"mov ds, rcx",
41+
"pop r11",
42+
"pop r10",
43+
"pop r9",
44+
"pop r8",
45+
"pop rdi",
46+
"pop rsi",
47+
"pop rdx",
48+
"pop rcx",
49+
"sysretq",
50+
sys_handler = sym SYSHANDLER_TABLE,
51+
kernel_ds = const 0x10,
52+
options(noreturn));
4853
}

0 commit comments

Comments
 (0)