Fix thread locals

This commit is contained in:
Jeremy Soller 2016-08-20 08:39:03 -06:00
parent 8ddd0ad3f0
commit 7a59e08e70
5 changed files with 6 additions and 35 deletions

View file

@ -150,6 +150,3 @@ pub mod serial;
/// Initialization and start function /// Initialization and start function
pub mod start; pub mod start;
/// Thread control block
pub mod tcb;

View file

@ -5,7 +5,6 @@ use core::ops::{Deref, DerefMut};
use x86::tlb; use x86::tlb;
use memory::{allocate_frame, Frame}; use memory::{allocate_frame, Frame};
use tcb::ThreadControlBlock;
use self::entry::{EntryFlags, PRESENT, WRITABLE, NO_EXECUTE}; use self::entry::{EntryFlags, PRESENT, WRITABLE, NO_EXECUTE};
use self::mapper::Mapper; use self::mapper::Mapper;
@ -45,8 +44,6 @@ pub unsafe fn init(stack_start: usize, stack_end: usize) -> ActivePageTable {
static mut __tbss_start: u8; static mut __tbss_start: u8;
/// The ending byte of the thread BSS segment /// The ending byte of the thread BSS segment
static mut __tbss_end: u8; static mut __tbss_end: u8;
/// The start of the thread control block
static mut __tcb: ThreadControlBlock;
/// The starting byte of the _.bss_ (uninitialized data) segment. /// The starting byte of the _.bss_ (uninitialized data) segment.
static mut __bss_start: u8; static mut __bss_start: u8;
/// The ending byte of the _.bss_ (uninitialized data) segment. /// The ending byte of the _.bss_ (uninitialized data) segment.
@ -136,18 +133,9 @@ pub unsafe fn init(stack_start: usize, stack_end: usize) -> ActivePageTable {
tlb::flush_all(); tlb::flush_all();
::externs::memset(page.start_address().get() as *mut u8, 0, 4096); ::externs::memset(page.start_address().get() as *mut u8, 0, 4096);
} }
}
}
// Map and set TCB *(end as *mut usize).offset(-1) = end;
{ }
let start = & __tcb as *const _ as usize;
println!("TCB: {:X}", start);
let page = Page::containing_address(VirtualAddress::new(start));
active_table.map(page, PRESENT | NO_EXECUTE | WRITABLE);
tlb::flush_all();
::externs::memset(page.start_address().get() as *mut u8, 0, 4096);
__tcb.offset = start;
} }
active_table active_table

View file

@ -12,7 +12,6 @@ use gdt;
use idt; use idt;
use memory::{self, Frame}; use memory::{self, Frame};
use paging::{self, entry, Page, PhysicalAddress, VirtualAddress}; use paging::{self, entry, Page, PhysicalAddress, VirtualAddress};
use tcb::ThreadControlBlock;
/// Test of zero values in BSS. /// Test of zero values in BSS.
static BSS_TEST_ZERO: usize = 0; static BSS_TEST_ZERO: usize = 0;
@ -45,8 +44,8 @@ pub unsafe extern fn kstart() -> ! {
static mut __bss_start: u8; static mut __bss_start: u8;
/// The ending byte of the _.bss_ (uninitialized data) segment. /// The ending byte of the _.bss_ (uninitialized data) segment.
static mut __bss_end: u8; static mut __bss_end: u8;
/// The thread descriptor. /// The end of the tbss.
static mut __tcb: ThreadControlBlock; static mut __tbss_end: u8;
/// The end of the kernel /// The end of the kernel
static mut __end: u8; static mut __end: u8;
} }
@ -76,7 +75,7 @@ pub unsafe extern fn kstart() -> ! {
let mut active_table = paging::init(stack_start, stack_end); let mut active_table = paging::init(stack_start, stack_end);
// Set up GDT // Set up GDT
gdt::init(__tcb.offset); gdt::init((&__tbss_end as *const u8 as *const usize).offset(-1) as usize);
// Set up IDT // Set up IDT
idt::init(); idt::init();

View file

@ -1,5 +0,0 @@
/// Thread control block
#[repr(C)]
pub struct ThreadControlBlock {
pub offset: usize
}

View file

@ -35,19 +35,11 @@ SECTIONS {
*(.tdata*) *(.tdata*)
. = ALIGN(4096); . = ALIGN(4096);
__tdata_end = .; __tdata_end = .;
}
.tbss : AT(ADDR(.tbss) - KERNEL_OFFSET) {
__tbss_start = .; __tbss_start = .;
*(.tbss*) *(.tbss*)
. = ALIGN(4096);
__tbss_end = .;
}
.tcb : AT(ADDR(.tcb) - KERNEL_OFFSET) {
__tcb = .;
. += 8; . += 8;
. = ALIGN(4096); . = ALIGN(4096);
__tbss_end = .;
} }
.bss : AT(ADDR(.bss) - KERNEL_OFFSET) { .bss : AT(ADDR(.bss) - KERNEL_OFFSET) {