Skip to content

Commit 1977333

Browse files
x86_64::mem: add memmove_erms
Signed-off-by: Anhad Singh <[email protected]>
1 parent 02ed486 commit 1977333

File tree

1 file changed

+43
-0
lines changed
  • src/aero_kernel/src/arch/x86_64

1 file changed

+43
-0
lines changed

src/aero_kernel/src/arch/x86_64/mem.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,44 @@ unsafe extern "C" fn memset_stosq(dest: *mut u8, byte: i32, len: usize) -> *mut
7070
)
7171
}
7272

73+
#[no_mangle]
74+
#[naked]
75+
unsafe extern "C" fn memmove_erms(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 {
76+
// Registers used:
77+
//
78+
// %rdi = argument 1, `dest`
79+
// %rsi = argument 2, `src`
80+
// %rdx = argument 3, `len`
81+
asm!(
82+
"mov rax, rdi",
83+
// Skip zero length.
84+
"test rdx, rdx",
85+
"jz 2f",
86+
// Copying forwards:
87+
"mov rcx, rdx",
88+
"cmp rdi, rsi",
89+
"jb 1f",
90+
// `src` == `dest`
91+
"je 2f",
92+
"lea rdx, [rsi + rcx]",
93+
"cmp rdi, rdx",
94+
"jb 3f",
95+
"1:",
96+
"rep movsb",
97+
"2:",
98+
"ret",
99+
// Copying backwards:
100+
"3:",
101+
"lea rdi, [rdi + rcx - 1]",
102+
"lea rsi, [rsi + rcx - 1]",
103+
"std",
104+
"rep movsb",
105+
"cld",
106+
"ret",
107+
options(noreturn)
108+
)
109+
}
110+
73111
// FIXME(andypython): pick the best implementation for the current CPU using indirect functions.
74112

75113
#[no_mangle]
@@ -81,3 +119,8 @@ extern "C" fn memcpy(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 {
81119
extern "C" fn memset(dest: *mut u8, byte: i32, len: usize) -> *mut u8 {
82120
unsafe { memset_stosq(dest, byte, len) }
83121
}
122+
123+
#[no_mangle]
124+
extern "C" fn memmove(dest: *mut u8, src: *const u8, len: usize) -> *mut u8 {
125+
unsafe { memmove_erms(dest, src, len) }
126+
}

0 commit comments

Comments
 (0)