Compare commits
4 commits
eccdaeeaaa
...
9d0123f43e
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9d0123f43e | ||
![]() |
11b52f63c1 | ||
![]() |
a14ba848b3 | ||
![]() |
ada9625a1b |
20 changed files with 85 additions and 7 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "sleeplock.h"
|
||||||
|
#include "fs.h"
|
||||||
|
|
||||||
struct buf {
|
struct buf {
|
||||||
int valid; // has data been read from disk?
|
int valid; // has data been read from disk?
|
||||||
int disk; // does disk "own" buf?
|
int disk; // does disk "own" buf?
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "riscv.h"
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
struct buf;
|
struct buf;
|
||||||
struct context;
|
struct context;
|
||||||
struct file;
|
struct file;
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
// Format of an ELF executable file
|
// Format of an ELF executable file
|
||||||
|
|
||||||
#define ELF_MAGIC 0x464C457FU // "\x7FELF" in little endian
|
#define ELF_MAGIC 0x464C457FU // "\x7FELF" in little endian
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#define O_RDONLY 0x000
|
#define O_RDONLY 0x000
|
||||||
#define O_WRONLY 0x001
|
#define O_WRONLY 0x001
|
||||||
#define O_RDWR 0x002
|
#define O_RDWR 0x002
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "sleeplock.h"
|
||||||
|
#include "fs.h"
|
||||||
|
|
||||||
struct file {
|
struct file {
|
||||||
enum { FD_NONE, FD_PIPE, FD_INODE, FD_DEVICE } type;
|
enum { FD_NONE, FD_PIPE, FD_INODE, FD_DEVICE } type;
|
||||||
int ref; // reference count
|
int ref; // reference count
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
// On-disk file system format.
|
// On-disk file system format.
|
||||||
// Both the kernel and user programs use this header file.
|
// Both the kernel and user programs use this header file.
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
// Physical memory layout
|
// Physical memory layout
|
||||||
|
|
||||||
// qemu -machine virt is set up like this,
|
// qemu -machine virt is set up like this,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#define NPROC 64 // maximum number of processes
|
#define NPROC 64 // maximum number of processes
|
||||||
#define NCPU 8 // maximum number of CPUs
|
#define NCPU 8 // maximum number of CPUs
|
||||||
#define NOFILE 16 // open files per process
|
#define NOFILE 16 // open files per process
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "param.h"
|
||||||
|
#include "riscv.h"
|
||||||
|
#include "spinlock.h"
|
||||||
|
|
||||||
// Saved registers for kernel context switches.
|
// Saved registers for kernel context switches.
|
||||||
struct context {
|
struct context {
|
||||||
u64 ra;
|
u64 ra;
|
||||||
|
@ -104,4 +111,5 @@ struct proc {
|
||||||
struct file *ofile[NOFILE]; // Open files
|
struct file *ofile[NOFILE]; // Open files
|
||||||
struct inode *cwd; // Current directory
|
struct inode *cwd; // Current directory
|
||||||
char name[16]; // Process name (debugging)
|
char name[16]; // Process name (debugging)
|
||||||
|
int mask; // Process mask
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
// which hart (core) is this?
|
// which hart (core) is this?
|
||||||
static inline u64
|
static inline u64
|
||||||
r_mhartid()
|
r_mhartid()
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "spinlock.h"
|
||||||
|
|
||||||
// Long-term locks for processes
|
// Long-term locks for processes
|
||||||
struct sleeplock {
|
struct sleeplock {
|
||||||
u32 locked; // Is the lock held?
|
u32 locked; // Is the lock held?
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
// Mutual exclusion lock.
|
// Mutual exclusion lock.
|
||||||
struct spinlock {
|
struct spinlock {
|
||||||
u32 locked; // Is the lock held?
|
u32 locked; // Is the lock held?
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
#define T_DIR 1 // Directory
|
#define T_DIR 1 // Directory
|
||||||
#define T_FILE 2 // File
|
#define T_FILE 2 // File
|
||||||
#define T_DEVICE 3 // Device
|
#define T_DEVICE 3 // Device
|
||||||
|
|
|
@ -101,16 +101,17 @@ extern u64 sys_unlink(void);
|
||||||
extern u64 sys_link(void);
|
extern u64 sys_link(void);
|
||||||
extern u64 sys_mkdir(void);
|
extern u64 sys_mkdir(void);
|
||||||
extern u64 sys_close(void);
|
extern u64 sys_close(void);
|
||||||
|
extern u64 sys_trace(void);
|
||||||
|
|
||||||
// An array mapping syscall numbers from syscall.h
|
// An array mapping syscall numbers from syscall.h
|
||||||
// to the function that handles the system call.
|
// to the function that handles the system call.
|
||||||
static u64 (*syscalls[])(void) = {
|
static u64 (*syscalls[])(void) = {
|
||||||
[SYS_fork] sys_fork, [SYS_exit] sys_exit, [SYS_wait] sys_wait, [SYS_pipe] sys_pipe,
|
[SYS_fork] = sys_fork, [SYS_exit] = sys_exit, [SYS_wait] = sys_wait, [SYS_pipe] = sys_pipe,
|
||||||
[SYS_read] sys_read, [SYS_kill] sys_kill, [SYS_exec] sys_exec, [SYS_fstat] sys_fstat,
|
[SYS_read] = sys_read, [SYS_kill] = sys_kill, [SYS_exec] = sys_exec, [SYS_fstat] = sys_fstat,
|
||||||
[SYS_chdir] sys_chdir, [SYS_dup] sys_dup, [SYS_getpid] sys_getpid, [SYS_sbrk] sys_sbrk,
|
[SYS_chdir] = sys_chdir, [SYS_dup] = sys_dup, [SYS_getpid] = sys_getpid, [SYS_sbrk] = sys_sbrk,
|
||||||
[SYS_sleep] sys_sleep, [SYS_uptime] sys_uptime, [SYS_open] sys_open, [SYS_write] sys_write,
|
[SYS_sleep] = sys_sleep, [SYS_uptime] = sys_uptime, [SYS_open] = sys_open, [SYS_write] = sys_write,
|
||||||
[SYS_mknod] sys_mknod, [SYS_unlink] sys_unlink, [SYS_link] sys_link, [SYS_mkdir] sys_mkdir,
|
[SYS_mknod] = sys_mknod, [SYS_unlink] = sys_unlink, [SYS_link] = sys_link, [SYS_mkdir] = sys_mkdir,
|
||||||
[SYS_close] sys_close,
|
[SYS_close] = sys_close, [SYS_trace] = sys_trace,
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
// System call numbers
|
// System call numbers
|
||||||
#define SYS_fork 1
|
#define SYS_fork 1
|
||||||
#define SYS_exit 2
|
#define SYS_exit 2
|
||||||
|
@ -20,3 +22,4 @@
|
||||||
#define SYS_link 19
|
#define SYS_link 19
|
||||||
#define SYS_mkdir 20
|
#define SYS_mkdir 20
|
||||||
#define SYS_close 21
|
#define SYS_close 21
|
||||||
|
#define SYS_trace 22
|
||||||
|
|
|
@ -89,3 +89,10 @@ sys_uptime(void)
|
||||||
release(&tickslock);
|
release(&tickslock);
|
||||||
return xticks;
|
return xticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u64
|
||||||
|
sys_trace(void)
|
||||||
|
{
|
||||||
|
/* TODO: Implement sys_trace */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
typedef unsigned char u8;
|
typedef unsigned char u8;
|
||||||
typedef unsigned short u16;
|
typedef unsigned short u16;
|
||||||
typedef unsigned int u32;
|
typedef unsigned int u32;
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
//
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
// virtio device definitions.
|
// virtio device definitions.
|
||||||
// for both the mmio interface, and virtio descriptors.
|
// for both the mmio interface, and virtio descriptors.
|
||||||
// only tested with qemu.
|
// only tested with qemu.
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../kernel/types.h"
|
||||||
|
|
||||||
struct stat;
|
struct stat;
|
||||||
|
|
||||||
// system calls
|
// system calls
|
||||||
|
@ -22,6 +26,7 @@ int getpid(void);
|
||||||
char *sbrk(int);
|
char *sbrk(int);
|
||||||
int sleep(int);
|
int sleep(int);
|
||||||
int uptime(void);
|
int uptime(void);
|
||||||
|
int trace(int);
|
||||||
|
|
||||||
// ulib.c
|
// ulib.c
|
||||||
int stat(const char *, struct stat *);
|
int stat(const char *, struct stat *);
|
||||||
|
|
|
@ -36,3 +36,4 @@ entry("getpid");
|
||||||
entry("sbrk");
|
entry("sbrk");
|
||||||
entry("sleep");
|
entry("sleep");
|
||||||
entry("uptime");
|
entry("uptime");
|
||||||
|
entry("trace");
|
||||||
|
|
Loading…
Add table
Reference in a new issue