Avoid gcc dependency
This commit is contained in:
parent
345624c745
commit
881e7b2ad3
@ -14,4 +14,4 @@ lto = "thin"
|
||||
cstr_core = { version = "0.2.4", default-features = false, features = ["nightly"] }
|
||||
|
||||
[build-dependencies]
|
||||
cc = "1.0.72"
|
||||
nasm-rs = "0.2.2"
|
||||
|
26
Makefile.toml
Normal file
26
Makefile.toml
Normal file
@ -0,0 +1,26 @@
|
||||
[env.production]
|
||||
RELEASE_FLAG = "--release"
|
||||
|
||||
[tasks.default]
|
||||
alias = "all"
|
||||
|
||||
[tasks.all]
|
||||
dependencies = ["objcopy"]
|
||||
|
||||
[tasks.clean]
|
||||
command = "cargo"
|
||||
args = ["clean"]
|
||||
|
||||
[tasks.build-1]
|
||||
command = "cargo"
|
||||
args = ["build", "@@remove-empty(RELEASE_FLAG)"]
|
||||
|
||||
[tasks.build]
|
||||
command = "cargo"
|
||||
args = ["build"]
|
||||
|
||||
[tasks.objcopy]
|
||||
command = "cargo"
|
||||
args = ["objcopy", "@@remove-empty(RELEASE_FLAG)", "--", "-Obinary"]
|
||||
dependencies = ["build-1"]
|
||||
install_crate = { crate_name = "cargo-binutils", binary = "rust-objcopy", test_arg = ["--help"] }
|
7
README.md
Normal file
7
README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Hello-world example for KolibriOS
|
||||
|
||||
Project uses [cargo-make](https://github.com/sagiegurari/cargo-make) for building steps.
|
||||
Also you need a working [NASM](https://nasm.us/).
|
||||
|
||||
Once installed building is trivial then: `cargo make --profile production` produces
|
||||
a ready-to-use binary at `target/i686-kolibri/release/hw_kolibri`.
|
9
build.rs
9
build.rs
@ -1,8 +1,5 @@
|
||||
fn main() {
|
||||
println!("cargo:rerun-if-changed=src/syscalls.c");
|
||||
cc::Build::new()
|
||||
.file("src/syscalls.c")
|
||||
.flag("-fno-PIC") // for some reason `pic(false)` doesn't work
|
||||
.static_flag(true)
|
||||
.compile("syscalls");
|
||||
println!("cargo:rerun-if-changed=src/syscalls.S");
|
||||
nasm_rs::compile_library_args("libsyscalls.a", &["src/syscalls.S"], &["-f elf32"])
|
||||
.expect("failed to compile assembly");
|
||||
}
|
||||
|
@ -7,18 +7,9 @@
|
||||
"has-elf-tls": false,
|
||||
"has-rpath": true,
|
||||
"is-builtin": false,
|
||||
"linker-flavor": "gcc",
|
||||
"linker": "gcc",
|
||||
"linker-flavor": "ld.lld",
|
||||
"linker": "rust-lld",
|
||||
"llvm-target": "i686-unknown-none-code32",
|
||||
"pre-link-args": {
|
||||
"gcc": [
|
||||
"-nostdlib",
|
||||
"-Wl,--build-id=none",
|
||||
"-Wl,--as-needed",
|
||||
"-Wl,-z,noexecstack",
|
||||
"-m32"
|
||||
]
|
||||
},
|
||||
"max-atomic-width": 32,
|
||||
"os": "none",
|
||||
"relocation-model": "static",
|
||||
|
2
link.x
2
link.x
@ -2,8 +2,6 @@ PATH_SIZE = 1024;
|
||||
PARAMS_SIZE = 256;
|
||||
STACK_SIZE = 1024;
|
||||
|
||||
OUTPUT_FORMAT("binary")
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0x24;
|
||||
|
@ -1,16 +1,22 @@
|
||||
#[link(name = "syscalls")]
|
||||
extern "C" {
|
||||
#[link_name = "_start_window_draw"]
|
||||
pub fn start_window_draw();
|
||||
|
||||
#[link_name = "_end_window_draw"]
|
||||
pub fn end_window_draw();
|
||||
|
||||
#[link_name = "exit0"]
|
||||
#[link_name = "_exit"]
|
||||
pub fn exit() -> !;
|
||||
|
||||
#[link_name = "_define_window"]
|
||||
pub fn define_window(ebx: u32, ecx: u32, edx: u32, edi: u32);
|
||||
#[link_name = "_display_message"]
|
||||
pub fn display_message(ebx: u32, ecx: u32, edx: u32, edi: u32, esi: u32);
|
||||
|
||||
#[link_name = "_wait_event"]
|
||||
pub fn wait_event() -> u32;
|
||||
|
||||
#[link_name = "_pressed_key"]
|
||||
pub fn pressed_key() -> u32;
|
||||
}
|
||||
|
67
src/syscalls.S
Normal file
67
src/syscalls.S
Normal file
@ -0,0 +1,67 @@
|
||||
BITS 32
|
||||
|
||||
section .text
|
||||
global _exit
|
||||
global _start_window_draw
|
||||
global _end_window_draw
|
||||
global _define_window
|
||||
global _display_message
|
||||
global _wait_event
|
||||
global _pressed_key
|
||||
|
||||
_exit:
|
||||
mov eax, -1
|
||||
int 0x40
|
||||
|
||||
_start_window_draw:
|
||||
mov eax, 0xc
|
||||
mov ebx, 1
|
||||
int 0x40
|
||||
ret
|
||||
|
||||
_end_window_draw:
|
||||
mov eax, 0xc
|
||||
mov ebx, 2
|
||||
int 0x40
|
||||
ret
|
||||
|
||||
_define_window:
|
||||
push edi
|
||||
push ebx
|
||||
xor eax, eax
|
||||
mov ebx, dword [esp + 0x14]
|
||||
mov ecx, dword [esp + 0x18]
|
||||
mov edx, dword [esp + 0x1c]
|
||||
mov edi, dword [esp + 0x20]
|
||||
mov ebx, 2
|
||||
int 0x40
|
||||
pop ebx
|
||||
pop edi
|
||||
ret
|
||||
|
||||
_display_message:
|
||||
push edi
|
||||
push esi
|
||||
push ebx
|
||||
mov eax, 4
|
||||
mov ebx, dword [esp + 0x14]
|
||||
mov ecx, dword [esp + 0x18]
|
||||
mov edx, dword [esp + 0x1c]
|
||||
mov esi, dword [esp + 0x20]
|
||||
mov edi, dword [esp + 0x24]
|
||||
mov ebx, 2
|
||||
int 0x40
|
||||
pop ebx
|
||||
pop esi
|
||||
pop edi
|
||||
ret
|
||||
|
||||
_wait_event:
|
||||
mov eax, 0xa
|
||||
int 0x40
|
||||
ret
|
||||
|
||||
_pressed_key:
|
||||
mov eax, 2
|
||||
int 0x40
|
||||
ret
|
@ -1,54 +0,0 @@
|
||||
void start_window_draw() {
|
||||
__asm__ volatile (
|
||||
"int $0x40;"
|
||||
:: "a"(12), "b"(1)
|
||||
);
|
||||
}
|
||||
|
||||
void end_window_draw() {
|
||||
__asm__ volatile (
|
||||
"int $0x40;"
|
||||
:: "a"(12), "b"(2)
|
||||
);
|
||||
}
|
||||
|
||||
void exit0() {
|
||||
__asm__ volatile (
|
||||
"int $0x40;"
|
||||
:: "a"(-1)
|
||||
);
|
||||
}
|
||||
|
||||
void define_window(unsigned ebx, unsigned ecx, unsigned edx, unsigned edi) {
|
||||
__asm__ volatile (
|
||||
"int $0x40;"
|
||||
:: "a"(0), "b"(ebx), "c"(ecx), "d"(edx), "D"(edi)
|
||||
: "memory"
|
||||
);
|
||||
}
|
||||
|
||||
void display_message(unsigned ebx, unsigned ecx, unsigned edx, unsigned edi, unsigned esi) {
|
||||
__asm__ volatile (
|
||||
"int $0x40;"
|
||||
:: "a"(4), "b"(ebx), "c"(ecx), "d"(edx), "D"(edi), "S"(esi)
|
||||
: "memory"
|
||||
);
|
||||
}
|
||||
|
||||
unsigned wait_event() {
|
||||
unsigned res;
|
||||
__asm__ volatile (
|
||||
"int $0x40;"
|
||||
: "=r"(res) : "a"(10)
|
||||
);
|
||||
return res;
|
||||
}
|
||||
|
||||
unsigned pressed_key() {
|
||||
unsigned res;
|
||||
__asm__ volatile (
|
||||
"int $0x40;"
|
||||
: "=r"(res) : "a"(2)
|
||||
);
|
||||
return res;
|
||||
}
|
Loading…
Reference in New Issue
Block a user