Skip to content

Commit 78403a2

Browse files
author
Filip Chovanec
committed
Add smelt and fix kernel building in new cargo versions
1 parent 02445a7 commit 78403a2

File tree

10 files changed

+83
-56
lines changed

10 files changed

+83
-56
lines changed

.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,6 @@
55
path = limine
66
url = https://github.com/limine-bootloader/limine
77

8+
[submodule "smelt3"]
9+
path = smelt3
10+
url = ssh://git@github.com/GandelXIV/smelt3

.smelt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
kentry c89a148be40e6752261e3038609a4b68de22fa3bfdaf32f884edffb8480b9bbe+fa5487b09bb3d0b1de6e96c6b636c9622c9ade4a230443da5d2690c1f455e256+f5e6892821ebd0bd7ea85e085a6ba6c185bfb243d1d0fd6b95be4735f5aad562+edaa04d924ab2792662a0ec4b7cd57caa3c06481aa5ab67caecdbbf89f5f24f8+1cb059cb8bc89c622b8fca6dafd2461701e08559078a0e9e0d68d652c1ca7e59+
2+
x86_kentry c89a148be40e6752261e3038609a4b68de22fa3bfdaf32f884edffb8480b9bbe+3f0d56f12c8bbf8ba5a23519f38d2e717573e3e79950d11ba261ebaa586055fc+f5e6892821ebd0bd7ea85e085a6ba6c185bfb243d1d0fd6b95be4735f5aad562+edaa04d924ab2792662a0ec4b7cd57caa3c06481aa5ab67caecdbbf89f5f24f8+1cb059cb8bc89c622b8fca6dafd2461701e08559078a0e9e0d68d652c1ca7e59+
3+
x86_kernel_object 647405a3c326bbe16486c24bb77cba69cec657289f54ce1b0994c84c897778bb+3f0d56f12c8bbf8ba5a23519f38d2e717573e3e79950d11ba261ebaa586055fc+4233ed57f76c339796239655aba6d3f95b67c577100f4eb3740d54d5ce0b963a+729cf176b0393dcdf2e6be55fb25711deacca904633eccbec02e8151defd542d+156a35efe01d536744ff02e4126db5759091dbb63567e8ab626ab4d6111f2381+51207ae5571bdb9ef22c501c175103b63721ffbe157210411469abb4785de97d+526f15e81d861b44c370771c3db89a8c81bdf89935b774a43a87752c8d4fd753+fc0275dda4a8cfc561bc7e7444cc60686dee06c38a193c1d771f37365fd0e994+ca27b5c631ab4ffbb61c02ba4c4c0976ff47529aaf8a475b2e06eaefcaa50e1b+1f32083bce6dd70aca9cb487d2c148eb41845dd93252da15b5c7881b8db6cf04+459ce056e584606f00868728460464c3ffbd497dc9bcda21de0e4058497e6d0f+3c4352baa34cebbe478d90b61b714946f1ce3a02742f2fbc46b6251932aa59f1+89909a0e4c358c0112d539a38876d0819cb33111284ab30526927c04cd4d4b50+abdf0b554b5f3dd38df3452310f9f611ac06ea1f3103aa2046863b1b5d6c12ae+bee9392606a786b5be4504604d48d6a766f05a7a945011922073935fa253afa9+bd376fda27719bcc6a164b498ccf0791a0a8a15940cd1337a73b57cd1dd6478d+41428d2fba0bcdc697e3d594eaa80dc3b2a643f55f029d33d57ab5a37193aca7+8ba8b7292d2b5f58e6f77d49b2c4bbb52433b5ac8eb7145c566ab292c7b93a5b+

kernel/Cargo.lock

+15-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

kernel/Cargo.toml

+3-4
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ path = "src/main.rs"
1818

1919
[target.'cfg(target_arch = "x86_64")'.dependencies]
2020
x86 = "0.50.0"
21-
x86_64 = "0.14.10"
21+
x86_64 = "0.15.2"
2222

2323
[dependencies]
2424
rlibc = "1.0.0"
2525
rlibcex = "0.1"
2626
tinybmp = "0.3.3"
2727
volatile = "0.4.5"
28-
spin = "0.9.3"
29-
lazy_static = { version = "1.4.0", features = ["spin_no_std"] }
28+
spin = "0.9.8"
29+
lazy_static = { version = "1.4.0", features = ["spin_no_std"] }
3030
arrayvec = { version = "0.7.2", default-features = false }
3131
tinyvec = "1.6.0"
3232

@@ -35,4 +35,3 @@ const-bitfield = "0.2.2"
3535
# None of the limine libs below work
3636
#limine = "0.1.8"
3737
#limine-protocol = "0.4.0"
38-

kernel/src/arch/amd64/gdt.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@ impl SegmentDescriptor {
8989

9090
// addr: u20
9191
const fn set_whole_limit(&mut self, addr: u32) {
92-
self.set_limit0(bin_extract(addr, 15, 0) as u16);
93-
self.set_limit1(bin_extract(addr, 19, 16) as u8);
92+
self.set_limit0(bin_extract(addr as u64, 15, 0) as u16);
93+
self.set_limit1(bin_extract(addr as u64, 19, 16) as u8);
9494
}
9595

9696
const fn set_whole_base(&mut self, addr: u32) {
97-
self.set_base0(bin_extract(addr, 15, 0) as u16);
98-
self.set_base1(bin_extract(addr, 23, 16) as u8);
99-
self.set_base2(bin_extract(addr, 31, 24) as u8);
97+
self.set_base0(bin_extract(addr as u64, 15, 0) as u16);
98+
self.set_base1(bin_extract(addr as u64, 23, 16) as u8);
99+
self.set_base2(bin_extract(addr as u64, 31, 24) as u8);
100100
}
101101

102102
// base constructor for kernel descriptors

kernel/src/main.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#![crate_type = "staticlib"]
1212
#![feature(layout_for_ptr)]
1313
// required by tools.rs
14-
#![feature(const_convert)]
1514
#![feature(const_trait_impl)]
1615
#![feature(const_mut_refs)]
1716
// required by panic handler
@@ -40,16 +39,12 @@ fn kpanic(info: &core::panic::PanicInfo<'_>) -> ! {
4039
None => log!("Payload: unknown\n"),
4140
}
4241
// message
43-
match info.message() {
44-
Some(msg) => log!("Message: {:?}\n", msg),
45-
None => log!("Message: unknown\n"),
46-
}
42+
log!("{:?}", info.message());
4743
// location
4844
match info.location() {
4945
Some(loc) => log!("Location: {}\n", loc),
5046
None => log!("Location: unknown"),
5147
}
52-
5348
loop {}
5449
}
5550

kernel/src/tools.rs

+7-19
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ macro_rules! bitfield {
7171
// bitrange, only setter
7272
($name:ident, $typ:ty, $h:literal, $l:literal) => {
7373
const fn $name(&mut self, payload: $typ) {
74-
*self = Self(bin_insert(self.0, payload, $h, $l));
74+
*self = Self(bin_insert(self.0, payload as u64, $h, $l));
7575
}
7676
};
7777

@@ -89,7 +89,7 @@ macro_rules! bitfield {
8989
// single-bit, only setter
9090
($name:ident, $typ:ty, $b:literal) => {
9191
const fn $name(&mut self, payload: $typ) {
92-
*self = Self(bin_insert(self.0, payload, $b, $b));
92+
*self = Self(bin_insert(self.0, payload as u64, $b, $b));
9393
}
9494
};
9595

@@ -112,14 +112,11 @@ macro_rules! bitfield {
112112
/// assert_eq!(bin_extract(0b11110011, 4, 1), 0b1001)
113113
/// ```
114114
115-
pub const fn bin_extract<T: Into<u64>>(target: T, higher: usize, lower: usize) -> u64
116-
where
117-
u64: ~const From<T>,
118-
{
115+
pub const fn bin_extract(target: u64, higher: usize, lower: usize) -> u64 {
119116
// (x >> lower) -> cuts out the stuff we dont care about to the right
120117
// ( (1 << (higher + 1 - lower)) - 1) -> creates a binary number full of ones with length (higher+1-lower), that then get used as a mask
121118
// for bitwise and ('&') to remove all the stuff we dont care about to the left
122-
(target.into() >> lower) & ((1 << (higher + 1 - lower)) - 1)
119+
(target >> lower) & ((1 << (higher + 1 - lower)) - 1)
123120
}
124121

125122
/// inserts a binary sequence into another one
@@ -129,18 +126,9 @@ where
129126
/// assert_eq!(bin_insert(0b0000000000000000, 0b00001111, 6, 3), 0b0000000000111100)
130127
/// assert_eq!(bin_insert(0b1110001010001100, 0b101, 16, 14), 0b1010001010001100)
131128
/// ```
132-
pub const fn bin_insert<T: Into<u64>, U: Into<u64>>(
133-
target: T,
134-
payload: U,
135-
higher: usize,
136-
lower: usize,
137-
) -> u64
138-
where
139-
u64: ~const From<U>,
140-
u64: ~const From<T>,
141-
{
129+
pub const fn bin_insert(target: u64, payload: u64, higher: usize, lower: usize) -> u64 {
142130
// this mask enables all bits that have to be with a BitOr
143-
let enable = (payload.into() << lower) as u64;
131+
let enable = (payload << lower) as u64;
144132
// this mask disables all bits that must not be with a BitAnd
145133
// same as the enable mask, but full of ones on the left & the right to preserve the rest of
146134
// the data, except for our payload that can have some zeroes for disabling
@@ -152,5 +140,5 @@ where
152140
u64::MAX << higher + 1
153141
});
154142
// apply the masks
155-
((target.into() | enable) & disable).into()
143+
(target | enable) & disable
156144
}

kernel/triple/x86_64.json

+13-13
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
{
2-
"llvm-target": "x86_64-unknown-none",
3-
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
4-
"arch": "x86_64",
5-
"target-endian": "little",
6-
"target-pointer-width": "64",
7-
"target-c-int-width": "32",
8-
"os": "none",
9-
"executables": true,
10-
"linker-flavor": "ld.lld",
11-
"linker": "rust-lld",
12-
"panic-strategy": "abort",
13-
"disable-redzone": true,
14-
"features": "-mmx,-sse,+soft-float"
2+
"llvm-target": "x86_64-unknown-none",
3+
"data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128",
4+
"arch": "x86_64",
5+
"target-endian": "little",
6+
"target-pointer-width": "64",
7+
"target-c-int-width": "32",
8+
"os": "none",
9+
"executables": true,
10+
"linker-flavor": "ld.lld",
11+
"linker": "rust-lld",
12+
"panic-strategy": "abort",
13+
"disable-redzone": true,
14+
"features": "-mmx,-sse,+soft-float"
1515
}

smelt3

Submodule smelt3 added at 8d6b517

smeltfile.py

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/python3
2+
import sys
3+
sys.path.insert(1, 'smelt3/')
4+
import smelt3
5+
from smelt3 import task, use, File, file_tree, shell, create_setting, sett
6+
7+
create_setting("KERNEL_BUILD_RELEASE", False)
8+
9+
@task("kentry")
10+
def x86_kentry():
11+
out = "build/kentry.x86_64.o"
12+
use(file_tree("kernel/kentry/x86_64/"))
13+
14+
shell("mkdir -p build/")
15+
shell(f"nasm -f elf64 kernel/kentry/x86_64/kentry.asm -o {out}")
16+
return File(out)
17+
18+
@task("kernel_object")
19+
def x86_kernel_object():
20+
use(File("kernel/Cargo.lock"))
21+
use(File("kernel/Cargo.toml"))
22+
use(File("kernel/link/x86_64.ld"))
23+
use(File("kernel/.cargo/config.toml"))
24+
use(File("kernel/triple/x86_64.json"))
25+
use(file_tree("kernel/src/"))
26+
KERNEL_BUILD_RELEASE = sett("KERNEL_BUILD_RELEASE")
27+
28+
shell(f"cd kernel/ && cargo build --target triple/x86_64.json --lib {"--release" if KERNEL_BUILD_RELEASE else ""}")
29+
30+
return File(f"kernel/target/{"release" if KERNEL_BUILD_RELEASE else "debug"}/release/libkernel.a")
31+
32+
smelt3.cli()

0 commit comments

Comments
 (0)