mirror of
https://gitlab.com/bztsrc/bootboot.git
synced 2023-02-13 20:54:32 -05:00
Add basic support for elf
This commit is contained in:
parent
619c2f9135
commit
1364dac184
12 changed files with 911 additions and 2 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -5,3 +5,6 @@ aarch64-rpi/LIC*
|
||||||
aarch64-rpi/*.bin
|
aarch64-rpi/*.bin
|
||||||
aarch64-rpi/*.dat
|
aarch64-rpi/*.dat
|
||||||
aarch64-rpi/*.elf
|
aarch64-rpi/*.elf
|
||||||
|
|
||||||
|
mykernel-rust/target
|
||||||
|
mykernel-rust/Cargo.lock
|
|
@ -20,9 +20,9 @@ mkimg: mkimg.c
|
||||||
initrd.bin:
|
initrd.bin:
|
||||||
@mkdir initrd initrd/sys 2>/dev/null | true
|
@mkdir initrd initrd/sys 2>/dev/null | true
|
||||||
ifeq ($(PLATFORM),x86)
|
ifeq ($(PLATFORM),x86)
|
||||||
cp ../mykernel/mykernel.x86_64.elf initrd/sys/core
|
cp ../mykernel-rust/mykernel.x86_64.elf initrd/sys/core
|
||||||
else
|
else
|
||||||
cp ../mykernel/mykernel.aarch64.elf initrd/sys/core
|
cp ../mykernel-rust/mykernel.aarch64.elf initrd/sys/core
|
||||||
endif
|
endif
|
||||||
@cd initrd && (find . | cpio -H hpodc -o | gzip > ../initrd.bin) && cd ..
|
@cd initrd && (find . | cpio -H hpodc -o | gzip > ../initrd.bin) && cd ..
|
||||||
@rm -r initrd 2>/dev/null || true
|
@rm -r initrd 2>/dev/null || true
|
||||||
|
|
9
mykernel-rust/Cargo.toml
Executable file
9
mykernel-rust/Cargo.toml
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "mykernel-rust"
|
||||||
|
version = "0.0.1"
|
||||||
|
authors = ["Author <email@example.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rlibc = "1.0"
|
||||||
|
|
10
mykernel-rust/Makefile
Normal file
10
mykernel-rust/Makefile
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
|
||||||
|
all: mykernel.x86_64.elf
|
||||||
|
|
||||||
|
# Kernel build
|
||||||
|
mykernel.x86_64.elf: src/**
|
||||||
|
objcopy -O elf64-x86-64 -B i386 -I binary font.psf font.o
|
||||||
|
cargo xbuild --target ./triplets/mykernel-x86.json
|
||||||
|
# Using this causes the kernel to exceed the 2 MB limit
|
||||||
|
# cargo build -Z build-std=core,alloc --target ./triplets/$mykernel-x86.json
|
||||||
|
cp ./target/mykernel-x86/debug/mykernel-rust mykernel.x86_64.elf
|
BIN
mykernel-rust/font.o
Normal file
BIN
mykernel-rust/font.o
Normal file
Binary file not shown.
BIN
mykernel-rust/font.psf
Normal file
BIN
mykernel-rust/font.psf
Normal file
Binary file not shown.
BIN
mykernel-rust/mykernel.x86_64.elf
Executable file
BIN
mykernel-rust/mykernel.x86_64.elf
Executable file
Binary file not shown.
1
mykernel-rust/rust-toolchain
Executable file
1
mykernel-rust/rust-toolchain
Executable file
|
@ -0,0 +1 @@
|
||||||
|
nightly
|
702
mykernel-rust/src/bootboot.rs
Normal file
702
mykernel-rust/src/bootboot.rs
Normal file
|
@ -0,0 +1,702 @@
|
||||||
|
/* automatically generated by rust-bindgen */
|
||||||
|
|
||||||
|
pub const BOOTBOOT_MAGIC: &'static [u8; 5usize] = b"BOOT\0";
|
||||||
|
pub const PROTOCOL_MINIMAL: u32 = 0;
|
||||||
|
pub const PROTOCOL_STATIC: u32 = 1;
|
||||||
|
pub const PROTOCOL_DYNAMIC: u32 = 2;
|
||||||
|
pub const PROTOCOL_BIGENDIAN: u32 = 128;
|
||||||
|
pub const LOADER_BIOS: u32 = 0;
|
||||||
|
pub const LOADER_UEFI: u32 = 4;
|
||||||
|
pub const LOADER_RPI: u32 = 8;
|
||||||
|
pub const FB_ARGB: u32 = 0;
|
||||||
|
pub const FB_RGBA: u32 = 1;
|
||||||
|
pub const FB_ABGR: u32 = 2;
|
||||||
|
pub const FB_BGRA: u32 = 3;
|
||||||
|
pub const MMAP_USED: u32 = 0;
|
||||||
|
pub const MMAP_FREE: u32 = 1;
|
||||||
|
pub const MMAP_ACPI: u32 = 2;
|
||||||
|
pub const MMAP_MMIO: u32 = 3;
|
||||||
|
pub const INITRD_MAXSIZE: u32 = 16;
|
||||||
|
#[repr(C, packed)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct MMapEnt {
|
||||||
|
pub ptr: u64,
|
||||||
|
pub size: u64,
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn bindgen_test_layout_MMapEnt() {
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::size_of::<MMapEnt>(),
|
||||||
|
16usize,
|
||||||
|
concat!("Size of: ", stringify!(MMapEnt))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::align_of::<MMapEnt>(),
|
||||||
|
1usize,
|
||||||
|
concat!("Alignment of ", stringify!(MMapEnt))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<MMapEnt>())).ptr as *const _ as usize },
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(MMapEnt),
|
||||||
|
"::",
|
||||||
|
stringify!(ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<MMapEnt>())).size as *const _ as usize },
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(MMapEnt),
|
||||||
|
"::",
|
||||||
|
stringify!(size)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[repr(C, packed)]
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct BOOTBOOT {
|
||||||
|
pub magic: [u8; 4usize],
|
||||||
|
pub size: u32,
|
||||||
|
pub protocol: u8,
|
||||||
|
pub fb_type: u8,
|
||||||
|
pub numcores: u16,
|
||||||
|
pub bspid: u16,
|
||||||
|
pub timezone: i16,
|
||||||
|
pub datetime: [u8; 8usize],
|
||||||
|
pub initrd_ptr: u64,
|
||||||
|
pub initrd_size: u64,
|
||||||
|
pub fb_ptr: *mut u8,
|
||||||
|
pub fb_size: u32,
|
||||||
|
pub fb_width: u32,
|
||||||
|
pub fb_height: u32,
|
||||||
|
pub fb_scanline: u32,
|
||||||
|
pub arch: BOOTBOOT__bindgen_ty_1,
|
||||||
|
pub mmap: MMapEnt,
|
||||||
|
}
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub union BOOTBOOT__bindgen_ty_1 {
|
||||||
|
pub x86_64: BOOTBOOT__bindgen_ty_1__bindgen_ty_1,
|
||||||
|
pub aarch64: BOOTBOOT__bindgen_ty_1__bindgen_ty_2,
|
||||||
|
_bindgen_union_align: [u64; 8usize],
|
||||||
|
}
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct BOOTBOOT__bindgen_ty_1__bindgen_ty_1 {
|
||||||
|
pub acpi_ptr: u64,
|
||||||
|
pub smbi_ptr: u64,
|
||||||
|
pub efi_ptr: u64,
|
||||||
|
pub mp_ptr: u64,
|
||||||
|
pub unused0: u64,
|
||||||
|
pub unused1: u64,
|
||||||
|
pub unused2: u64,
|
||||||
|
pub unused3: u64,
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn bindgen_test_layout_BOOTBOOT__bindgen_ty_1__bindgen_ty_1() {
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::size_of::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>(),
|
||||||
|
64usize,
|
||||||
|
concat!(
|
||||||
|
"Size of: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::align_of::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>(),
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Alignment of ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>())).acpi_ptr as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(acpi_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>())).smbi_ptr as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(smbi_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>())).efi_ptr as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
16usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(efi_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>())).mp_ptr as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
24usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(mp_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>())).unused0 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
32usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(unused0)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>())).unused1 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
40usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(unused1)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>())).unused2 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
48usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(unused2)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_1>())).unused3 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
56usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(unused3)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct BOOTBOOT__bindgen_ty_1__bindgen_ty_2 {
|
||||||
|
pub acpi_ptr: u64,
|
||||||
|
pub mmio_ptr: u64,
|
||||||
|
pub efi_ptr: u64,
|
||||||
|
pub unused0: u64,
|
||||||
|
pub unused1: u64,
|
||||||
|
pub unused2: u64,
|
||||||
|
pub unused3: u64,
|
||||||
|
pub unused4: u64,
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn bindgen_test_layout_BOOTBOOT__bindgen_ty_1__bindgen_ty_2() {
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::size_of::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>(),
|
||||||
|
64usize,
|
||||||
|
concat!(
|
||||||
|
"Size of: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::align_of::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>(),
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Alignment of ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>())).acpi_ptr as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2),
|
||||||
|
"::",
|
||||||
|
stringify!(acpi_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>())).mmio_ptr as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2),
|
||||||
|
"::",
|
||||||
|
stringify!(mmio_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>())).efi_ptr as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
16usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2),
|
||||||
|
"::",
|
||||||
|
stringify!(efi_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>())).unused0 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
24usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2),
|
||||||
|
"::",
|
||||||
|
stringify!(unused0)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>())).unused1 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
32usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2),
|
||||||
|
"::",
|
||||||
|
stringify!(unused1)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>())).unused2 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
40usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2),
|
||||||
|
"::",
|
||||||
|
stringify!(unused2)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>())).unused3 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
48usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2),
|
||||||
|
"::",
|
||||||
|
stringify!(unused3)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe {
|
||||||
|
&(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1__bindgen_ty_2>())).unused4 as *const _
|
||||||
|
as usize
|
||||||
|
},
|
||||||
|
56usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1__bindgen_ty_2),
|
||||||
|
"::",
|
||||||
|
stringify!(unused4)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn bindgen_test_layout_BOOTBOOT__bindgen_ty_1() {
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::size_of::<BOOTBOOT__bindgen_ty_1>(),
|
||||||
|
64usize,
|
||||||
|
concat!("Size of: ", stringify!(BOOTBOOT__bindgen_ty_1))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::align_of::<BOOTBOOT__bindgen_ty_1>(),
|
||||||
|
8usize,
|
||||||
|
concat!("Alignment of ", stringify!(BOOTBOOT__bindgen_ty_1))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1>())).x86_64 as *const _ as usize },
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(x86_64)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT__bindgen_ty_1>())).aarch64 as *const _ as usize },
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT__bindgen_ty_1),
|
||||||
|
"::",
|
||||||
|
stringify!(aarch64)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn bindgen_test_layout_BOOTBOOT() {
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::size_of::<BOOTBOOT>(),
|
||||||
|
144usize,
|
||||||
|
concat!("Size of: ", stringify!(BOOTBOOT))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::align_of::<BOOTBOOT>(),
|
||||||
|
1usize,
|
||||||
|
concat!("Alignment of ", stringify!(BOOTBOOT))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).magic as *const _ as usize },
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(magic)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).size as *const _ as usize },
|
||||||
|
4usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(size)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).protocol as *const _ as usize },
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(protocol)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).fb_type as *const _ as usize },
|
||||||
|
9usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(fb_type)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).numcores as *const _ as usize },
|
||||||
|
10usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(numcores)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).bspid as *const _ as usize },
|
||||||
|
12usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(bspid)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).timezone as *const _ as usize },
|
||||||
|
14usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(timezone)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).datetime as *const _ as usize },
|
||||||
|
16usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(datetime)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).initrd_ptr as *const _ as usize },
|
||||||
|
24usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(initrd_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).initrd_size as *const _ as usize },
|
||||||
|
32usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(initrd_size)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).fb_ptr as *const _ as usize },
|
||||||
|
40usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(fb_ptr)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).fb_size as *const _ as usize },
|
||||||
|
48usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(fb_size)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).fb_width as *const _ as usize },
|
||||||
|
52usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(fb_width)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).fb_height as *const _ as usize },
|
||||||
|
56usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(fb_height)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).fb_scanline as *const _ as usize },
|
||||||
|
60usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(fb_scanline)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).arch as *const _ as usize },
|
||||||
|
64usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(arch)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<BOOTBOOT>())).mmap as *const _ as usize },
|
||||||
|
128usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(BOOTBOOT),
|
||||||
|
"::",
|
||||||
|
stringify!(mmap)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub static mut bootboot: BOOTBOOT;
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub static mut environment: *mut custom_ctypes::c_uchar;
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub static mut fb: u8;
|
||||||
|
}
|
||||||
|
#[doc = " Display text on screen *"]
|
||||||
|
#[repr(C, packed)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct psf2_t {
|
||||||
|
pub magic: u32,
|
||||||
|
pub version: u32,
|
||||||
|
pub headersize: u32,
|
||||||
|
pub flags: u32,
|
||||||
|
pub numglyph: u32,
|
||||||
|
pub bytesperglyph: u32,
|
||||||
|
pub height: u32,
|
||||||
|
pub width: u32,
|
||||||
|
pub glyphs: u8,
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn bindgen_test_layout_psf2_t() {
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::size_of::<psf2_t>(),
|
||||||
|
33usize,
|
||||||
|
concat!("Size of: ", stringify!(psf2_t))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
::core::mem::align_of::<psf2_t>(),
|
||||||
|
1usize,
|
||||||
|
concat!("Alignment of ", stringify!(psf2_t))
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).magic as *const _ as usize },
|
||||||
|
0usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(magic)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).version as *const _ as usize },
|
||||||
|
4usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(version)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).headersize as *const _ as usize },
|
||||||
|
8usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(headersize)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).flags as *const _ as usize },
|
||||||
|
12usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(flags)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).numglyph as *const _ as usize },
|
||||||
|
16usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(numglyph)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).bytesperglyph as *const _ as usize },
|
||||||
|
20usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(bytesperglyph)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).height as *const _ as usize },
|
||||||
|
24usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(height)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).width as *const _ as usize },
|
||||||
|
28usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(width)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { &(*(::core::ptr::null::<psf2_t>())).glyphs as *const _ as usize },
|
||||||
|
32usize,
|
||||||
|
concat!(
|
||||||
|
"Offset of field: ",
|
||||||
|
stringify!(psf2_t),
|
||||||
|
"::",
|
||||||
|
stringify!(glyphs)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
pub static mut _binary_font_psf_start: custom_ctypes::c_uchar;
|
||||||
|
}
|
||||||
|
pub mod custom_ctypes { pub type c_int = i64; pub type c_uchar = u64; }
|
115
mykernel-rust/src/main.rs
Normal file
115
mykernel-rust/src/main.rs
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
#[cfg(not(test))]
|
||||||
|
use core::panic::PanicInfo;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[allow(non_snake_case)]
|
||||||
|
#[allow(non_camel_case_types)]
|
||||||
|
mod bootboot;
|
||||||
|
|
||||||
|
// Required for -Z build-std flag.
|
||||||
|
extern crate rlibc;
|
||||||
|
|
||||||
|
/// Entry point for the Operating System.
|
||||||
|
#[no_mangle] // don't mangle the name of this function
|
||||||
|
fn _start() -> ! {
|
||||||
|
// int x, y, s=bootboot.fb_scanline, w=bootboot.fb_width, h=bootboot.fb_height;
|
||||||
|
// for(y=0;y<h;y++) { *((uint32_t*)(&fb + s*y + (w*2)))=0x00FFFFFF; }
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
let fb = &bootboot::fb as *const u8 as u64;
|
||||||
|
|
||||||
|
// Cross hair
|
||||||
|
for y in 0..bootboot::bootboot.fb_height {
|
||||||
|
let addr = fb
|
||||||
|
+ bootboot::bootboot.fb_scanline as u64 * y as u64
|
||||||
|
+ bootboot::bootboot.fb_width as u64 * 2;
|
||||||
|
*(addr as *mut u64) = 0x00FFFFFF;
|
||||||
|
}
|
||||||
|
for x in 0..bootboot::bootboot.fb_width {
|
||||||
|
let addr = fb
|
||||||
|
+ bootboot::bootboot.fb_scanline as u64 * (bootboot::bootboot.fb_height / 2) as u64 + (x * 4) as u64;
|
||||||
|
*(addr as *mut u64) = 0x00FFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RGB boxes in order
|
||||||
|
for y in 0..20 {
|
||||||
|
for x in 0..20 {
|
||||||
|
let addr = fb
|
||||||
|
+ bootboot::bootboot.fb_scanline as u64 * (y + 20) as u64
|
||||||
|
+ (x + 20) * 4;
|
||||||
|
*(addr as *mut u64) = 0x00FF0000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for y in 0..20 {
|
||||||
|
for x in 0..20 {
|
||||||
|
let addr = fb
|
||||||
|
+ bootboot::bootboot.fb_scanline as u64 * (y + 20) as u64
|
||||||
|
+ (x + 50) * 4;
|
||||||
|
*(addr as *mut u64) = 0x0000FF00;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for y in 0..20 {
|
||||||
|
for x in 0..20 {
|
||||||
|
let addr = fb
|
||||||
|
+ bootboot::bootboot.fb_scanline as u64 * (y + 20) as u64
|
||||||
|
+ (x + 80) * 4;
|
||||||
|
*(addr as *mut u64) = 0x000000FF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
puts("Hello from a simple BOOTBOOT kernel");
|
||||||
|
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This function is called on panic.
|
||||||
|
#[cfg(not(test))]
|
||||||
|
#[panic_handler]
|
||||||
|
fn panic(_info: &PanicInfo) -> ! {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn puts(string: &'static str) {
|
||||||
|
use bootboot::*;
|
||||||
|
unsafe {
|
||||||
|
let font: *mut bootboot::psf2_t = &_binary_font_psf_start as *const u64 as *mut psf2_t;
|
||||||
|
let (mut kx, mut line, mut mask, mut offs): (u32, u64, u64, u32);
|
||||||
|
kx = 0;
|
||||||
|
let bpl = ((*font).width + 7) / 8;
|
||||||
|
|
||||||
|
for s in string.bytes() {
|
||||||
|
let glyph_a: *mut u8 = (font as u64 + (*font).headersize as u64) as *mut u8;
|
||||||
|
let mut glyph: *mut u8 = glyph_a.offset(
|
||||||
|
(if s > 0 && (s as u32) < (*font).numglyph {
|
||||||
|
s as u32
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
} * ((*font).bytesperglyph)) as isize,
|
||||||
|
);
|
||||||
|
offs = kx * ((*font).width + 1) * 4;
|
||||||
|
for _y in 0..(*font).height {
|
||||||
|
line = offs as u64;
|
||||||
|
mask = 1 << ((*font).width - 1);
|
||||||
|
for _x in 0..(*font).width {
|
||||||
|
let target_location = (&bootboot::fb as *const u8 as u64 + line) as *mut u32;
|
||||||
|
let mut target_value: u32 = 0;
|
||||||
|
if (*glyph as u64) & (mask) > 0 {
|
||||||
|
target_value = 0xFFFFFF;
|
||||||
|
}
|
||||||
|
*target_location = target_value;
|
||||||
|
mask >>= 1;
|
||||||
|
line += 4;
|
||||||
|
}
|
||||||
|
let target_location = (&bootboot::fb as *const u8 as u64 + line) as *mut u32;
|
||||||
|
*target_location = 0;
|
||||||
|
glyph = glyph.offset(bpl as isize);
|
||||||
|
offs += bootboot.fb_scanline;
|
||||||
|
}
|
||||||
|
kx += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
28
mykernel-rust/triplets/mykernel-x86.json
Normal file
28
mykernel-rust/triplets/mykernel-x86.json
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
{
|
||||||
|
"llvm-target": "x86_64-unknown-none",
|
||||||
|
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"target-endian": "little",
|
||||||
|
"target-pointer-width": "64",
|
||||||
|
"target-c-int-width": "32",
|
||||||
|
"os": "none",
|
||||||
|
"executables": true,
|
||||||
|
"linker-flavor": "ld.lld",
|
||||||
|
"linker": "rust-lld",
|
||||||
|
"panic-strategy": "abort",
|
||||||
|
"disable-redzone": true,
|
||||||
|
"features": "-mmx,-sse,+soft-float",
|
||||||
|
"dynamic-linking": false,
|
||||||
|
"relocation-model": "pic",
|
||||||
|
"code-model": "kernel",
|
||||||
|
"eliminate-frame-pointer": false,
|
||||||
|
"exe-suffix": "",
|
||||||
|
"has-rpath": false,
|
||||||
|
"no-compiler-rt": true,
|
||||||
|
"no-default-libraries": true,
|
||||||
|
"position-independent-executables": false,
|
||||||
|
"has-elf-tls": true,
|
||||||
|
"pre-link-args": {
|
||||||
|
"ld.lld": ["--script=./triplets/mykernel.ld", "./font.o"]
|
||||||
|
}
|
||||||
|
}
|
41
mykernel-rust/triplets/mykernel.ld
Normal file
41
mykernel-rust/triplets/mykernel.ld
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
KERNEL_OFFSET = 0xfffffffff8000000;
|
||||||
|
|
||||||
|
PHDRS
|
||||||
|
{
|
||||||
|
boot PT_LOAD FILEHDR PHDRS; /* one single loadable segment */
|
||||||
|
}
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
. = KERNEL_OFFSET;
|
||||||
|
mmio = .; . += 0x4000000;
|
||||||
|
fb = .; . += 0x3E00000;
|
||||||
|
bootboot = .; . += 4096;
|
||||||
|
environment = .; . += 4096;
|
||||||
|
|
||||||
|
.text . + SIZEOF_HEADERS : AT(ADDR(.text) - KERNEL_OFFSET + SIZEOF_HEADERS) {
|
||||||
|
__text_start = .;
|
||||||
|
KEEP(*(.text.boot)) *(.text .text.* .gnu.linkonce.t*) /* code */
|
||||||
|
. = ALIGN(4096);
|
||||||
|
__text_end = .;
|
||||||
|
} :boot
|
||||||
|
|
||||||
|
.rodata : AT(ADDR(.rodata) - KERNEL_OFFSET) {
|
||||||
|
__rodata_start = .;
|
||||||
|
*(.rodata*)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
__rodata_end = .;
|
||||||
|
} :boot
|
||||||
|
|
||||||
|
.data : AT(ADDR(.data) - KERNEL_OFFSET) {
|
||||||
|
__data_start = .;
|
||||||
|
*(.data*)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
__data_end = .;
|
||||||
|
__bss_start = .;
|
||||||
|
*(.bss*)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
__bss_end = .;
|
||||||
|
} :boot
|
||||||
|
|
||||||
|
/DISCARD/ : { *(.eh_frame) *(.comment) }
|
||||||
|
}
|
Loading…
Reference in a new issue