diff --git a/src/lib.rs b/src/lib.rs index f6d1bc0..2c7b4cf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,18 @@ -#![no_std] +#![no_std] #![feature(naked_functions)] #[cfg(all(target_arch = "x86_64", target_os = "windows"))] mod win64 { + + #[used] #[no_mangle] + static _fltused: i32 = 0; + mod memcpy; mod memset; mod strlen; mod memmove; mod memcmp; + + mod misc; } #[allow(unused)] @@ -35,7 +41,5 @@ extern "system" { - - diff --git a/src/win64/misc.rs b/src/win64/misc.rs new file mode 100644 index 0000000..0439f30 --- /dev/null +++ b/src/win64/misc.rs @@ -0,0 +1,25 @@ +#[no_mangle] #[naked] +pub unsafe extern "C" fn __chkstk() { + core::arch::asm!( + "push %rcx", + "cmp $0x1000,%rax", + "lea 16(%rsp),%rcx", // rsp before calling this routine -> rcx + "jb 1f", + "2:", + "sub $0x1000,%rcx", + "test %rcx,(%rcx)", + "sub $0x1000,%rax", + "cmp $0x1000,%rax", + "ja 2b", + "1:", + "sub %rax,%rcx", + "test %rcx,(%rcx)", + "lea 8(%rsp),%rax", // load pointer to the return address into rax + "mov %rcx,%rsp", // install the new top of stack pointer into rsp + "mov -8(%rax),%rcx", // restore rcx + "push (%rax)", // push return address onto the stack + "sub %rsp,%rax", // restore the original value in rax + "ret", + options(noreturn, att_syntax) + ); +} \ No newline at end of file