1
0
Fork 0
forked from AbleOS/ableos
This commit is contained in:
peony 2024-10-20 14:21:48 +02:00
commit 92bf9207b3
17 changed files with 123 additions and 186 deletions

72
Cargo.lock generated
View file

@ -26,18 +26,6 @@ version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
[[package]]
name = "ahash"
version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
"once_cell",
"version_check",
"zerocopy",
]
[[package]] [[package]]
name = "allocator-api2" name = "allocator-api2"
version = "0.2.18" version = "0.2.18"
@ -127,9 +115,6 @@ name = "bumpalo"
version = "3.16.0" version = "3.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
dependencies = [
"allocator-api2",
]
[[package]] [[package]]
name = "byteorder" name = "byteorder"
@ -255,6 +240,12 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "foldhash"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
[[package]] [[package]]
name = "form_urlencoded" name = "form_urlencoded"
version = "1.2.1" version = "1.2.1"
@ -331,43 +322,37 @@ version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "hashbrown"
version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
dependencies = [
"ahash",
"allocator-api2",
]
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.15.0" version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
dependencies = [
"allocator-api2",
"equivalent",
"foldhash",
]
[[package]] [[package]]
name = "hbbytecode" name = "hbbytecode"
version = "0.1.0" version = "0.1.0"
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#6ad0b41759dacd5767b5c9cfbc1b3b11c025396a" source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#15e4762d4ac8993d12fe2dd54e2b2d842c8a034b"
[[package]] [[package]]
name = "hblang" name = "hblang"
version = "0.1.0" version = "0.1.0"
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#6ad0b41759dacd5767b5c9cfbc1b3b11c025396a" source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#15e4762d4ac8993d12fe2dd54e2b2d842c8a034b"
dependencies = [ dependencies = [
"hashbrown 0.15.0", "hashbrown",
"hbbytecode", "hbbytecode",
"hbvm", "hbvm",
"log", "log",
"regalloc2",
] ]
[[package]] [[package]]
name = "hbvm" name = "hbvm"
version = "0.1.0" version = "0.1.0"
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#6ad0b41759dacd5767b5c9cfbc1b3b11c025396a" source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#15e4762d4ac8993d12fe2dd54e2b2d842c8a034b"
dependencies = [ dependencies = [
"hbbytecode", "hbbytecode",
] ]
@ -514,7 +499,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.15.0", "hashbrown",
] ]
[[package]] [[package]]
@ -545,7 +530,7 @@ dependencies = [
"aarch64-cpu", "aarch64-cpu",
"crossbeam-queue", "crossbeam-queue",
"derive_more", "derive_more",
"hashbrown 0.14.5", "hashbrown",
"hbvm", "hbvm",
"limine", "limine",
"log", "log",
@ -830,19 +815,6 @@ dependencies = [
"bitflags 2.6.0", "bitflags 2.6.0",
] ]
[[package]]
name = "regalloc2"
version = "0.10.2"
source = "git+https://github.com/jakubDoka/regalloc2?branch=reuse-allocations#21c43e3ee182824e92e2b25f1d3c03ed47f9c02b"
dependencies = [
"allocator-api2",
"bumpalo",
"hashbrown 0.14.5",
"log",
"rustc-hash",
"smallvec",
]
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.8.5" version = "0.8.5"
@ -1035,9 +1007,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.131" version = "1.0.132"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67d42a0bd4ac281beff598909bb56a86acaf979b84483e1c79c10dcaf98f8cf3" checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03"
dependencies = [ dependencies = [
"itoa", "itoa",
"memchr", "memchr",
@ -1325,12 +1297,6 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]] [[package]]
name = "versioning" name = "versioning"
version = "0.1.3" version = "0.1.3"

View file

@ -1,3 +1,4 @@
#![allow(unused)]
use std::io::Write; use std::io::Write;
use idl::build_idl; use idl::build_idl;

View file

@ -4,9 +4,3 @@ build-std-features = ["compiler-builtins-mem"]
[build] [build]
target = "./targets/x86_64-ableos.json" target = "./targets/x86_64-ableos.json"
# [target.'cfg(target_arch = "x86_64")']
# rustflags = [
# "-C",
#"target-feature=+sse4.1,+avx,+aes,+fma,+popcnt,+bmi2,+avx2,+lzcnt,+xsave",
# ]

View file

@ -16,7 +16,7 @@ uart_16550 = { version = "0.3", features = ["nightly"] }
xml.git = "https://git.ablecorp.us/ableos/ableos_userland" xml.git = "https://git.ablecorp.us/ableos/ableos_userland"
versioning.git = "https://git.ablecorp.us/ableos/ableos_userland" versioning.git = "https://git.ablecorp.us/ableos/ableos_userland"
# able_graphics_library.git = "https://git.ablecorp.us/ableos/ableos_userland" # able_graphics_library.git = "https://git.ablecorp.us/ableos/ableos_userland"
hashbrown = { version = "0.14", features = ["nightly"] } hashbrown = { version = "0.15", features = ["nightly"] }
limine = "0.1" limine = "0.1"
[dependencies.crossbeam-queue] [dependencies.crossbeam-queue]

View file

@ -30,6 +30,7 @@ const INITIAL_KERNEL_HEAP_SIZE: *const () = _initial_kernel_heap_size as _;
#[no_mangle] #[no_mangle]
#[naked] #[naked]
#[cfg(not(target_feature = "avx2"))]
unsafe extern "C" fn _kernel_start() -> ! { unsafe extern "C" fn _kernel_start() -> ! {
// Initialise SSE, then jump to kernel entrypoint // Initialise SSE, then jump to kernel entrypoint
core::arch::asm!( core::arch::asm!(
@ -49,58 +50,59 @@ unsafe extern "C" fn _kernel_start() -> ! {
) )
} }
// #[no_mangle] #[no_mangle]
// #[naked] #[naked]
// unsafe extern "C" fn _kernel_start() -> ! { #[cfg(target_feature = "avx2")]
// core::arch::asm!( unsafe extern "C" fn _kernel_start() -> ! {
// // Enable protected mode and configure control registers core::arch::asm!(
// "mov rax, cr0", // Enable protected mode and configure control registers
// "and ax, 0xFFFB", // Clear CR0.EM (bit 2) for coprocessor emulation "mov rax, cr0",
// "or ax, 0x2", // Set CR0.MP (bit 1) for coprocessor monitoring "and ax, 0xFFFB", // Clear CR0.EM (bit 2) for coprocessor emulation
// "mov cr0, rax", "or ax, 0x2", // Set CR0.MP (bit 1) for coprocessor monitoring
"mov cr0, rax",
// "mov rax, cr4", "mov rax, cr4",
// "or ax, (1 << 9) | (1 << 10)", // Set CR4.OSFXSR (bit 9) and CR4.OSXMMEXCPT (bit 10) "or ax, (1 << 9) | (1 << 10)", // Set CR4.OSFXSR (bit 9) and CR4.OSXMMEXCPT (bit 10)
// "mov cr4, rax", "mov cr4, rax",
// // Enable OSXSAVE (required for AVX, AVX2, and XSAVE) // Enable OSXSAVE (required for AVX, AVX2, and XSAVE)
// "mov rax, cr4", "mov rax, cr4",
// "or eax, 1 << 18", // Set CR4.OSXSAVE (bit 18) "or eax, 1 << 18", // Set CR4.OSXSAVE (bit 18)
// "mov cr4, rax", "mov cr4, rax",
// // Enable AVX and AVX2 state saving // Enable AVX and AVX2 state saving
// "xor rcx, rcx", "xor rcx, rcx",
// "xgetbv", "xgetbv",
// "or eax, 7", // Enable SSE, AVX, and AVX2 state saving "or eax, 7", // Enable SSE, AVX, and AVX2 state saving
// "xsetbv", "xsetbv",
// // Check for AVX and XSAVE support // Check for AVX and XSAVE support
// "mov eax, 1", "mov eax, 1",
// "cpuid", "cpuid",
// "and ecx, 0x18000000", "and ecx, 0x18000000",
// "cmp ecx, 0x18000000", "cmp ecx, 0x18000000",
// "jne {1}", // Jump if AVX/OSXSAVE is not supported "jne {1}", // Jump if AVX/OSXSAVE is not supported
// // Check for BMI2 and AVX2 support // Check for BMI2 and AVX2 support
// "mov eax, 7", "mov eax, 7",
// "xor ecx, ecx", "xor ecx, ecx",
// "cpuid", "cpuid",
// "and ebx, (1 << 8) | (1 << 5)", // Check BMI2 (bit 8) and AVX2 (bit 5) "and ebx, (1 << 8) | (1 << 5)", // Check BMI2 (bit 8) and AVX2 (bit 5)
// "cmp ebx, (1 << 8) | (1 << 5)", // Compare to ensure both are supported "cmp ebx, (1 << 8) | (1 << 5)", // Compare to ensure both are supported
// // Check for LZCNT and POPCNT support // Check for LZCNT and POPCNT support
// "mov eax, 1", "mov eax, 1",
// "cpuid", "cpuid",
// "and ecx, (1 << 5) | (1 << 23)", // Check LZCNT (bit 5) and POPCNT (bit 23) "and ecx, (1 << 5) | (1 << 23)", // Check LZCNT (bit 5) and POPCNT (bit 23)
// "cmp ecx, (1 << 5) | (1 << 23)", // Compare to ensure both are supported "cmp ecx, (1 << 5) | (1 << 23)", // Compare to ensure both are supported
// // Jump to the kernel entry point // Jump to the kernel entry point
// "jmp {0}", "jmp {0}",
// sym start, sym start,
// sym oops, sym oops,
// options(noreturn), options(noreturn),
// ) )
// } }
unsafe extern "C" fn oops() -> ! { unsafe extern "C" fn oops() -> ! {
panic!("your cpu is ancient >:(") panic!("your cpu is ancient >:(")

View file

@ -26,9 +26,6 @@ unsafe fn x86_in<T: x86_64::instructions::port::PortRead>(address: u16) -> T {
#[inline(always)] #[inline(always)]
pub fn handler(vm: &mut Vm) { pub fn handler(vm: &mut Vm) {
let ecall_number = vm.registers[2].cast::<u64>(); let ecall_number = vm.registers[2].cast::<u64>();
// log::info!("eca called :pensive:");
// debug!("Ecall number {:?}", ecall_number);
//info!("Register dump: {:?}", vm.registers);
match ecall_number { match ecall_number {
0 => { 0 => {
@ -207,15 +204,3 @@ pub enum LogError {
NoMessages, NoMessages,
InvalidLogFormat, InvalidLogFormat,
} }
// use {alloc::vec, log::Record};
// fn memory_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
// let mut val = alloc::vec::Vec::new();
// for _ in 0..4096 {
// val.push(0);
// }
// info!("Block address: {:?}", val.as_ptr());
// vm.registers[1] = hbvm::value::Value(val.as_ptr() as u64);
// vm.registers[2] = hbvm::value::Value(4096);
// Ok(())
// }

View file

@ -9,12 +9,16 @@ use log::Record;
pub fn log_msg_handler(_vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> { pub fn log_msg_handler(_vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), LogError> {
let msg_vec = block_read(mem_addr, length); let msg_vec = block_read(mem_addr, length);
let log_level = msg_vec.last().unwrap(); let log_level = msg_vec[0];
let strptr = u64::from_le_bytes(msg_vec[1..9].try_into().unwrap());
let strlen = u64::from_le_bytes(msg_vec[9..17].try_into().unwrap()) as usize;
let str = block_read(strptr, strlen);
let file_name = "None"; let file_name = "None";
let line_number = 0; let line_number = 0;
match core::str::from_utf8(&msg_vec[..msg_vec.len() - 1]) { match core::str::from_utf8(&str) {
Ok(strr) => { Ok(strr) => {
use log::Level::*; use log::Level::*;
let log_level = match log_level { let log_level = match log_level {

View file

@ -17,38 +17,16 @@ pub enum MemoryQuotaType {
} }
fn alloc_page(vm: &mut Vm, _mem_addr: u64, _length: usize) -> Result<(), MemoryServiceError> { fn alloc_page(vm: &mut Vm, _mem_addr: u64, _length: usize) -> Result<(), MemoryServiceError> {
let ptr = unsafe { alloc(Layout::from_size_align_unchecked(4096, 4096)) }; let ptr = unsafe { alloc(Layout::from_size_align_unchecked(4096, 8)) };
info!("Block address: {:?}", ptr); info!("Block address: {:?}", ptr);
vm.registers[1] = hbvm::value::Value(ptr as u64); vm.registers[1] = hbvm::value::Value(ptr as u64);
vm.registers[2] = hbvm::value::Value(4096); vm.registers[2] = hbvm::value::Value(4096);
Ok(()) Ok(())
} }
#[inline(always)]
unsafe fn memcpy(mut dest: *mut u8, mut src: *const u8, mut count: usize) {
if count < 16 {
src.copy_to_nonoverlapping(dest, count);
return;
}
while count >= 8 {
if (src as usize) & 7 == 0 && (dest as usize) & 7 == 0 {
*(dest as *mut u64) = *(src as *const u64);
} else {
src.copy_to_nonoverlapping(dest, 8);
}
dest = dest.add(8);
src = src.add(8);
count -= 8;
}
if count > 0 {
src.copy_to_nonoverlapping(dest, count);
}
}
#[inline(always)] #[inline(always)]
unsafe fn memset(mut dest: *mut u8, src: *const u8, count: usize, size: usize) { unsafe fn memset(mut dest: *mut u8, src: *const u8, count: usize, size: usize) {
const BLOCK_SIZE: usize = 64;
let mut remaining = count * size; let mut remaining = count * size;
if remaining < 16 { if remaining < 16 {
@ -56,11 +34,11 @@ unsafe fn memset(mut dest: *mut u8, src: *const u8, count: usize, size: usize) {
return; return;
} }
let mut buffer = [0u8; 64]; let mut buffer = [0u8; BLOCK_SIZE];
let mut buffer_size = size; let mut buffer_size = size;
src.copy_to_nonoverlapping(buffer.as_mut_ptr(), size); src.copy_to_nonoverlapping(buffer.as_mut_ptr(), size);
while buffer_size * 2 <= 64 { while buffer_size * 2 <= BLOCK_SIZE {
buffer buffer
.as_mut_ptr() .as_mut_ptr()
.copy_to_nonoverlapping(buffer.as_mut_ptr().add(buffer_size), buffer_size); .copy_to_nonoverlapping(buffer.as_mut_ptr().add(buffer_size), buffer_size);
@ -68,12 +46,15 @@ unsafe fn memset(mut dest: *mut u8, src: *const u8, count: usize, size: usize) {
} }
let buffer_ptr = buffer.as_ptr() as *const u64; let buffer_ptr = buffer.as_ptr() as *const u64;
while remaining >= 8 {
if (dest as usize) & 7 == 0 { while (dest as usize) & 7 != 0 && remaining >= 8 {
*(dest as *mut u64) = *buffer_ptr; buffer.as_ptr().copy_to_nonoverlapping(dest, 1);
} else { dest = dest.add(1);
buffer.as_ptr().copy_to_nonoverlapping(dest, 8); remaining -= 1;
} }
while remaining >= 8 {
*(dest as *mut u64) = *buffer_ptr;
dest = dest.add(8); dest = dest.add(8);
remaining -= 8; remaining -= 8;
} }
@ -101,7 +82,7 @@ pub fn memory_msg_handler(
let ptr = alloc(Layout::from_size_align_unchecked( let ptr = alloc(Layout::from_size_align_unchecked(
page_count as usize * 4096, page_count as usize * 4096,
4096, 8,
)); ));
vm.registers[1] = hbvm::value::Value(ptr as u64); vm.registers[1] = hbvm::value::Value(ptr as u64);
@ -117,7 +98,7 @@ pub fn memory_msg_handler(
dealloc( dealloc(
mptr as *mut u8, mptr as *mut u8,
Layout::from_size_align_unchecked(page_count as usize * 4096, 4096), Layout::from_size_align_unchecked(page_count as usize * 4096, 8),
) )
}, },
2 => { 2 => {
@ -147,7 +128,7 @@ pub fn memory_msg_handler(
let src = u64::from_le_bytes(msg_vec[9..17].try_into().unwrap_unchecked()) as *const u8; let src = u64::from_le_bytes(msg_vec[9..17].try_into().unwrap_unchecked()) as *const u8;
let dest = u64::from_le_bytes(msg_vec[17..25].try_into().unwrap_unchecked()) as *mut u8; let dest = u64::from_le_bytes(msg_vec[17..25].try_into().unwrap_unchecked()) as *mut u8;
memcpy(dest, src, count); src.copy_to_nonoverlapping(dest, count);
}, },
5 => unsafe { 5 => unsafe {
let count = u64::from_le_bytes(msg_vec[1..9].try_into().unwrap_unchecked()) as usize; let count = u64::from_le_bytes(msg_vec[1..9].try_into().unwrap_unchecked()) as usize;

View file

@ -22,21 +22,19 @@ pub enum ServiceError {
pub fn sds_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), ServiceError> { pub fn sds_msg_handler(vm: &mut Vm, mem_addr: u64, length: usize) -> Result<(), ServiceError> {
let msg_vec = block_read(mem_addr, length); let msg_vec = block_read(mem_addr, length);
let sds_event_type: ServiceEventType = msg_vec[0].into(); let sds_event_type: ServiceEventType = msg_vec[0].into();
let strptr = u64::from_le_bytes(msg_vec[1..9].try_into().unwrap());
// info!("Length {}", msg_vec.len()); let strlen = u64::from_le_bytes(msg_vec[9..17].try_into().unwrap()) as usize;
let string_vec = block_read(strptr, strlen);
let string = core::str::from_utf8(string_vec).expect("Our bytes should be valid utf8");
use ServiceEventType::*; use ServiceEventType::*;
match sds_event_type { match sds_event_type {
CreateService => { CreateService => {
let string =
core::str::from_utf8(&msg_vec[1..]).expect("Our bytes should be valid utf8");
let ret = sds_create_service(string); let ret = sds_create_service(string);
vm.registers[1] = hbvm::value::Value(ret as u64); vm.registers[1] = hbvm::value::Value(ret as u64);
} }
DeleteService => todo!(), DeleteService => todo!(),
SearchServices => { SearchServices => {
let string =
core::str::from_utf8(&msg_vec[1..]).expect("Our bytes should be valid utf8");
let ret = sds_search_service(string); let ret = sds_search_service(string);
vm.registers[1] = hbvm::value::Value(ret as u64); vm.registers[1] = hbvm::value::Value(ret as u64);
} }

View file

@ -97,7 +97,7 @@ impl HandlePageFault for PageFaultHandler {
#[inline(always)] #[inline(always)]
const fn stack_layout() -> Layout { const fn stack_layout() -> Layout {
unsafe { Layout::from_size_align_unchecked(STACK_SIZE, 4096) } unsafe { Layout::from_size_align_unchecked(STACK_SIZE, 8) }
} }
#[inline(always)] #[inline(always)]

View file

@ -20,8 +20,9 @@ derive_more = { version = "1", default-features = false, features = [
error-stack = "0.5" error-stack = "0.5"
fatfs = "0.3" fatfs = "0.3"
toml = "0.8" toml = "0.8"
# hbasm.git = "https://git.ablecorp.us/AbleOS/holey-bytes.git" hblang = { git = "https://git.ablecorp.us/AbleOS/holey-bytes.git", features = [
hblang.git = "https://git.ablecorp.us/AbleOS/holey-bytes.git" "std",
], default-features = false }
log = "0.4" log = "0.4"
raw-cpuid = "11" raw-cpuid = "11"

View file

@ -38,6 +38,8 @@ fn main() -> Result<(), Error> {
target = Target::Riscv64Virt; target = Target::Riscv64Virt;
} else if arg == "arm64" || arg == "aarch64" || arg == "aarch64-virt" { } else if arg == "arm64" || arg == "aarch64" || arg == "aarch64-virt" {
target = Target::Aarch64; target = Target::Aarch64;
} else if arg == "avx2" {
target = Target::X86_64Avx2;
} else { } else {
return Err(report!(Error::InvalidSubCom)); return Err(report!(Error::InvalidSubCom));
} }
@ -61,6 +63,8 @@ fn main() -> Result<(), Error> {
target = Target::Aarch64; target = Target::Aarch64;
} else if arg == "--noaccel" { } else if arg == "--noaccel" {
do_accel = false; do_accel = false;
} else if arg == "avx2" {
target = Target::X86_64Avx2;
} else { } else {
return Err(report!(Error::InvalidSubCom)); return Err(report!(Error::InvalidSubCom));
} }
@ -304,6 +308,9 @@ fn build(release: bool, target: Target, debuginfo: bool) -> Result<(), Error> {
if target == Target::Aarch64 { if target == Target::Aarch64 {
com.args(["--target", "targets/aarch64-virt-ableos.json"]); com.args(["--target", "targets/aarch64-virt-ableos.json"]);
} }
if target == Target::X86_64Avx2 {
com.args(["--target", "targets/x86_64_v3-ableos.json"]);
}
match com.status() { match com.status() {
Ok(s) if s.code() != Some(0) => bail!(Error::Build), Ok(s) if s.code() != Some(0) => bail!(Error::Build),
@ -317,6 +324,10 @@ fn build(release: bool, target: Target, debuginfo: bool) -> Result<(), Error> {
path.push_str("_x86-64"); path.push_str("_x86-64");
"target/x86_64-ableos" "target/x86_64-ableos"
} }
Target::X86_64Avx2 => {
path.push_str("_x86-64");
"target/x86_64_v3-ableos"
}
Target::Riscv64Virt => "target/riscv64-virt-ableos", Target::Riscv64Virt => "target/riscv64-virt-ableos",
Target::Aarch64 => { Target::Aarch64 => {
path.push_str("_aarch64"); path.push_str("_aarch64");
@ -341,7 +352,7 @@ fn build(release: bool, target: Target, debuginfo: bool) -> Result<(), Error> {
fn run(release: bool, target: Target, do_accel: bool) -> Result<(), Error> { fn run(release: bool, target: Target, do_accel: bool) -> Result<(), Error> {
let target_str = match target { let target_str = match target {
Target::X86_64 => "qemu-system-x86_64", Target::X86_64 | Target::X86_64Avx2 => "qemu-system-x86_64",
Target::Riscv64Virt => "qemu-system-riscv64", Target::Riscv64Virt => "qemu-system-riscv64",
Target::Aarch64 => "qemu-system-aarch64", Target::Aarch64 => "qemu-system-aarch64",
}; };
@ -384,7 +395,7 @@ fn run(release: bool, target: Target, do_accel: bool) -> Result<(), Error> {
}; };
match target { match target {
Target::X86_64 => { Target::X86_64 | Target::X86_64Avx2 => {
#[rustfmt::skip] #[rustfmt::skip]
com.args([ com.args([
"-bios", &ovmf_path.change_context(Error::OvmfFetch)?, "-bios", &ovmf_path.change_context(Error::OvmfFetch)?,
@ -442,7 +453,7 @@ fn run(release: bool, target: Target, do_accel: bool) -> Result<(), Error> {
fn fetch_ovmf(target: Target) -> Result<String, OvmfFetchError> { fn fetch_ovmf(target: Target) -> Result<String, OvmfFetchError> {
let (ovmf_url, ovmf_path) = match target { let (ovmf_url, ovmf_path) = match target {
Target::X86_64 => ( Target::X86_64 | Target::X86_64Avx2 => (
"https://retrage.github.io/edk2-nightly/bin/RELEASEX64_OVMF.fd", "https://retrage.github.io/edk2-nightly/bin/RELEASEX64_OVMF.fd",
"target/RELEASEX64_OVMF.fd", "target/RELEASEX64_OVMF.fd",
), ),
@ -491,6 +502,7 @@ impl Context for OvmfFetchError {}
#[derive(Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy, PartialEq, Eq)]
enum Target { enum Target {
X86_64, X86_64,
X86_64Avx2,
Riscv64Virt, Riscv64Virt,
Aarch64, Aarch64,
} }

View file

@ -8,15 +8,12 @@ write := fn(msg: ^u8, buffer_id: int, length: int): void {
return @eca(3, buffer_id, msg, length) return @eca(3, buffer_id, msg, length)
} }
BufferMsg := packed struct {operation: u8, msg: ^u8, msg_len: uint}
create := fn(msg: ^u8): int { create := fn(msg: ^u8): int {
msg_length := @inline(string.length, msg); return @eca(3, 0, BufferMsg.(0, msg, @inline(string.length, msg)), @sizeof(BufferMsg))
*msg = 0
return @eca(3, 0, msg, msg_length)
} }
search := fn(msg: ^u8): int { search := fn(msg: ^u8): int {
msg_length := @inline(string.length, msg); return @eca(3, 0, BufferMsg.(3, msg, @inline(string.length, msg)), @sizeof(BufferMsg))
*msg = 3
return @eca(3, 0, msg, msg_length)
} }

View file

@ -1,10 +1,9 @@
string := @use("string.hb") string := @use("string.hb")
log := fn($Level: u8, message: ^u8): void { LogMsg := packed struct {level: u8, string: ^u8, strlen: uint}
message_length := @inline(string.length, message);
*(message + message_length) = Level
return @eca(3, 1, message, message_length + 1) log := fn($Level: u8, message: ^u8): void {
return @eca(3, 1, LogMsg.(Level, message, @inline(string.length, message)), @sizeof(LogMsg))
} }
error := fn(message: ^u8): void return @inline(log, 0, message) error := fn(message: ^u8): void return @inline(log, 0, message)

View file

@ -1,5 +1,5 @@
length := fn(ptr: ^u8): int { length := fn(ptr: ^u8): uint {
len := 0 len := @as(uint, 0)
loop if *(ptr + len) == 0 break else len += 1 loop if *(ptr + len) == 0 break else len += 1
return len return len
} }
@ -31,9 +31,7 @@ display_int := fn(num: int, p: ^u8): ^u8 {
} }
reverse := fn(s: ^u8): void { reverse := fn(s: ^u8): void {
//reverse a string, don't remove digits len := @inline(length, s)
len := 0
loop if *(s + len) == 0 break else len += 1
i := 0 i := 0
j := len - 1 j := len - 1
temp := 0 temp := 0

View file

@ -3,7 +3,7 @@
render := @use("../../../../libraries/render/src/lib.hb") render := @use("../../../../libraries/render/src/lib.hb")
/* expected result: /* expected result:
the square example bounces around the screen */ bouncing gradient square inside coloured bouncing box inside black screen */
example := fn(): void { example := fn(): void {
screen := render.init(true) screen := render.init(true)
@ -20,7 +20,6 @@ example := fn(): void {
target_color := color target_color := color
loop { loop {
render.clear(screen, render.black) render.clear(screen, render.black)
// color += .(1, 1, 1, 1)
render.put_filled_rect(image, pos_inner, .(side, side), color) render.put_filled_rect(image, pos_inner, .(side, side), color)
render.put_rect(image, pos_inner, .(side, side), render.black) render.put_rect(image, pos_inner, .(side, side), render.black)
render.put_rect(image, .(0, 0), .(image.width - 1, image.height - 1), color) render.put_rect(image, .(0, 0), .(image.width - 1, image.height - 1), color)