Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions include/address.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#ifndef ADDRESS
#define ADDRESS
#include "mmu.h"

#define MMIO_BASE 0x3F000000
#define MMIO_BASE PHY_TO_VIR(0x3F000000)

#define LOAD_ADDR (volatile unsigned int*)(0x80000)
#define INITRAMFS_ADDR (volatile unsigned int*)(0x8000000)
#define LOAD_ADDR (volatile unsigned int*)(PHY_TO_VIR(0x80000))
#define INITRAMFS_ADDR (volatile unsigned int*)(PHY_TO_VIR(0x8000000))

// GPIO registers
#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000))
Expand Down Expand Up @@ -60,6 +61,6 @@
#define MBOX_EMPTY 0x40000000

// Interrupt
#define IRQS1 ((volatile unsigned int*)(0x3f00b210))
#define IRQS1 ((volatile unsigned int*)(PHY_TO_VIR(0x3f00b210)))

#endif
4 changes: 3 additions & 1 deletion include/cpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@

#include "type.h"

#define MAX_INITRAMFS_SIZE 0x10000
#define MAX_INITRAMFS_SIZE 0x100000

unsigned int hex2num(char *s, unsigned int max_len);
void extract_cpio(char* address, int ls, int cat, char* name);
char* extract_section(char* context, char* p, char* address, int len);
char* load_user_program(char* address, char* program_address, char* name);
uint64 get_program_size(char* address, char* name);
#endif
21 changes: 21 additions & 0 deletions include/dev_framebuffer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#ifndef H_DEV_FRAMEBUFFER
#define H_DEV_FRAMEBUFFER

#include "vfs.h"

extern file_operations_t dev_framebuffer_file_operations;
extern unsigned int width, height, pitch, isrgb;

typedef struct framebuffer_info {
unsigned int width;
unsigned int height;
unsigned int pitch;
unsigned int isrgb;
} framebuffer_info_t;

void init_dev_framebuffer();
int dev_framebuffer_write(file_t *file, const void *buf, size_t len);
int dev_framebuffer_open(vnode_t *file_node, file_t **target);
int dev_framebuffer_close(file_t *file);

#endif
13 changes: 13 additions & 0 deletions include/dev_uart.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#ifndef H_DEV_UART
#define H_DEV_UART

#include "vfs.h"

extern file_operations_t dev_uart_file_operations;

int dev_uart_write(file_t *file, const void *buf, size_t len);
int dev_uart_read(file_t *file, void *buf, size_t len);
int dev_uart_open(vnode_t *file_node, file_t **target);
int dev_uart_close(file_t *file);

#endif
16 changes: 13 additions & 3 deletions include/exception.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
#define EXCEPTION

#include "type.h"
#include "mmu.h"

#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(0x40000060))
#define CORE0_INTERRUPT_SOURCE ((volatile unsigned int*)(PHY_TO_VIR(0x40000060)))

#define PBASE 0x3F000000
#define PBASE PHY_TO_VIR(0x3F000000)
#define IRQ_BASIC_PENDING ((volatile unsigned int*)(PBASE+0x0000B200))
#define IRQ_PENDING_1 ((volatile unsigned int*)(PBASE+0x0000B204))
#define IRQ_PENDING_2 ((volatile unsigned int*)(PBASE+0x0000B208))
Expand All @@ -23,6 +24,15 @@

#define SIGRETURN 115

#define DATA_ABORT_LOWER 0b100100
#define INS_ABORT_LOWER 0b100000

#define TF_LEVEL0 0b000100
#define TF_LEVEL1 0b000101
#define TF_LEVEL2 0b000110
#define TF_LEVEL3 0b000111


typedef struct trapFrame {
uint64 x0;
uint64 x1;
Expand Down Expand Up @@ -63,5 +73,5 @@ typedef struct trapFrame {

void raise_exc();
void el1_to_el0(char* program_address, char* user_stack_address);

void svc_handle(trapFrame_t *frame, uint64 x1);
#endif
2 changes: 1 addition & 1 deletion include/fdt.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#define FDT_NOP (0x00000004)
#define FDT_END (0x00000009)

extern uint32* initramfs;
extern uint64 initramfs;

struct fdt_header {
uint32 magic; // 0xd00dfeed
Expand Down
32 changes: 32 additions & 0 deletions include/initramfs.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#ifndef H_INITRAMFS
#define H_INITRAMFS

#include "vfs.h"

typedef struct initramfs_internal {
enum NodeType ntype;
char name[MAX_COMPONENT_LENGTH];
vnode_t *entry[MAX_ENTRY];
char *data;
uint64 datasize;
} initramfs_internal_t;

filesystem_t *get_initramfs();
int setup_initramfs_mount(filesystem_t *fs, mount_t *mount);
vnode_t *create_initramfs_vnode(mount_t *mount, enum NodeType ntype);
int initramfs_write(file_t *file, const void *buf, size_t len);
int initramfs_read(file_t *file, void *buf, size_t len);
int initramfs_open(vnode_t *file_node, file_t **target);
int initramfs_close(file_t *file);
int initramfs_getsize(vnode_t *target);

int initramfs_lookup(vnode_t *dir, vnode_t **target, const char *component_name);
int initramfs_create(vnode_t *dir, vnode_t **target, const char *component_name);
int initramfs_mkdir(vnode_t *dir, vnode_t **target, const char *component_name);






#endif
2 changes: 1 addition & 1 deletion include/interrupt.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#define UART_INTERRUPT_TX_PRIORITY 2
#define UART_INTERRUPT_RX_PRIORITY 3
#define TIMER_INTERRUPT_PRIORITY 5
#define TIMER_INTERRUPT_PRIORITY 4
#define WAIT_INTERRUPT_PRIORITY 999

typedef struct interrupt_event
Expand Down
131 changes: 43 additions & 88 deletions include/memory.h
Original file line number Diff line number Diff line change
@@ -1,91 +1,46 @@
#ifndef MEMORY
#define MEMORY
#include "type.h"

extern unsigned long long _heap_start; // linker script symbol
extern unsigned long long _heap_end; // linker script symbol
static char* heap = (char*)&_heap_start;
static char* heap_end = (char*)&_heap_end;

void* simple_malloc(unsigned int size);
char* memcpy (void *dest, const void *src, unsigned long long len);

#define MAX_ORDER 12
#define MAX_PAGES 2048
#define MINI_PAGE_SIZE 4 // kB
#define PAGE_BEGIN_ADDRESS 0x00000000
#define BASE_NUM 64 // can't change so far
#define NUM_POOL 1
#define KB 1 << 10

typedef struct node {
struct node* prevNode;
struct node* nextNode;
uint64 address;
} node_t;

typedef struct memoryPool {
uint64 address;
uint32 size;
uint64 stateBitMap;
uint64 mask;
} memoryPool_t;

typedef struct page {
uint32 order;
uint64 address;
int state;
struct page* prevPage;
struct page* nextPage;
struct page* buddyPage;
struct page* parentPage;
struct page* appendPage;
memoryPool_t* pool;
} page_t;

typedef struct pageHeader {
page_t* firstFree;
page_t* firstEmpty;
} pageHeader_t;
#ifndef MEMORY_H
#define MEMORY_H

#include "list.h"
#include "uart.h"
#include "cpio.h"
#include "address.h"
#include "interrupt.h"
#include "mmu.h"

#define MAXORDER 7
#define MAXCACHEORDER 4 // 32, 64, 128, 256, 512 (for every 32bytes)

// simple_malloc
void *simple_malloc(unsigned int size);
char *memcpy (void *dest, const void *src, unsigned long long len);
void *memset(void *s, int c, size_t n);

#define BUDDYSYSTEM_START PHY_TO_VIR(0x000000L)
#define BUDDYSYSTEM_PAGE_COUNT 0x3C000 // 0x3C000000 is total size of memory, page size is 0x1000
//buddy system (for >= 4K pages)
void *allocpage(unsigned int size);
void freepage(void *ptr);

void *alloccache(unsigned int size);
void freecache(void *ptr);
void page2caches(int order);

void *malloc(unsigned int size);
void free(void *ptr);

typedef struct frame
{
struct list_head listhead;
int val; // val is order
int isused;
int cacheorder; // -1 means isn't used for cache
unsigned int idx;
} frame_t;

void initMemoryPages();
page_t* createPage(uint32 order, uint64 address, int state);
void initPool(memoryPool_t* pool, uint32 maxSize, uint32 size, uint64 address);
void* malloc(uint32 size);
uint32 sizeToSmallestOrder(uint32 size);
void appendNewPage(page_t* parentPage, page_t* newPage);
void showAppendPage(page_t *parentPage);
bool isAllFull(page_t* page, uint32 size);
bool isFull(page_t* page, uint32 size);
bool isPoolFull(memoryPool_t* pool, uint32 size);
void* allocateMemoryFromPage(page_t* page, uint32 size);
void registerUsedAddress(page_t* page);
uint32 addressToBlockIdx(uint64 address);
void removeUsedAddress(page_t* page);

page_t* getFreePageAtOrder(uint32 order);
void loggingPage(page_t* page);
void loggingPool(memoryPool_t* pool);
bool hasFreePageAtOrder(uint32 order);
bool hasNoFreePageAtOrder(uint32 order);
void dividePageToLowerOrder(page_t* page);
page_t* addPageAtOrder(uint32 order, uint64 address, page_t* parentPage);
uint64 getPageSizeAtOrder(uint32 order);
uint64 getPageNumAtOrder(uint32 order);
void bindAsBuddy(page_t* page1, page_t* page2);
void freePage(page_t* page);
bool isNotPageHead(page_t* page);
bool isNotPageTail(page_t* page);
bool isFirstFree(page_t* page);
bool isFirstEmpty(page_t* page);
void mergePagesToHigherOrder(page_t* page);
void moveToTail(page_t* page);
void loggingAllPageState();
void free(uint64 address);
void init_reserve();
void reserveMemory(uint64 start, uint64 end);
void reservePage(uint32 order, uint64 address);
bool inRange(page_t* page, uint64 address);
bool inPool(memoryPool_t* pool, uint64 address);

frame_t *release_redundant(frame_t *frame);
frame_t *get_buddy(frame_t *frame);
frame_t *coalesce(frame_t* f);
void memory_reserve(unsigned long long start, unsigned long long end);
#endif
71 changes: 71 additions & 0 deletions include/mmu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#ifndef MMU_H
#define MMU_H

#define TCR_CONFIG_REGION_48bit (((64 - 48) << 0) | ((64 - 48) << 16))
#define TCR_CONFIG_4KB ((0b00 << 14) | (0b10 << 30))
#define TCR_CONFIG_DEFAULT (TCR_CONFIG_REGION_48bit | TCR_CONFIG_4KB)

#define MAIR_DEVICE_nGnRnE 0b00000000
#define MAIR_NORMAL_NOCACHE 0b01000100
#define MAIR_IDX_DEVICE_nGnRnE 0
#define MAIR_IDX_NORMAL_NOCACHE 1


#define PERIPHERAL_START 0x3c000000L
#define PERIPHERAL_END 0x3f000000L
#define PERIPHERAL_BASE 0x3f000000L
#define PAGE_TABLE_BASE 0x10000000L
#define USER_KERNEL_BASE 0x00000000L
#define THREAD_STACK_SIZE 0x4000L
#define USER_STACK_BASE 0xfffffffff000L - THREAD_STACK_SIZE

#define PGD_BASE (PAGE_TABLE_BASE + 0x0000)
#define PUD_BASE (PAGE_TABLE_BASE + 0x1000)
#define PMD_BASE (PAGE_TABLE_BASE + 0x2000)
#define PTE_BASE (PAGE_TABLE_BASE + 0x4000)

#define PD_TABLE 0b11L
#define PD_BLOCK 0b01L
#define PD_PAGE 0b11L
#define PD_NE_EL0 (1L << 54)
#define PD_NE_EL1 (1L << 53)
#define PD_ACCESS (1L << 10)
#define PD_UK_ACCESS (1L << 6)
#define PD_RDONLY (1L << 7)
#define BOOT_PGD_ATTR (PD_TABLE)
#define BOOT_PUD_ATTR (PD_TABLE)
#define BOOT_PMD_ATTR (PD_TABLE)

#define BOOT_PTE_DEVICE_nGnRnE_ATTR \
(PD_ACCESS | (MAIR_IDX_DEVICE_nGnRnE << 2) | PD_PAGE | PD_UK_ACCESS | PD_NE_EL0 | PD_NE_EL1)
#define BOOT_PTE_NORMAL_NOCACHE_ATTR \
(PD_ACCESS | (MAIR_IDX_NORMAL_NOCACHE << 2) | PD_PAGE)

#define PHY_TO_VIR(x) ((x) | 0xffff000000000000L)
#define VIR_TO_PHY(x) ((x) & ~0xffff000000000000L)

#ifndef __ASSEMBLER__

#include "type.h"
#include "thread.h"

typedef struct thread thread_t;

typedef struct{
unsigned int iss : 25, // Instruction specific syndrome
il : 1, // Instruction length bit
ec : 6; // Exception class
} esr_el1_t;

void init_page_table(uint64 **table, int level);
void set_page_tables_for_thread(thread_t *thread);
void free_page_tables_for_thread(thread_t *thread);
void map_page_table(thread_t *thread, uint64 *pgd, uint64 vir_addr, uint64 phy_addr, bool readOnly);
void parser_table(uint64 vir_addr);
void set_vm_list_for_thread(thread_t *thread);
void free_vm_list_for_thread(thread_t *thread);
void handle_abort(esr_el1_t *esr_el1);
void seg_fault();
#endif //__ASSEMBLER__

#endif
9 changes: 2 additions & 7 deletions include/signal.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,9 @@
#define _SIGNAL_H

#include "type.h"
#include "exception.h"
#define SIGMAX 16

typedef struct signal_pair {
uint64 spsr_el1;
int pid;
int code;
} signal_pair_t;

typedef struct trapFrame trapFrame_t;

void signal_default_handlder();
void signal_register(int code, void (*handler)());
Expand Down
Loading