Skip to content

Commit 537fc71

Browse files
ethindpphil-opp
authored andcommitted
SSE and AVX support (#77)
* The bootloader now implements SSE and AVX support and enables AVX if found. * Rewrote SSE code in rust using inline ASM and made SSE and AVX features. * Deleted SSE assembly and formatted code. * Aded a use statement to fix a compile error. * Removed AVX support. * Tested SSE support and formatted code. * Formatted code and ensured that the bootloader *actually* built. * Got SSE t ofinally work (haven't committed in a while because of lack of time) * Aded bit_field dependency. Formatted code. * Moved SSE into its own module. Made deps for SSE entirely optional. Removed botloader dep from test kernel. * Added function call to enable SSE if SSE feature is enabled
1 parent c6f5783 commit 537fc71

File tree

8 files changed

+50
-2
lines changed

8 files changed

+50
-2
lines changed

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ xmas-elf = { version = "0.6.2", optional = true }
1717
x86_64 = { version = "0.7.2", optional = true }
1818
usize_conversions = { version = "0.2.0", optional = true }
1919
fixedvec = { version = "0.2.4", optional = true }
20+
bit_field = { version = "0.10.0", optional = true }
2021

2122
[dependencies.font8x8]
2223
version = "0.2.4"
@@ -34,6 +35,7 @@ binary = ["xmas-elf", "x86_64", "usize_conversions", "fixedvec", "llvm-tools", "
3435
vga_320x200 = ["font8x8"]
3536
recursive_page_table = []
3637
map_physical_memory = []
38+
sse = ["bit_field"]
3739

3840
[profile.dev]
3941
panic = "abort"

example-kernel/Cargo.lock

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example-kernel/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub extern "C" fn _start() -> ! {
1111
// named `_start` by default
1212

1313
let vga_buffer = 0xb8000 as *mut u8;
14-
14+
1515
// print `HELLO` to the screen (see
1616
// https://os.phil-opp.com/minimal-rust-kernel/#printing-to-screen)
1717
for (i, &byte) in HELLO.iter().enumerate() {

src/main.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ mod frame_allocator;
5454
mod level4_entries;
5555
mod page_table;
5656
mod printer;
57+
#[cfg(feature = "sse")]
58+
mod sse;
5759

5860
pub struct IdentityMappedAddr(PhysAddr);
5961

@@ -142,6 +144,10 @@ fn load_elf(
142144
// Extract required information from the ELF file.
143145
let mut preallocated_space = alloc_stack!([ProgramHeader64; 32]);
144146
let mut segments = FixedVec::new(&mut preallocated_space);
147+
#[cfg(feature = "sse")]
148+
{
149+
sse::enable_sse();
150+
}
145151
let entry_point;
146152
{
147153
let kernel_start_ptr = usize_from(kernel_start.as_u64()) as *const u8;

src/sse.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/// Enables Streaming SIMD Extensions (SSE) support for loaded kernels.
2+
#[cfg(feature = "sse")]
3+
pub fn enable_sse() {
4+
use bit_field::BitField;
5+
use x86_64::registers::control::Cr0;
6+
let mut flags = Cr0::read_raw();
7+
flags.set_bit(2, false);
8+
flags.set_bit(1, true);
9+
flags.set_bit(9, true);
10+
flags.set_bit(10, true);
11+
unsafe {
12+
Cr0::write_raw(flags);
13+
}
14+
// For now, we must use inline ASM here
15+
let mut cr4: u64;
16+
unsafe {
17+
asm!("mov %cr4, $0" : "=r" (cr4));
18+
}
19+
cr4.set_bit(9, true);
20+
cr4.set_bit(10, true);
21+
unsafe {
22+
asm!("mov $0, %cr4" :: "r" (cr4) : "memory");
23+
}
24+
}

src/stage_2.s

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ enter_protected_mode_again:
9595
mov eax, cr0
9696
or al, 1 # set protected mode bit
9797
mov cr0, eax
98-
9998
push 0x8
10099
lea eax, [stage_3]
101100
push eax

test-kernel/Cargo.lock

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)