forked from AbleOS/ableos
fix icky pointer misalignment
move dt_api to stn for ease of use do away with now redundant strobe example (colour example is basically strobe now)
This commit is contained in:
parent
6fa1c829fd
commit
1eee33ce8b
|
@ -24,6 +24,74 @@ fn alloc_page(vm: &mut Vm, _mem_addr: u64, _length: usize) -> Result<(), MemoryS
|
|||
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;
|
||||
}
|
||||
|
||||
// let dest_misalignment = dest as usize & 7;
|
||||
// if dest_misalignment != 0 {
|
||||
// let align_bytes = 8 - dest_misalignment;
|
||||
// src.copy_to_nonoverlapping(dest, align_bytes);
|
||||
// dest = dest.add(align_bytes);
|
||||
// src = src.add(align_bytes);
|
||||
// count -= align_bytes;
|
||||
// }
|
||||
|
||||
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)]
|
||||
unsafe fn memset(mut dest: *mut u8, src: *const u8, count: usize, size: usize) {
|
||||
let mut remaining = count * size;
|
||||
|
||||
if remaining < 16 {
|
||||
src.copy_to_nonoverlapping(dest, remaining);
|
||||
return;
|
||||
}
|
||||
|
||||
let mut buffer = [0u8; 64];
|
||||
let mut buffer_size = size;
|
||||
src.copy_to_nonoverlapping(buffer.as_mut_ptr(), size);
|
||||
|
||||
while buffer_size * 2 <= 64 {
|
||||
buffer
|
||||
.as_mut_ptr()
|
||||
.copy_to_nonoverlapping(buffer.as_mut_ptr().add(buffer_size), buffer_size);
|
||||
buffer_size *= 2;
|
||||
}
|
||||
|
||||
let buffer_ptr = buffer.as_ptr() as *const u64;
|
||||
while remaining >= 8 {
|
||||
if (dest as usize) & 7 == 0 {
|
||||
*(dest as *mut u64) = *buffer_ptr;
|
||||
} else {
|
||||
buffer.as_ptr().copy_to_nonoverlapping(dest, 8);
|
||||
}
|
||||
dest = dest.add(8);
|
||||
remaining -= 8;
|
||||
}
|
||||
|
||||
if remaining > 0 {
|
||||
buffer.as_ptr().copy_to_nonoverlapping(dest, remaining);
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn memory_msg_handler(
|
||||
vm: &mut Vm,
|
||||
|
@ -83,130 +151,21 @@ pub fn memory_msg_handler(
|
|||
let page_count = msg_vec[1];
|
||||
log::debug!(" {} pages", page_count);
|
||||
}
|
||||
// trash but fast memcpy
|
||||
4 => unsafe {
|
||||
let count = u64::from_le_bytes(msg_vec[1..9].try_into().unwrap_unchecked()) as usize;
|
||||
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 mut src_ptr = src;
|
||||
let mut dest_ptr = dest;
|
||||
let mut remaining = count;
|
||||
|
||||
while (dest_ptr as usize) & 7 != 0 && remaining > 0 {
|
||||
*dest_ptr = *src_ptr;
|
||||
src_ptr = src_ptr.add(1);
|
||||
dest_ptr = dest_ptr.add(1);
|
||||
remaining -= 1;
|
||||
}
|
||||
|
||||
let mut src_ptr_64 = src_ptr as *const u64;
|
||||
let mut dest_ptr_64 = dest_ptr as *mut u64;
|
||||
while remaining >= 64 {
|
||||
let (s1, s2, s3, s4, s5, s6, s7, s8) = (
|
||||
*src_ptr_64,
|
||||
*src_ptr_64.add(1),
|
||||
*src_ptr_64.add(2),
|
||||
*src_ptr_64.add(3),
|
||||
*src_ptr_64.add(4),
|
||||
*src_ptr_64.add(5),
|
||||
*src_ptr_64.add(6),
|
||||
*src_ptr_64.add(7),
|
||||
);
|
||||
*dest_ptr_64 = s1;
|
||||
*dest_ptr_64.add(1) = s2;
|
||||
*dest_ptr_64.add(2) = s3;
|
||||
*dest_ptr_64.add(3) = s4;
|
||||
*dest_ptr_64.add(4) = s5;
|
||||
*dest_ptr_64.add(5) = s6;
|
||||
*dest_ptr_64.add(6) = s7;
|
||||
*dest_ptr_64.add(7) = s8;
|
||||
src_ptr_64 = src_ptr_64.add(8);
|
||||
dest_ptr_64 = dest_ptr_64.add(8);
|
||||
remaining -= 64;
|
||||
}
|
||||
|
||||
while remaining >= 8 {
|
||||
*dest_ptr_64 = *src_ptr_64;
|
||||
src_ptr_64 = src_ptr_64.add(1);
|
||||
dest_ptr_64 = dest_ptr_64.add(1);
|
||||
remaining -= 8;
|
||||
}
|
||||
|
||||
src_ptr = src_ptr_64 as *const u8;
|
||||
dest_ptr = dest_ptr_64 as *mut u8;
|
||||
for _ in 0..remaining {
|
||||
*dest_ptr = *src_ptr;
|
||||
src_ptr = src_ptr.add(1);
|
||||
dest_ptr = dest_ptr.add(1);
|
||||
}
|
||||
memcpy(dest, src, count);
|
||||
},
|
||||
|
||||
// trash but fast memset
|
||||
5 => unsafe {
|
||||
let count = u64::from_le_bytes(msg_vec[1..9].try_into().unwrap_unchecked()) as usize;
|
||||
let size = u64::from_le_bytes(msg_vec[9..17].try_into().unwrap_unchecked()) as usize;
|
||||
let dest = u64::from_le_bytes(msg_vec[17..25].try_into().unwrap_unchecked()) as *mut u8;
|
||||
let src =
|
||||
u64::from_le_bytes(msg_vec[25..33].try_into().unwrap_unchecked()) as *const u8;
|
||||
u64::from_le_bytes(msg_vec[17..25].try_into().unwrap_unchecked()) as *const u8;
|
||||
let dest = u64::from_le_bytes(msg_vec[25..33].try_into().unwrap_unchecked()) as *mut u8;
|
||||
|
||||
let total_size = count * size;
|
||||
|
||||
if total_size > 32 {
|
||||
let mut pattern_512 = [0u8; 64];
|
||||
for i in 0..64 {
|
||||
pattern_512[i] = *src.add(i % size);
|
||||
}
|
||||
let pattern_512_ptr = pattern_512.as_ptr() as *const u64;
|
||||
|
||||
let mut dest_ptr = dest;
|
||||
let mut remaining = total_size;
|
||||
|
||||
while (dest_ptr as usize) & 7 != 0 && remaining > 0 {
|
||||
*dest_ptr = *src;
|
||||
dest_ptr = dest_ptr.add(1);
|
||||
remaining -= 1;
|
||||
}
|
||||
|
||||
let mut dest_ptr_64 = dest_ptr as *mut u64;
|
||||
while remaining >= 64 {
|
||||
let (p1, p2, p3, p4, p5, p6, p7, p8) = (
|
||||
*pattern_512_ptr,
|
||||
*pattern_512_ptr.add(1),
|
||||
*pattern_512_ptr.add(2),
|
||||
*pattern_512_ptr.add(3),
|
||||
*pattern_512_ptr.add(4),
|
||||
*pattern_512_ptr.add(5),
|
||||
*pattern_512_ptr.add(6),
|
||||
*pattern_512_ptr.add(7),
|
||||
);
|
||||
*dest_ptr_64 = p1;
|
||||
*dest_ptr_64.add(1) = p2;
|
||||
*dest_ptr_64.add(2) = p3;
|
||||
*dest_ptr_64.add(3) = p4;
|
||||
*dest_ptr_64.add(4) = p5;
|
||||
*dest_ptr_64.add(5) = p6;
|
||||
*dest_ptr_64.add(6) = p7;
|
||||
*dest_ptr_64.add(7) = p8;
|
||||
dest_ptr_64 = dest_ptr_64.add(8);
|
||||
remaining -= 64;
|
||||
}
|
||||
|
||||
while remaining >= 8 {
|
||||
*dest_ptr_64 = *pattern_512_ptr;
|
||||
dest_ptr_64 = dest_ptr_64.add(1);
|
||||
remaining -= 8;
|
||||
}
|
||||
|
||||
dest_ptr = dest_ptr_64 as *mut u8;
|
||||
for i in 0..remaining {
|
||||
*dest_ptr.add(i) = *src.add(i % size);
|
||||
}
|
||||
} else {
|
||||
for i in 0..total_size {
|
||||
*dest.add(i) = *src.add(i % size);
|
||||
}
|
||||
}
|
||||
memset(dest, src, count, size);
|
||||
},
|
||||
_ => {
|
||||
log::debug!("Unknown memory service message type: {}", msg_type);
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
# dt_api
|
|
@ -1,6 +0,0 @@
|
|||
.{string} := @use("../../stn/src/lib.hb")
|
||||
|
||||
dt_get := fn($Expr: type, query: ^u8): Expr {
|
||||
length := string.length(query)
|
||||
return @eca(3, 5, query, length)
|
||||
}
|
|
@ -1,5 +1,4 @@
|
|||
.{math, memory} := @use("../../stn/src/lib.hb");
|
||||
.{dt_get} := @use("../../dt_api/src/lib.hb");
|
||||
.{math, memory, dt} := @use("../../stn/src/lib.hb");
|
||||
.{Color, Image} := @use("lib.hb");
|
||||
.{Vec2} := math
|
||||
|
||||
|
@ -16,12 +15,12 @@ Context := struct {
|
|||
}
|
||||
|
||||
init := fn(): void {
|
||||
width := dt_get(int, "framebuffer/fb0/width\0")
|
||||
height := dt_get(int, "framebuffer/fb0/height\0")
|
||||
width := dt.get(int, "framebuffer/fb0/width\0")
|
||||
height := dt.get(int, "framebuffer/fb0/height\0")
|
||||
pixels := width * height
|
||||
back_buffer := memory.alloc(Color, pixels * @bitcast(@sizeof(Color)))
|
||||
ctx = Context.{
|
||||
fb: dt_get(^Color, "framebuffer/fb0/ptr\0"),
|
||||
fb: dt.get(^Color, "framebuffer/fb0/ptr\0"),
|
||||
bb: back_buffer,
|
||||
buf: back_buffer,
|
||||
width,
|
||||
|
|
5
sysdata/libraries/stn/src/dt.hb
Normal file
5
sysdata/libraries/stn/src/dt.hb
Normal file
|
@ -0,0 +1,5 @@
|
|||
.{string} := @use("../../stn/src/lib.hb")
|
||||
|
||||
get := fn($Expr: type, query: ^u8): Expr {
|
||||
return @eca(3, 5, query, @inline(string.length, query))
|
||||
}
|
|
@ -1,5 +1,4 @@
|
|||
acs := @use("acs.hb")
|
||||
|
||||
string := @use("string.hb")
|
||||
log := @use("log.hb")
|
||||
memory := @use("memory.hb")
|
||||
|
@ -7,3 +6,4 @@ buffer := @use("buffer.hb")
|
|||
math := @use("math.hb")
|
||||
random := @use("random.hb")
|
||||
file := @use("file_io.hb")
|
||||
dt := @use("dt.hb")
|
|
@ -64,7 +64,7 @@ copy := fn($Expr: type, src: ^Expr, dest: ^Expr, count: uint): void {
|
|||
return @eca(3, 2, &CopyMsg.(4, count * @sizeof(Expr), @bitcast(src), @bitcast(dest)), @sizeof(CopyMsg))
|
||||
}
|
||||
|
||||
SetMsg := packed struct {a: u8, count: uint, size: uint, dest: ^u8, src: ^u8}
|
||||
SetMsg := packed struct {a: u8, count: uint, size: uint, src: ^u8, dest: ^u8}
|
||||
set := fn($Expr: type, src: ^Expr, dest: ^Expr, count: uint): void {
|
||||
return @eca(3, 2, &SetMsg.(5, count, @sizeof(Expr), @bitcast(dest), @bitcast(src)), @sizeof(SetMsg))
|
||||
return @eca(3, 2, &SetMsg.(5, count, @sizeof(Expr), @bitcast(src), @bitcast(dest)), @sizeof(SetMsg))
|
||||
}
|
|
@ -1,14 +1,13 @@
|
|||
dt_api := @use("../../../libraries/dt_api/src/lib.hb");
|
||||
.{dt_get} := dt_api
|
||||
.{dt} := @use("../../../libraries/stn/src/lib.hb")
|
||||
|
||||
main := fn(): int {
|
||||
dt_api.dt_get("framebuffer/fb0/width\0")
|
||||
dt_api.dt_get("cpu/cpu0/architecture\0")
|
||||
dt.get(int, "framebuffer/fb0/width\0")
|
||||
dt.get(int, "cpu/cpu0/architecture\0")
|
||||
|
||||
// Checking if the first detected serial port is memory mapped or port mapped
|
||||
// 0 -> memory mapped
|
||||
// 1 -> port mapped
|
||||
dt_get("serial_ports/sp0/mapping\0")
|
||||
dt.get(int, "serial_ports/sp0/mapping\0")
|
||||
|
||||
return 0
|
||||
}
|
|
@ -1,15 +0,0 @@
|
|||
render := @use("../../../../libraries/render/src/lib.hb")
|
||||
|
||||
/* expected result: (EPILEPSY WARNING)
|
||||
the screen rapidly flashes red then black */
|
||||
|
||||
example := fn(): void {
|
||||
render.init()
|
||||
loop {
|
||||
render.clear(render.red)
|
||||
render.sync()
|
||||
render.clear(render.yellow)
|
||||
render.sync()
|
||||
}
|
||||
return
|
||||
}
|
|
@ -2,9 +2,7 @@ stn := @use("../../../libraries/stn/src/lib.hb");
|
|||
.{string, memory, buffer, log} := stn
|
||||
|
||||
pci := @use("../../../libraries/pci/src/lib.hb");
|
||||
.{PCIAddress, get_ids, config_read32} := pci;
|
||||
|
||||
.{dt_get} := @use("../../../libraries/dt_api/src/lib.hb")
|
||||
.{PCIAddress, get_ids, config_read32} := pci
|
||||
|
||||
reg := @use("./reg.hb")
|
||||
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
default_entry = 1
|
||||
timeout = 0
|
||||
verbose = false
|
||||
# interface_resolution = "1920x1080x24"
|
||||
interface_resolution = "1024x768x24"
|
||||
# interface_resolution = "640x480x32"
|
||||
# interface_resolution = "640x480x24"
|
||||
# Terminal related settings
|
||||
term_wallpaper = "boot:///background.bmp"
|
||||
# term_wallpaper = "boot:///empty-background.bmp"
|
||||
# term_wallpaper = "boot:///background.bmp"
|
||||
term_wallpaper = "boot:///empty-background.bmp"
|
||||
term_background = "008080"
|
||||
|
||||
[boot.limine.ableos]
|
||||
|
@ -15,8 +16,9 @@ comment = "Default AbleOS boot entry."
|
|||
protocol = "limine"
|
||||
kernel_path = "boot:///kernel_${ARCH}"
|
||||
kernel_cmdline = ""
|
||||
# resolution = "640x480x32"
|
||||
# resolution = "1920x1080x24"
|
||||
resolution = "1024x768x24"
|
||||
# resolution = "640x480x24"
|
||||
|
||||
[boot.limine.ableos.modules]
|
||||
|
||||
|
|
Loading…
Reference in a new issue