Compare commits

...

4 Commits

Author SHA1 Message Date
hheik 24df740c4d Merge branch 'feat/start' into riscv 2024-05-07 12:07:19 +03:00
hheik 9374b8a3bf Merge branch 'feat/main' into feat/start 2024-05-07 12:06:42 +03:00
hheik 623c44fcb3 Fixed spinlock halting caused by data misalignment 2024-05-06 02:25:45 +03:00
hheik 7797ae7810 Replaced main.c 2024-05-03 13:22:00 +03:00
9 changed files with 86 additions and 62 deletions

View File

@ -8,7 +8,6 @@ OBJS = \
$K/kalloc.o \
$K/spinlock.o \
$K/string.o \
$K/main.o \
$K/vm.o \
$K/proc.o \
$K/swtch.o \

View File

@ -1,43 +0,0 @@
#include "types.h"
#include "param.h"
#include "memlayout.h"
#include "riscv.h"
#include "defs.h"
volatile static int started = 0;
// start() jumps here in supervisor mode on all CPUs.
void main() {
if (cpuid() == 0) {
consoleinit();
printfinit();
printf("\n");
printf("xv6 kernel is booting\n");
printf("\n");
kinit(); // physical page allocator
kvminit(); // create kernel page table
kvminithart(); // turn on paging
procinit(); // process table
trapinit(); // trap vectors
trapinithart(); // install kernel trap vector
plicinit(); // set up interrupt controller
plicinithart(); // ask PLIC for device interrupts
binit(); // buffer cache
iinit(); // inode table
fileinit(); // file table
virtio_disk_init(); // emulated hard disk
userinit(); // first user process
__sync_synchronize();
started = 1;
} else {
while (started == 0)
;
__sync_synchronize();
printf("hart %d starting\n", cpuid());
kvminithart(); // turn on paging
trapinithart(); // install kernel trap vector
plicinithart(); // ask PLIC for device interrupts
}
scheduler();
}

View File

@ -8,12 +8,6 @@
#include "proc.h"
#include "defs.h"
void initlock(struct spinlock *lk, char *name) {
lk->name = name;
lk->locked = 0;
lk->cpu = 0;
}
// Acquire the lock.
// Loops (spins) until the lock is acquired.
void acquire(struct spinlock *lk) {

58
theseus/src/kmain.rs Normal file
View File

@ -0,0 +1,58 @@
use crate::riscv;
extern "C" {
fn cpuid() -> u64;
fn consoleinit();
fn printfinit();
// fn printf();
fn kinit();
fn kvminit();
fn kvminithart();
fn procinit();
fn trapinit();
fn trapinithart();
fn plicinit();
fn plicinithart();
fn binit();
fn iinit();
fn fileinit();
fn virtio_disk_init();
fn userinit();
fn scheduler();
}
pub static mut started: bool = false;
pub unsafe fn kmain() {
if cpuid() == 0 {
consoleinit();
printfinit();
// printf("\n");
// printf("xv6 kernel is booting\n");
// printf("\n");
kinit(); // physical page allocator
kvminit(); // create kernel page table
kvminithart(); // turn on paging
procinit(); // process table
trapinit(); // trap vectors
trapinithart(); // install kernel trap vector
plicinit(); // set up interrupt controller
plicinithart(); // ask PLIC for device interrupts
binit(); // buffer cache
iinit(); // inode table
fileinit(); // file table
virtio_disk_init(); // emulated hard disk
userinit(); // first user process
riscv::barrier();
started = true;
} else {
while !started {}
riscv::barrier();
// printf("hart %d starting\n", cpuid());
kvminithart(); // turn on paging
trapinithart(); // install kernel trap vector
plicinithart(); // ask PLIC for device interrupts
}
scheduler();
}

View File

@ -1,6 +1,7 @@
#![no_std]
#![crate_type = "staticlib"]
pub mod kmain;
pub mod memlayout;
pub mod param;
pub mod riscv;

View File

@ -327,3 +327,9 @@ pub fn PX(level: u64, va: u64) -> u64 {
// Sv39, to avoid having to sign-extend virtual addresses
// that have the high bit set.
pub const MAXVA: u64 = 1 << (9 + 9 + 9 + 12 - 1);
/// Hardware memory barrier
#[inline]
pub unsafe fn barrier() {
asm!("fence")
}

View File

@ -1,9 +1,18 @@
use core::ptr::null_mut;
// Mutual exclusion lock.
#[repr(C)]
pub struct SpinLock {
// Is the lock held?
pub locked: u32, // C boolean
// For debugging:
pub name: Option<*mut ()>, // Name of lock.
pub cpu: Option<*mut ()>, // The cpu holding the lock.
pub name: *const u8, // Name of lock.
pub cpu: *mut (), // The cpu holding the lock.
}
#[no_mangle]
pub unsafe extern "C" fn initlock(lock: *mut SpinLock, name: *const u8) {
(*lock).name = name;
(*lock).locked = 0;
(*lock).cpu = null_mut();
}

View File

@ -1,6 +1,7 @@
use core::arch::asm;
use core::usize;
use crate::kmain::kmain;
use crate::memlayout::{CLINT_MTIME, CLINT_MTIMECMP};
use crate::param::NCPU;
use crate::riscv as rv;
@ -8,9 +9,6 @@ use crate::riscv as rv;
extern "C" {
// assembly code in kernelvec.S for machine-mode timer interrupt.
fn timervec();
// main.c
fn main();
}
#[repr(align(16))]
@ -34,7 +32,7 @@ pub unsafe extern "C" fn start() {
// set M Exception Program Counter to main, for mret.
// requires gcc -mcmodel=medany
rv::w_mepc(main as *const () as u64);
rv::w_mepc(kmain as *const () as u64);
// disable paging for now.
rv::w_satp(0);

View File

@ -1,11 +1,13 @@
use crate::{memlayout::UART0, spinlock::SpinLock};
use core::ptr::addr_of_mut;
use crate::{
memlayout::UART0,
spinlock::{initlock, SpinLock},
};
use core::ptr::{addr_of_mut, null, null_mut};
extern "C" {
// spinlock.c
fn push_off();
fn pop_off();
fn initlock(spinlock: *mut SpinLock, name: *const u8);
fn acquire(spinlock: *mut SpinLock);
fn release(spinlock: *mut SpinLock);
@ -60,12 +62,12 @@ pub fn WriteReg(reg: u8, v: u8) {
// the transmit output buffer.
static mut uart_tx_lock: crate::spinlock::SpinLock = crate::spinlock::SpinLock {
locked: 0,
cpu: None,
name: None,
cpu: null_mut(),
name: null(),
};
// NOTE: string 'uart\0' for c-implmentation of spinlock. Stupid but works.
static UART_LOCK_NAME: [u8; 5] = [117, 97, 114, 116, 0];
static UART_LOCK_NAME: [u8; 5] = [0x75, 0x61, 0x72, 0x74, 0];
const UART_TX_BUF_SIZE: usize = 32;
static mut uart_tx_buf: [u8; UART_TX_BUF_SIZE] = [0; UART_TX_BUF_SIZE];