From 72c2b73dedb6a1440f913022089e85ae10296e05 Mon Sep 17 00:00:00 2001 From: bLueriVerLHR Date: Thu, 20 Jul 2023 17:22:16 +0800 Subject: [PATCH] [Modified] rm redundant files --- CMakeLists.txt | 74 --- Makefile | 0 README.md | 26 +- include/common.h | 36 -- include/devaddr.h | 26 - labus/device.cc | 5 - labus/include/device.hh | 148 ------ labus/include/memory.hh | 19 - labus/include/serial.hh | 10 - labus/include/sysbus.hh | 33 -- labus/memory.cc | 40 -- labus/serial.cc | 10 - labus/sysbus.cc | 66 --- laos/.gitignore | 1 - laos/Makefile | 76 --- laos/include/asm.h | 38 -- laos/include/console.h | 6 - laos/include/defs.h | 14 - laos/include/dev.h | 6 - laos/include/fcntl.h | 10 - laos/include/filepath.h | 9 - laos/include/filesys.h | 0 laos/include/kernel.h | 11 - laos/include/kprintf.h | 8 - laos/include/la32r.h | 106 ---- laos/include/latype.h | 22 - laos/include/macro.h | 7 - laos/include/memio.h | 11 - laos/include/memlayout.h | 9 - laos/include/proc.h | 117 ----- laos/include/spinlock.h | 23 - laos/include/string.h | 16 - laos/include/unistd.h | 9 - laos/include/util.h | 0 laos/kernel.ld | 42 -- laos/src/dev/Makefile | 21 - laos/src/dev/dev.c | 3 - laos/src/dev/serial.c | 31 -- laos/src/kernel/Makefile | 28 - laos/src/kernel/console.c | 28 - laos/src/kernel/entry.S | 20 - laos/src/kernel/kalloc.c | 1 - laos/src/kernel/kprintf.c | 116 ----- laos/src/kernel/main.c | 25 - laos/src/kernel/proc.c | 24 - laos/src/kernel/spinlock.c | 54 -- laos/src/kernel/start.c | 20 - laos/src/kernel/vm.c | 1 - laos/src/lib/Makefile | 21 - laos/src/lib/path.c | 0 laos/src/user/Makefile | 29 -- laos/src/user/echo.c | 16 - laos/src/user/shell.c | 0 laos/src/user/xargs.c | 47 -- laos/src/util/Makefile | 21 - laos/src/util/filepath.c | 71 --- laos/src/util/string.c | 93 ---- lasim/include/la32r.hh | 9 - lasim/la32r.cc | 1009 ------------------------------------ lasim/main.cc | 38 -- lavsim/main.cc | 43 -- 61 files changed, 1 insertion(+), 2802 deletions(-) delete mode 100644 CMakeLists.txt delete mode 100644 Makefile delete mode 100644 include/common.h delete mode 100644 include/devaddr.h delete mode 100644 labus/device.cc delete mode 100644 labus/include/device.hh delete mode 100644 labus/include/memory.hh delete mode 100644 labus/include/serial.hh delete mode 100644 labus/include/sysbus.hh delete mode 100644 labus/memory.cc delete mode 100644 labus/serial.cc delete mode 100644 labus/sysbus.cc delete mode 100644 laos/.gitignore delete mode 100644 laos/Makefile delete mode 100644 laos/include/asm.h delete mode 100644 laos/include/console.h delete mode 100644 laos/include/defs.h delete mode 100644 laos/include/dev.h delete mode 100644 laos/include/fcntl.h delete mode 100644 laos/include/filepath.h delete mode 100644 laos/include/filesys.h delete mode 100644 laos/include/kernel.h delete mode 100644 laos/include/kprintf.h delete mode 100644 laos/include/la32r.h delete mode 100644 laos/include/latype.h delete mode 100644 laos/include/macro.h delete mode 100644 laos/include/memio.h delete mode 100644 laos/include/memlayout.h delete mode 100644 laos/include/proc.h delete mode 100644 laos/include/spinlock.h delete mode 100644 laos/include/string.h delete mode 100644 laos/include/unistd.h delete mode 100644 laos/include/util.h delete mode 100644 laos/kernel.ld delete mode 100644 laos/src/dev/Makefile delete mode 100644 laos/src/dev/dev.c delete mode 100644 laos/src/dev/serial.c delete mode 100644 laos/src/kernel/Makefile delete mode 100644 laos/src/kernel/console.c delete mode 100644 laos/src/kernel/entry.S delete mode 100644 laos/src/kernel/kalloc.c delete mode 100644 laos/src/kernel/kprintf.c delete mode 100644 laos/src/kernel/main.c delete mode 100644 laos/src/kernel/proc.c delete mode 100644 laos/src/kernel/spinlock.c delete mode 100644 laos/src/kernel/start.c delete mode 100644 laos/src/kernel/vm.c delete mode 100644 laos/src/lib/Makefile delete mode 100644 laos/src/lib/path.c delete mode 100644 laos/src/user/Makefile delete mode 100644 laos/src/user/echo.c delete mode 100644 laos/src/user/shell.c delete mode 100644 laos/src/user/xargs.c delete mode 100644 laos/src/util/Makefile delete mode 100644 laos/src/util/filepath.c delete mode 100644 laos/src/util/string.c delete mode 100644 lasim/include/la32r.hh delete mode 100644 lasim/la32r.cc delete mode 100644 lasim/main.cc delete mode 100644 lavsim/main.cc diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 2cad6e1..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,74 +0,0 @@ -cmake_minimum_required(VERSION 3.12) -cmake_policy(SET CMP0074 NEW) -project(neula) - -# 为 Verilator 设置环境变量 -if(NOT DEFINED VERILATOR_ROOT) - set(ENV{VERILATOR_ROOT} "/home/blur/gits/verilator") -endif() - -# 设置 Verilator 头文件目录 -include_directories($ENV{VERILATOR_ROOT}/include) - -# 设置编译器参数 -if (${CMAKE_BUILD_TYPE} STREQUAL "Debug") - message("Turn On Debugger") - add_compile_options(-D DEBUG_MODE) -endif() - -include_directories(${CMAKE_SOURCE_DIR}/include) - -# ----- ----- 构建虚拟外设 ----- ----- -set(LABUS labus) -set(LA_BUS_TARGET ${PROJECT_NAME}-bus) - -# 包含头文件,以可以利用尖括号获取,辅助队友开发 -include_directories(${CMAKE_SOURCE_DIR}/${LABUS}/include) - -# 获取所有的 CXX 源文件 -file(GLOB_RECURSE LABUS_SRC ${CMAKE_SOURCE_DIR}/${LABUS}/*.cc) - -add_library(${LA_BUS_TARGET} ${LABUS_SRC}) -link_libraries(${LA_BUS_TARGET}) - - -# ----- ----- 构建虚拟处理器 ----- ----- -set(LASIM lasim) -set(LA_SIM_TARGET ${PROJECT_NAME}-sim) - -# 包含头文件,以可以利用尖括号获取,辅助队友开发 -include_directories(${CMAKE_SOURCE_DIR}/${LASIM}/include) - -# 获取所有的 CXX 源文件 -file(GLOB_RECURSE LASIM_SRC ${CMAKE_SOURCE_DIR}/${LASIM}/*.cc) - -add_executable(${LA_SIM_TARGET} ${LASIM_SRC}) - - -# ----- ----- 构建操作系统 ----- ----- -set(LAOS laos) -# add_custom_target(${LAOS} make build) - - -# ----- ----- 构建 Verilator 项目 ----- ----- -# set(LACPU lacpu) -# set(LAVSIM lavsim) -# set(LA_VSIM_TARGET ${PROJECT_NAME}-vsim) - -# find_package(verilator HINTS $ENV{VERILATOR_ROOT} ${VERILATOR_ROOT}) - -# if (NOT verilator_FOUND) -# message(FATAL_ERROR "Verilator was not found.") -# endif() - -# # set default top module as top file -# set(VSRC ${CMAKE_SOURCE_DIR}/${LACPU}/rtl/soc_lite_top.v) - -# # get all cxx source files from lavsim folder -# file(GLOB_RECURSE LAVSIM_SRC ${CMAKE_SOURCE_DIR}/${LAVSIM}/*.cc) - -# add_executable(${LA_VSIM_TARGET} ${LAVSIM_SRC}) - -# verilate(${LA_VSIM_TARGET} -# INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/${LACPU}/rtl/cpu ${VERILATOR_ROOT}/include -# SOURCES ${VSRC}) \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index e69de29..0000000 diff --git a/README.md b/README.md index a6d3b94..e377447 100644 --- a/README.md +++ b/README.md @@ -6,28 +6,4 @@ |文件夹名称|文件夹用处| |-|-| -|lacpu | 龙芯处理器设计 Verilog | -|lasim | 龙芯模拟 软件模拟 C++ | -|lavsim | 龙芯模拟 Verilator 模拟 | -|labus | 龙芯虚拟外设 | -|laos | 龙芯操作系统 | - -除了 `lavsim` 和 `lacpu` 是在一起编译成一个文件,其余都会编译成单独的二进制文件 - -### lacpu - -### lasim - -`lasim` 模拟龙芯行为,主要用于操作系统的软件模拟,通过软件角度对龙芯的基本硬件特性进行模拟,以辅助操作系统设计。 - -### lavsim - -`lavsim` 主要用于测试 Verilog 设计的正确性。 - -### labus - -`labus` 模拟外设行为,主要用于设计虚拟外设以软件模拟外设行为是否正确。 - -### laos - -`laos` 自主设计操作系统,会参考其他项目进行设计。 \ No newline at end of file +|lacpu | 龙芯处理器设计 Verilog | \ No newline at end of file diff --git a/include/common.h b/include/common.h deleted file mode 100644 index d874c68..0000000 --- a/include/common.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#ifndef COMMON_H__ -#define COMMON_H__ - -#ifdef DEBUG_MODE -#define Log(fmt, ...) printf("[%s:%d %ld] " fmt "\n", __FILE__, __LINE__, clock(), ## __VA_ARGS__) - -#define panic(x) do { \ - Log(x); \ - exit(EXIT_FAILURE); \ -} while (0) - -#define panicifnot(cond) do { \ - if (!(cond)) { \ - Log(#cond " fail"); \ - exit(EXIT_FAILURE); \ - } \ -} while (0) - -#else - -#define Log(...) -#define panic(x) -#define panicifnot(cond) - -#endif - -#endif - diff --git a/include/devaddr.h b/include/devaddr.h deleted file mode 100644 index 2c91e75..0000000 --- a/include/devaddr.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#ifndef DEVADDR_H__ -#define DEVADDR_H__ - -#define RAM_ADDR 0x0000'0000 -#define RST_ADDR 0x1c00'0000 - -#define HEAP_ADDR 0x2000'0000 -#define HEAP_SIZE 0x0020'0000 -#define STAK_SIZE 0x0002'0000 -#define STAK_ADDR (HEAP_ADDR + HEAP_SIZE + STAK_SIZE) - -#define DEVICE_BASE 0xa0000000 -#define MMIO_BASE 0xa0000000 - -#define SERIAL_PORT (DEVICE_BASE + 0x00003f8) -#define KBD_ADDR (DEVICE_BASE + 0x0000060) -#define RTC_ADDR (DEVICE_BASE + 0x0000048) -#define VGACTL_ADDR (DEVICE_BASE + 0x0000100) -#define AUDIO_ADDR (DEVICE_BASE + 0x0000200) -#define DISK_ADDR (DEVICE_BASE + 0x0000300) -#define FB_ADDR (MMIO_BASE + 0x1000000) -#define AUDIO_SBUF_ADDR (MMIO_BASE + 0x1200000) - -#endif \ No newline at end of file diff --git a/labus/device.cc b/labus/device.cc deleted file mode 100644 index 739abc8..0000000 --- a/labus/device.cc +++ /dev/null @@ -1,5 +0,0 @@ -#include - -Device::Device(bool cacheable): cacheable_(cacheable) {} - -bool Device::is_cacheable() { return cacheable_; } \ No newline at end of file diff --git a/labus/include/device.hh b/labus/include/device.hh deleted file mode 100644 index 7351464..0000000 --- a/labus/include/device.hh +++ /dev/null @@ -1,148 +0,0 @@ -#pragma once - -#include -#include - - -class Device { -protected: - bool cacheable_ = false; - -public: - Device(bool cacheable); - - bool is_cacheable(); - - virtual const size_t &size() const = 0; - - virtual void write(char *buf, size_t addr, size_t len) = 0; - virtual void read(char *buf, size_t addr, size_t len) = 0; - - virtual void write64(uint64_t &dword, size_t addr) = 0; - virtual void read64(uint64_t &dword, size_t addr) = 0; - - virtual void write32(uint32_t &word, size_t addr) = 0; - virtual void read32(uint32_t &word, size_t addr) = 0; - - virtual void write16(uint16_t &hword, size_t addr) = 0; - virtual void read16(uint16_t &hword, size_t addr) = 0; - - virtual void write8(uint8_t &byte, size_t addr) = 0; - virtual void read8(uint8_t &byte, size_t addr) = 0; - - virtual ~Device() = default; -}; - -template -class WRDevice : public Device{ -protected: - size_t devsiz; - -public: - WRDevice(size_t siz); - - virtual const size_t &size() const; - - virtual void write(char *buf, size_t addr, size_t len); - virtual void read(char *buf, size_t addr, size_t len); - - virtual void write64(uint64_t &dword, size_t addr); - virtual void read64(uint64_t &dword, size_t addr); - - virtual void write32(uint32_t &word, size_t addr); - virtual void read32(uint32_t &word, size_t addr); - - virtual void write16(uint16_t &hword, size_t addr); - virtual void read16(uint16_t &hword, size_t addr); - - virtual void write8(uint8_t &byte, size_t addr); - virtual void read8(uint8_t &byte, size_t addr); - - virtual ~WRDevice() = default; -}; - -template -WRDevice::WRDevice(size_t siz) : devsiz(siz) {} - -template -const size_t &WRDevice::size() const { return devsiz; } - -template -void WRDevice::write(char *buf, size_t addr, size_t len) {} - -template -void WRDevice::read(char *buf, size_t addr, size_t len) {} - -template -void WRDevice::write64(uint64_t &dword, size_t addr) { - uint8_t buf[sizeof(dword)]; - buf[0] = (dword >> 0) & 0xFF; - buf[1] = (dword >> 8) & 0xFF; - buf[2] = (dword >> 16) & 0xFF; - buf[3] = (dword >> 24) & 0xFF; - buf[4] = (dword >> 32) & 0xFF; - buf[5] = (dword >> 40) & 0xFF; - buf[6] = (dword >> 48) & 0xFF; - buf[7] = (dword >> 56) & 0xFF; - static_cast(this)->write((char *)buf, addr, sizeof(dword)); -} - -template -void WRDevice::read64(uint64_t &dword, size_t addr) { - uint8_t buf[sizeof(dword)]; - static_cast(this)->read((char *)buf, addr, sizeof(dword)); - dword = (uint64_t) buf[0]; - dword |= (uint64_t) buf[1] << 8; - dword |= (uint64_t) buf[2] << 16; - dword |= (uint64_t) buf[3] << 24; - dword |= (uint64_t) buf[4] << 32; - dword |= (uint64_t) buf[5] << 40; - dword |= (uint64_t) buf[6] << 48; - dword |= (uint64_t) buf[7] << 56; -} - -template -void WRDevice::write32(uint32_t &word, size_t addr) { - uint8_t buf[sizeof(word)]; - buf[0] = (word >> 0) & 0xFF; - buf[1] = (word >> 8) & 0xFF; - buf[2] = (word >> 16) & 0xFF; - buf[3] = (word >> 24) & 0xFF; - static_cast(this)->write((char *)buf, addr, sizeof(word)); -} - -template -void WRDevice::read32(uint32_t &word, size_t addr) { - uint8_t buf[sizeof(word)]; - static_cast(this)->read((char *)buf, addr, sizeof(word)); - word = (uint32_t) buf[0]; - word |= (uint32_t) buf[1] << 8; - word |= (uint32_t) buf[2] << 16; - word |= (uint32_t) buf[3] << 24; -} - -template -void WRDevice::write16(uint16_t &hword, size_t addr) { - uint8_t buf[sizeof(hword)]; - buf[0] = (hword >> 0) & 0xFF; - buf[1] = (hword >> 8) & 0xFF; - static_cast(this)->write((char *)buf, addr, sizeof(hword)); -} - -template -void WRDevice::read16(uint16_t &hword, size_t addr) { - uint8_t buf[sizeof(hword)]; - static_cast(this)->read((char *)buf, addr, sizeof(hword)); - hword = (uint16_t) buf[0]; - hword |= (uint16_t) buf[1] << 8; -} - -template -void WRDevice::write8(uint8_t &byte, size_t addr) { - static_cast(this)->write((char *)&byte, addr, sizeof(byte)); -} - -template -void WRDevice::read8(uint8_t &byte, size_t addr) { - static_cast(this)->read((char *)&byte, addr, sizeof(byte)); -} \ No newline at end of file diff --git a/labus/include/memory.hh b/labus/include/memory.hh deleted file mode 100644 index 95f943b..0000000 --- a/labus/include/memory.hh +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include - -class Memory : public WRDevice { - char *data; - bool wen; - bool ren; - bool xen; -public: - Memory(size_t siz, bool w = true, bool r = true, bool x = true); - ~Memory(); - - void load(const char *path); - void load(Memory *mem, size_t addr, size_t len); - - void write(char *buf, size_t addr, size_t len); - void read(char *buf, size_t addr, size_t len); -}; \ No newline at end of file diff --git a/labus/include/serial.hh b/labus/include/serial.hh deleted file mode 100644 index 70df009..0000000 --- a/labus/include/serial.hh +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include - -class Serial : public WRDevice { -public: - Serial(size_t siz); - - void write(char *buf, size_t addr, size_t len); -}; \ No newline at end of file diff --git a/labus/include/sysbus.hh b/labus/include/sysbus.hh deleted file mode 100644 index 4da2b94..0000000 --- a/labus/include/sysbus.hh +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include -#include -#include - -#include - -class SystemBus { - std::map iomap_; - - std::pair &finddev(uint64_t addr); - -public: - SystemBus() = default; - - void regdev(Device *dev, uint64_t addr); - - void write(char *buf, size_t addr, size_t len); - void read(char *buf, size_t addr, size_t len); - - void write64(uint64_t &dword, size_t addr); - void read64(uint64_t &dword, size_t addr); - - void write32(uint32_t &word, size_t addr); - void read32(uint32_t &word, size_t addr); - - void write16(uint16_t &hword, size_t addr); - void read16(uint16_t &hword, size_t addr); - - void write8(uint8_t &byte, size_t addr); - void read8(uint8_t &byte, size_t addr); -}; \ No newline at end of file diff --git a/labus/memory.cc b/labus/memory.cc deleted file mode 100644 index a0dc33a..0000000 --- a/labus/memory.cc +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include - -Memory::Memory(size_t siz, bool w, bool r, bool x) - : WRDevice(siz), wen(w), ren(r), xen(x) { - data = new char[siz]; - memset((void *)data, 0, siz); -} - -Memory::~Memory() { - if (data) { - delete [] data; - } -} - -void Memory::load(const char *path) { - std::fstream ifs(path, std::ios::in | std::ios::binary); - panicifnot(ifs); - ifs.read(data, this->size()); - ifs.close(); -} - -void Memory::load(Memory *mem, size_t addr, size_t len) { - panicifnot(addr + len < this->size()); - memcpy(&data[addr], mem->data, len); -} - -void Memory::write(char *buf, size_t addr, size_t len) { - if (!wen) - panic("permission denied"); - size_t actlen = addr + len >= this->size() ? this->size() - addr : len; - memcpy(&data[addr], buf, actlen); -} - -void Memory::read(char *buf, size_t addr, size_t len) { - if (!ren) - panic("permission denied"); - size_t actlen = addr + len >= this->size() ? this->size() - addr : len; - memcpy(buf, &data[addr], actlen); -} \ No newline at end of file diff --git a/labus/serial.cc b/labus/serial.cc deleted file mode 100644 index a3d94fe..0000000 --- a/labus/serial.cc +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -Serial::Serial(size_t siz) : WRDevice(siz) {} - -void Serial::write(char *buf, size_t addr, size_t len) { - for (size_t i = 0; i < len; ++i) - putc(buf[i], stdout); - fflush(stdout); -} \ No newline at end of file diff --git a/labus/sysbus.cc b/labus/sysbus.cc deleted file mode 100644 index 0472f18..0000000 --- a/labus/sysbus.cc +++ /dev/null @@ -1,66 +0,0 @@ -#include -#include - -std::pair &SystemBus::finddev(uint64_t addr) { - Device *dev = nullptr; - auto &&iter = iomap_.upper_bound(addr); - if (iter == iomap_.begin()) - panic("device not found"); - iter--; - if (iter->first <= addr && iter->first + iter->second->size() > addr) - dev = iter->second; - panicifnot(dev); - return *iter; -} - -void SystemBus::regdev(Device *dev, uint64_t addr) { iomap_.emplace(addr, dev); } - -void SystemBus::write(char *buf, size_t addr, size_t len) { - auto &&dev = finddev(addr); - dev.second->write(buf, addr - dev.first, len); -} - -void SystemBus::read(char *buf, size_t addr, size_t len) { - auto &&dev = finddev(addr); - dev.second->read(buf, addr - dev.first, len); -} - -void SystemBus::write64(uint64_t &dword, size_t addr) { - auto &&dev = finddev(addr); - dev.second->write64(dword, addr - dev.first); -} - -void SystemBus::read64(uint64_t &dword, size_t addr) { - auto &&dev = finddev(addr); - dev.second->read64(dword, addr - dev.first); -} - -void SystemBus::write32(uint32_t &word, size_t addr) { - auto &&dev = finddev(addr); - dev.second->write32(word, addr - dev.first); -} - -void SystemBus::read32(uint32_t &word, size_t addr) { - auto &&dev = finddev(addr); - dev.second->read32(word, addr - dev.first); -} - -void SystemBus::write16(uint16_t &hword, size_t addr) { - auto &&dev = finddev(addr); - dev.second->write16(hword, addr - dev.first); -} - -void SystemBus::read16(uint16_t &hword, size_t addr) { - auto &&dev = finddev(addr); - dev.second->read16(hword, addr - dev.first); -} - -void SystemBus::write8(uint8_t &byte, size_t addr) { - auto &&dev = finddev(addr); - dev.second->write8(byte, addr - dev.first); -} - -void SystemBus::read8(uint8_t &byte, size_t addr) { - auto &&dev = finddev(addr); - dev.second->read8(byte, addr - dev.first); -} \ No newline at end of file diff --git a/laos/.gitignore b/laos/.gitignore deleted file mode 100644 index d163863..0000000 --- a/laos/.gitignore +++ /dev/null @@ -1 +0,0 @@ -build/ \ No newline at end of file diff --git a/laos/Makefile b/laos/Makefile deleted file mode 100644 index dcaea65..0000000 --- a/laos/Makefile +++ /dev/null @@ -1,76 +0,0 @@ -LA_BIN_PATH := $(CURDIR)/../ext/loongarch32r-linux-gnusf-2022-05-20/bin -LA_PREFIX := loongarch32r-linux-gnusf- - -CC := $(LA_BIN_PATH)/$(LA_PREFIX)gcc -CXX := $(LA_BIN_PATH)/$(LA_PREFIX)g++ -OD := $(LA_BIN_PATH)/$(LA_PREFIX)objdump -OC := $(LA_BIN_PATH)/$(LA_PREFIX)objcopy -RE := $(LA_BIN_PATH)/$(LA_PREFIX)readelf - -NPROC := $(shell nproc) - -CMAKE := cmake - -BUILD_DIR := build -ABS_BUILD := $(CURDIR)/$(BUILD_DIR) -$(shell mkdir -p $(BUILD_DIR)) - -BIN := neula-os -BINARY := $(BUILD_DIR)/$(BIN) - -TOP_SRC_DIR := src -MODULES := kernel util -SOURCE_DIRS := $(addprefix $(TOP_SRC_DIR)/,$(MODULES)) -MK_DIRS := $(addprefix MAKE/,$(SOURCE_DIRS)) -ALL_SRCS := $(shell find . -name '*.c') -LD_CSRIPT := kernel.ld - -EXTRA_MACRO := # NDEBUG - -EXTRA_FLAGS = -Wall -Werror -O0 -fno-omit-frame-pointer -ggdb -gdwarf-2 -EXTRA_FLAGS += -mfpu=none -march=loongarch32r -mabi=ilp32s -EXTRA_FLAGS += -MD -EXTRA_FLAGS += -ffreestanding -fno-common -nostdlib -EXTRA_FLAGS += -I. -EXTRA_FLAGS += -fno-pie -no-pie -EXTRA_FLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) - -COMMONFLAGS := $(EXTRA_FLAGS) -CPPFLAGS += $(addprefix -D,$(EXTRA_MACRO)) -I$(CURDIR)/include -CFLAGS += $(COMMONFLAGS) -LDFLAGS += $(COMMONFLAGS) -z max-page-size=4096 -T$(LD_CSRIPT) - -.PHONY: all build clean - -all: build - -$(MK_DIRS): MAKE/%:% $(shell find $(%) -name '*.c') - @TOP_BUILD_DIR=$(ABS_BUILD) \ - CC=$(CC) \ - CPPFLAGS="$(CPPFLAGS)" \ - CFLAGS="$(CFLAGS)" \ - LDFLAGS="$(LDFLAGS)" \ - $(MAKE) -C $< -j$(NPROC) - -build: $(MK_DIRS) - @$(CC) -o $(BINARY) $(shell find $(BUILD_DIR) -name '*.o') $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) - @$(OD) -D $(BINARY) > $(BINARY).dump - @$(RE) -a $(BINARY) > $(BINARY).info - @$(OC) $(BINARY) -O binary $(BINARY).bin - -clean: - rm -rf $(BUILD_DIR) - - -# use native - -clean-usr: - rm -rf $(BUILD_DIR)/user - -usr: - @TOP_BUILD_DIR=$(ABS_BUILD) \ - CPPFLAGS="$(CPPFLAGS)" \ - $(MAKE) native -C $(TOP_SRC_DIR)/user -j$(NPROC) - -tcpl: - $(CC) --target-help diff --git a/laos/include/asm.h b/laos/include/asm.h deleted file mode 100644 index 99b445f..0000000 --- a/laos/include/asm.h +++ /dev/null @@ -1,38 +0,0 @@ -#include "defs.h" - -#ifndef ASM_H__ -#define ASM_H__ - -// CSR infos -#define CRMD 0x000 /* 当前模式信息 */ -#define PRMD 0x001 /* 例外前模式信息 */ -#define EUEN 0x002 /* 拓展部件使能 */ -#define ECFG 0x004 /* 例外配置 */ -#define ESTAT 0x005 /* 例外状态 */ -#define ERA 0x006 /* 例外返回地址 */ -#define BADV 0x007 /* 出错虚地址 */ -#define EENTRY 0x00c /* 例外地址入口 */ -#define TLBIDX 0x010 /* TLB 索引 */ -#define TLBEHI 0x011 /* TLB 表项高位 */ -#define TLBELO0 0x012 /* TLB 表项低位 0 */ -#define TLBELO1 0x013 /* TLB 表项低位 1 */ -#define ASID 0x018 /* 地址空间标识符 */ -#define PGDL 0x019 /* 低半地址空间全局目录基址 */ -#define PGDH 0x01a /* 高半地址空间全局目录基址 */ -#define PGD 0x01b /* 全局目录基址 */ -#define CPUID 0x020 /* 处理器编号 */ -#define SAVE0 0x030 /* 数据保存 0*/ -#define SAVE1 0x031 /* 数据保存 1*/ -#define SAVE2 0x032 /* 数据保存 2 */ -#define SAVE3 0x033 /* 数据保存 3 */ -#define TID 0x040 /* 定时器编号 */ -#define TCFG 0x041 /* 定时器配置 */ -#define TVAL 0x042 /* 定时器值 */ -#define TICLR 0x044 /* 定时中断清除 */ -#define LLBCTL 0x060 /* LLBit 控制 */ -#define TLBRENTRY 0x088 /* TLB 重填例外入口 */ -#define CTAG 0x098 /* 高速缓存标签 */ -#define DMW0 0x180 /* 直接映射配置窗口 0 */ -#define DMW1 0x181 /* 直接映射配置窗口 1 */ - -#endif \ No newline at end of file diff --git a/laos/include/console.h b/laos/include/console.h deleted file mode 100644 index 3d140fe..0000000 --- a/laos/include/console.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef CONSOLE_H__ -#define CONSOLE_H__ - -void consputc(int c); - -#endif \ No newline at end of file diff --git a/laos/include/defs.h b/laos/include/defs.h deleted file mode 100644 index 5784ef3..0000000 --- a/laos/include/defs.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef DEFS_H__ -#define DEFS_H__ - -#define NULL ((void *)0) - -#define NCPU 1 -#define NPROC 64 -#define NOFILE 16 - - -#define SERIAL_TX_BUF_SIZE 32 - - -#endif \ No newline at end of file diff --git a/laos/include/dev.h b/laos/include/dev.h deleted file mode 100644 index 98b0874..0000000 --- a/laos/include/dev.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef DEV_H__ -#define DEV_H__ - -extern char ioports[]; - -#endif \ No newline at end of file diff --git a/laos/include/fcntl.h b/laos/include/fcntl.h deleted file mode 100644 index df88ec1..0000000 --- a/laos/include/fcntl.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef FCNTL_H__ -#define FCNTL_H__ - -#define O_RDONLY 0x000 -#define O_WRONLY 0x001 -#define O_RDWR 0x002 -#define O_CREATE 0x200 -#define O_TRUNC 0x400 - -#endif \ No newline at end of file diff --git a/laos/include/filepath.h b/laos/include/filepath.h deleted file mode 100644 index 7e989c5..0000000 --- a/laos/include/filepath.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef FILEPATH_H__ -#define FILEPATH_H__ - - -char *basename(char *bnm, const char *path); -char *rmext(char *noext, const char *fname); -char *bearname(char *bnm, const char *fname); - -#endif \ No newline at end of file diff --git a/laos/include/filesys.h b/laos/include/filesys.h deleted file mode 100644 index e69de29..0000000 diff --git a/laos/include/kernel.h b/laos/include/kernel.h deleted file mode 100644 index 1ec981e..0000000 --- a/laos/include/kernel.h +++ /dev/null @@ -1,11 +0,0 @@ -#include "defs.h" - -#ifndef KERNEL_H__ -#define KERNEL_H__ - -void _entry() __attribute__ ((section (".entry"))); - -void start(); -void main(); - -#endif \ No newline at end of file diff --git a/laos/include/kprintf.h b/laos/include/kprintf.h deleted file mode 100644 index aa46385..0000000 --- a/laos/include/kprintf.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef KPRINTF_H__ -#define KPRINTF_H__ - - -void kprintf(char *fmt, ...); -void panic(char *s); - -#endif \ No newline at end of file diff --git a/laos/include/la32r.h b/laos/include/la32r.h deleted file mode 100644 index 563cd92..0000000 --- a/laos/include/la32r.h +++ /dev/null @@ -1,106 +0,0 @@ - - -#include "asm.h" -#include "defs.h" -#include "latype.h" -#include "macro.h" - -#ifndef __loongarch32r -#define __loongarch32r -#endif - -#include "larchintrin.h" - -#ifndef LA32R_H__ -#define LA32R_H__ - -static inline uint r_crmd() { - uint recv; - asm volatile ("csrrd %0, " TOSTRING(CRMD) : "=r" (recv)); - return recv; -} - -static inline void w_crmd(uint wdata) { - asm volatile ("csrwr %0, " TOSTRING(CRMD) : "=r" (wdata)); -} - -static inline void w_eentry(uint wdata) { - asm volatile ("csrwr %0, " TOSTRING(EENTRY) : "=r" (wdata)); -} - -static inline uint r_cpuid() { - uint recv; - asm volatile ("csrrd %0, " TOSTRING(CPUID) : "=r" (recv)); - return recv; -} - -// -// specified register io -// - -static inline uint r_sp() { - uint recv; - asm volatile ("add.w %0, $sp, $zero" : "=r" (recv)); - return recv; -} - -static inline uint r_tp() { - uint recv; - asm volatile ("add.w %0, $tp, $zero" : "=r" (recv)); - return recv; -} - -static inline void w_tp(uint wdata) { - asm volatile("add.w $tp, %0, $zero" : : "r" (wdata)); -} - -static inline uint r_ra() { - uint recv; - asm volatile ("add.w %0, $ra, $zero" : "=r" (recv)); - return recv; -} - -// -// mem misc -// - -// need to be tested -static inline void synchronize() { - __dbar(0); - __ibar(0); -} - - -// -// tlb misc -// - -// -// cache misc -// - - -// -// atomic -// - -static inline uint llw(intptr_t addr) { - uint recv; - asm volatile ("ll.w %0, %1, 0": "=r" (recv) : "r" (addr)); - return recv; -} - -static inline uint scw(uint wdata, intptr_t addr) { - uint recv; - asm volatile ( - "add.w %0, %1, $zero" "\n\t" - "sc.w %0, %2, 0" - : "=r" (recv) - : "r" (wdata), - "r" (addr)); - return recv; -} - - - -#endif \ No newline at end of file diff --git a/laos/include/latype.h b/laos/include/latype.h deleted file mode 100644 index c996a35..0000000 --- a/laos/include/latype.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef LATYPE_H__ -#define LATYPE_H__ - -typedef char i8; -typedef unsigned char u8; -typedef unsigned char uchar; - -typedef short i16; -typedef unsigned short u16; -typedef unsigned short ushort; - -typedef int i32; -typedef unsigned int u32; -typedef unsigned int uint; - -typedef unsigned int size_t; -typedef unsigned int intptr_t; - -typedef u32 pte_t; -typedef u32 *pagetable_t; - -#endif \ No newline at end of file diff --git a/laos/include/macro.h b/laos/include/macro.h deleted file mode 100644 index aba4a9a..0000000 --- a/laos/include/macro.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef MACRO_H__ -#define MACRO_H__ - -#define TOSTRING_(x) #x -#define TOSTRING(x) TOSTRING_(x) - -#endif \ No newline at end of file diff --git a/laos/include/memio.h b/laos/include/memio.h deleted file mode 100644 index 543342c..0000000 --- a/laos/include/memio.h +++ /dev/null @@ -1,11 +0,0 @@ -#include "latype.h" - - -#ifndef MEMIO_H__ -#define MEMIO_H__ - -#define memb(addr) (*(u8 *)(addr)) -#define memh(addr) (*(u16 *)(addr)) -#define memw(addr) (*(u32 *)(addr)) - -#endif \ No newline at end of file diff --git a/laos/include/memlayout.h b/laos/include/memlayout.h deleted file mode 100644 index 88be45b..0000000 --- a/laos/include/memlayout.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef MEMLAYOUT_H__ -#define MEMLAYOUT_H__ - -#define DEV_BASE_ADDR 0xa0000000 - - -#define SERIAL_OFFSET 0x00000000 - -#endif \ No newline at end of file diff --git a/laos/include/proc.h b/laos/include/proc.h deleted file mode 100644 index b3f496f..0000000 --- a/laos/include/proc.h +++ /dev/null @@ -1,117 +0,0 @@ -#include "latype.h" -#include "defs.h" -#include "spinlock.h" - -#ifndef PROC_H__ -#define PROC_H__ - -// Saved registers for kernel context switches. -struct context { - u32 ra; - u32 sp; - - // callee-saved - u32 s0; - u32 s1; - u32 s2; - u32 s3; - u32 s4; - u32 s5; - u32 s6; - u32 s7; - u32 s8; - u32 s9; -}; - -// Per-CPU state. -struct cpu { - struct proc *proc; // The process running on this cpu, or null. - struct context context; // swtch() here to enter scheduler(). - int noff; // Depth of push_off() nesting. - int intena; // Were interrupts enabled before push_off()? -}; - -extern struct cpu cpus[NCPU]; - - -// per-process data for the trap handling code in trampoline.S. -// sits in a page by itself just under the trampoline page in the -// user page table. not specially mapped in the kernel page table. -// uservec in trampoline.S saves user registers in the trapframe, -// then initializes registers from the trapframe's -// kernel_sp, kernel_hartid, kernel_satp, and jumps to kernel_trap. -// usertrapret() and userret in trampoline.S set up -// the trapframe's kernel_*, restore user registers from the -// trapframe, switch to the user page table, and enter user space. -// the trapframe includes callee-saved user registers like s0-s11 because the -// return-to-user path via usertrapret() doesn't return through -// the entire kernel call stack. -struct trapframe { - /* 0 */ u32 kernel_satp; // kernel page table - /* 4 */ u32 kernel_sp; // top of process's kernel stack - /* 8 */ u32 kernel_trap; // usertrap() - /* 12 */ u32 eenrty; // saved user program counter - /* 16 */ u32 kernel_hartid; // saved kernel tp - /* 20 */ u32 ra; - /* 24 */ u32 tp; - /* 28 */ u32 sp; - /* 32 */ u32 a0; - /* 36 */ u32 a1; - /* 40 */ u32 a2; - /* 44 */ u32 a3; - /* 48 */ u32 a4; - /* 52 */ u32 a5; - /* 56 */ u32 a6; - /* 60 */ u32 a7; - /* 64 */ u32 t0; - /* 68 */ u32 t1; - /* 72 */ u32 t2; - /* 76 */ u32 t3; - /* 80 */ u32 t4; - /* 84 */ u32 t5; - /* 88 */ u32 t6; - /* 92 */ u32 t7; - /* 96 */ u32 t8; - /* 100 */ u32 r21; - /* 104 */ u32 s9; - /* 108 */ u32 s0; - /* 112 */ u32 s1; - /* 116 */ u32 s2; - /* 120 */ u32 s3; - /* 124 */ u32 s4; - /* 128 */ u32 s5; - /* 132 */ u32 s6; - /* 136 */ u32 s7; - /* 140 */ u32 s8; -}; - -enum procstate { UNUSED, USED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE }; - -// Per-process state -struct proc { - struct spinlock lock; - - // p->lock must be held when using these: - enum procstate state; // Process state - void *chan; // If non-zero, sleeping on chan - int killed; // If non-zero, have been killed - int xstate; // Exit status to be returned to parent's wait - int pid; // Process ID - - // wait_lock must be held when using this: - struct proc *parent; // Parent process - - // these are private to the process, so p->lock need not be held. - u32 kstack; // Virtual address of kernel stack - u32 sz; // Size of process memory (bytes) - pagetable_t pagetable; // User page table - struct trapframe *trapframe; // data page for trampoline.S - struct context context; // swtch() here to run process - struct file *ofile[NOFILE]; // Open files - struct inode *cwd; // Current directory - char name[16]; // Process name (debugging) -}; - -struct cpu *mycpu(); - -#endif \ No newline at end of file diff --git a/laos/include/spinlock.h b/laos/include/spinlock.h deleted file mode 100644 index 193d19f..0000000 --- a/laos/include/spinlock.h +++ /dev/null @@ -1,23 +0,0 @@ -#include "latype.h" - -#ifndef SPINLOCK_H__ -#define SPINLOCK_H__ - -struct spinlock { - uint locked; - - // debugging - char *name; - struct cpu *cpu; -}; - -void initlock(struct spinlock *lck, char *name); - -void acquire(struct spinlock *lck); -void release(struct spinlock *lck); - -int holding(struct spinlock *lck); -void push_off(); -void pop_off(); - -#endif \ No newline at end of file diff --git a/laos/include/string.h b/laos/include/string.h deleted file mode 100644 index 54a1dfd..0000000 --- a/laos/include/string.h +++ /dev/null @@ -1,16 +0,0 @@ -#include "latype.h" - -#ifndef STRING_H__ -#define STRING_H__ - -void *memset (void *dst , int c, uint n); -int memcmp (const void *m1, const void *m2, uint n); -void *memmove (void *dst, const void *src, uint n); -void *memcpy (void *dst, const void *src, uint n); - -int strncmp (const char *p, const char *q, uint n); -char *strncpy (char *s, const char *t, int n); -char *strcpy_s(char *s, const char *t, int n); -int strlen (const char *s); - -#endif \ No newline at end of file diff --git a/laos/include/unistd.h b/laos/include/unistd.h deleted file mode 100644 index effb9b2..0000000 --- a/laos/include/unistd.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef UNISTD_H__ -#define UNISTD_H__ - -/* Standard file descriptors. */ -#define STDIN_FILENO 0 /* Standard input. */ -#define STDOUT_FILENO 1 /* Standard output. */ -#define STDERR_FILENO 2 /* Standard error output. */ - -#endif \ No newline at end of file diff --git a/laos/include/util.h b/laos/include/util.h deleted file mode 100644 index e69de29..0000000 diff --git a/laos/kernel.ld b/laos/kernel.ld deleted file mode 100644 index 8212615..0000000 --- a/laos/kernel.ld +++ /dev/null @@ -1,42 +0,0 @@ -OUTPUT_ARCH( "loongarch32r" ) -ENTRY( _entry ) - -SECTIONS -{ - /* - * ensure that entry.S / _entry is at 0x1C000000, - */ - . = 0x1C000000; - - .text : { - *(.entry) - . = ALIGN(0x1000); - *(.text .text.*) - . = ALIGN(0x1000); - PROVIDE(etext = .); - } - - .rodata : { - . = ALIGN(16); - *(.srodata .srodata.*) /* do not need to distinguish this from .rodata */ - . = ALIGN(16); - *(.rodata .rodata.*) - } - - .data : { - . = ALIGN(16); - *(.sdata .sdata.*) /* do not need to distinguish this from .data */ - . = ALIGN(16); - *(.data .data.*) - } - - .bss : { - . = ALIGN(16); - *(.sbss .sbss.*) /* do not need to distinguish this from .bss */ - . = ALIGN(16); - *(.bss .bss.*) - } - - PROVIDE(end = .); - PROVIDE(ioports = 0xa0000000); -} diff --git a/laos/src/dev/Makefile b/laos/src/dev/Makefile deleted file mode 100644 index c332099..0000000 --- a/laos/src/dev/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -CURNAME := dev -BUILD_DIR := $(TOP_BUILD_DIR)/$(CURNAME) - -CSRC := $(wildcard *.c) -OBJS := $(patsubst %.c,%.o,$(CSRC)) -BUILD_OBJS := $(addprefix $(BUILD_DIR)/,$(OBJS)) - -.PHONY: build all message - -all: message build - -$(BUILD_DIR): - @mkdir -p $(BUILD_DIR) - -$(BUILD_OBJS): $(BUILD_DIR)/%.o:%.c $(BUILD_DIR) - @$(CC) -c -o $@ $< $(CPPFLAGS) $(CFLAGS) - -build: $(BUILD_OBJS) - -message: - @echo "building $(CURNAME)" \ No newline at end of file diff --git a/laos/src/dev/dev.c b/laos/src/dev/dev.c deleted file mode 100644 index 481bc16..0000000 --- a/laos/src/dev/dev.c +++ /dev/null @@ -1,3 +0,0 @@ -#include "dev.h" - -char ioports[]; diff --git a/laos/src/dev/serial.c b/laos/src/dev/serial.c deleted file mode 100644 index 3e27f52..0000000 --- a/laos/src/dev/serial.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "memlayout.h" -#include "latype.h" -#include "memio.h" -#include "defs.h" - -struct spinlock serial_tx_lock; -char serial_tx_buf[SERIAL_TX_BUF_SIZE]; - -u32 serial_tx_w; // write next to serial_tx_buf[serial_tx_w % SERIAL_TX_BUF_SIZE] -u32 serial_tx_r; // read next from serial_tx_buf[serial_tx_r % SERIAL_TX_BUF_SIZE] - - - -void serial_putc(int c) { - acquire(&serial_tx_lock); - - // if(panicked){ - // for(;;) - // ; - // } - - while(serial_tx_w == serial_tx_r + SERIAL_TX_BUF_SIZE){ - // buffer is full. - // wait for serialstart() to open up space in the buffer. - // sleep(&serial_tx_r, &serial_tx_lock); - } - serial_tx_buf[serial_tx_w % SERIAL_TX_BUF_SIZE] = c; - serial_tx_w += 1; - // serialstart(); - release(&serial_tx_lock); -} \ No newline at end of file diff --git a/laos/src/kernel/Makefile b/laos/src/kernel/Makefile deleted file mode 100644 index 855baa0..0000000 --- a/laos/src/kernel/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -CURNAME := kernel -BUILD_DIR := $(TOP_BUILD_DIR)/$(CURNAME) - -CSRC := $(wildcard *.c) -OBJS := $(patsubst %.c,%.o,$(CSRC)) -BUILD_OBJS := $(addprefix $(BUILD_DIR)/,$(OBJS)) - -ASSRC := $(wildcard *.S) -ASOBJ := $(patsubst %.S,%.o,$(ASSRC)) -BUILD_ASOBJ := $(addprefix $(BUILD_DIR)/,$(ASOBJ)) - -.PHONY: build all message - -all: message build - -$(BUILD_DIR): - @mkdir -p $(BUILD_DIR) - -$(BUILD_OBJS): $(BUILD_DIR)/%.o:%.c $(BUILD_DIR) - @$(CC) -c -o $@ $< $(CPPFLAGS) $(CFLAGS) - -$(BUILD_ASOBJ): $(BUILD_DIR)/%.o:%.S $(BUILD_DIR) - @$(CC) -c -o $@ $< $(CPPFLAGS) $(CFLAGS) - -build: $(BUILD_OBJS) $(BUILD_ASOBJ) - -message: - @echo "building $(CURNAME)" diff --git a/laos/src/kernel/console.c b/laos/src/kernel/console.c deleted file mode 100644 index 8c697ba..0000000 --- a/laos/src/kernel/console.c +++ /dev/null @@ -1,28 +0,0 @@ -#include "console.h" -#include "memio.h" -#include "memlayout.h" -#include "spinlock.h" -#include "dev.h" - -void consputc(int c) { - volatile char *out = &ioports[SERIAL_OFFSET]; - if (c == '\b') { - *out = '\b'; - *out = ' '; - *out = '\b'; - return; - } - - *out = c; -} - -struct { - struct spinlock lock; - - // input -#define INPUT_BUF_SIZE 128 - char buf[INPUT_BUF_SIZE]; - uint r; // Read index - uint w; // Write index - uint e; // Edit index -} cons; diff --git a/laos/src/kernel/entry.S b/laos/src/kernel/entry.S deleted file mode 100644 index 0b73253..0000000 --- a/laos/src/kernel/entry.S +++ /dev/null @@ -1,20 +0,0 @@ -#include "asm.h" - -.section .entry -.global _entry -_entry: - # set up a stack for C. - # stack0 is declared in start.c, - # with a 4096-byte stack per CPU. - # sp = stack0 + (hartid * 4096) - la.global $sp, stack0 - lu12i.w $a0, (1024*4 >> 12) & 0xfffff - addi.w $a0, $a0, 1024*4 & 0xfff - csrrd $a1, CPUID - addi.w $a1, $a1, 1 - mul.w $a0, $a0, $a1 - add.w $sp, $sp, $a0 - # jump to start() in start.c - bl start -spin: - b spin \ No newline at end of file diff --git a/laos/src/kernel/kalloc.c b/laos/src/kernel/kalloc.c deleted file mode 100644 index cf7e1f6..0000000 --- a/laos/src/kernel/kalloc.c +++ /dev/null @@ -1 +0,0 @@ -extern char end[]; \ No newline at end of file diff --git a/laos/src/kernel/kprintf.c b/laos/src/kernel/kprintf.c deleted file mode 100644 index a78fad5..0000000 --- a/laos/src/kernel/kprintf.c +++ /dev/null @@ -1,116 +0,0 @@ -#include - -#include "latype.h" -#include "console.h" -#include "kprintf.h" -#include "spinlock.h" - -volatile int panicked = 0; - -// lock to avoid interleaving concurrent printf's. -static struct { - struct spinlock lock; - int locking; -} pr; - -static char digits[] = "0123456789abcdef"; - -static void print_int(int xx, int base, int sign) { - char buf[32]; - int i; - uint x; - if (sign && (sign = xx < 0)) { - x = -xx; - } else { - x = xx; - } - - i = 0; - do { - buf[i++] = digits[x % base]; - } while ((x /= base) != 0); - - if(sign) { - buf[i++] = '-'; - } - - while(--i >= 0) - consputc(buf[i]); -} - -static void print_ptr(intptr_t x) { - consputc('0'); - consputc('x'); - for (int i = 0; i < (sizeof(intptr_t) * 2); i++, x <<= 4) - consputc(digits[x >> (sizeof(intptr_t) * 8 - 4)]); -} - -void kprintf(char *fmt, ...) { - va_list ap; - int i, c, locking; - char *s; - - locking = pr.locking; - if(locking) - acquire(&pr.lock); - - if (fmt == 0) - panic("null fmt"); - - va_start(ap, fmt); - for (i = 0; (c = fmt[i] & 0xff) != 0; i++) { - if (c != '%') { - consputc(c); - continue; - } - c = fmt[++i] & 0xff; - if (c == 0) { - break; - } - - switch (c) { - case 'd': - print_int(va_arg(ap, int), 10, 1); - break; - case 'x': - print_int(va_arg(ap, int), 16, 1); - break; - case 'p': - print_ptr(va_arg(ap, intptr_t)); - break; - case 's': - if((s = va_arg(ap, char*)) == 0) - s = "(null)"; - for(; *s; s++) - consputc(*s); - break; - case '%': - consputc('%'); - break; - default: - // Print unknown % sequence to draw attention. - consputc('%'); - consputc(c); - break; - } - } - va_end(ap); - - if(locking) - release(&pr.lock); -} - -void panic(char *s) { - pr.locking = 0; - kprintf("panic: "); - kprintf(s); - kprintf("\n"); - panicked = 1; // freeze serial output from other CPUs - for(;;) - ; -} - -void kprintf_init(void) { - initlock(&pr.lock, "pr"); - pr.locking = 1; -} \ No newline at end of file diff --git a/laos/src/kernel/main.c b/laos/src/kernel/main.c deleted file mode 100644 index bfd4b9a..0000000 --- a/laos/src/kernel/main.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "la32r.h" -#include "spinlock.h" - - -volatile static int started = 0; - -void main() { - struct spinlock lck[1]; - initlock(lck, "main"); - acquire(lck); - - if (r_cpuid() == 0) { - - - synchronize(); - started = 1; - } else { - // 当前假定只有一个 hart - while (started == 0) - ; - synchronize(); - } - - -} \ No newline at end of file diff --git a/laos/src/kernel/proc.c b/laos/src/kernel/proc.c deleted file mode 100644 index be8cd1d..0000000 --- a/laos/src/kernel/proc.c +++ /dev/null @@ -1,24 +0,0 @@ -#include "proc.h" -#include "la32r.h" -#include "latype.h" - -struct cpu cpus[NCPU]; - -struct proc proc[NPROC]; - -struct proc *initproc; - -int nextpid = 1; -struct spinlock pid_lock; - -// helps ensure that wakeups of wait()ing -// parents are not lost. helps obey the -// memory model when using p->parent. -// must be acquired before any p->lock. -struct spinlock wait_lock; - -struct cpu *mycpu() { - int id = r_cpuid(); - struct cpu *c = &cpus[id]; - return c; -} \ No newline at end of file diff --git a/laos/src/kernel/spinlock.c b/laos/src/kernel/spinlock.c deleted file mode 100644 index c378221..0000000 --- a/laos/src/kernel/spinlock.c +++ /dev/null @@ -1,54 +0,0 @@ -#include "spinlock.h" -#include "la32r.h" -#include "defs.h" -#include "kprintf.h" -#include "proc.h" - -void initlock(struct spinlock *lck, char *name) { - lck->name = name; - lck->locked = 0; - lck->cpu = 0; -} - -void acquire(struct spinlock *lck) { - - if(holding(lck)) { - panic("acquire"); - } - - - do { - // 如果已经上锁了,就等待 - while (llw((intptr_t)&lck->locked) == 1) - ; - // 此时没有上锁,那就开始抢锁 - // 没有抢成功就进入新的循环 - } while (scw(1, (intptr_t)&lck->locked) != 1); - - synchronize(); - lck->cpu = mycpu(); -} - -void release(struct spinlock *lck) { - if (holding(lck) != 1) { - panic("release"); - } - - lck->cpu = NULL; - - synchronize(); - - do { - // 标记上 - llw((intptr_t)&lck->locked); - - // 此时没有 hart 动,那就安全的释放 - // 否则重新循环 - } while (scw(0, (intptr_t)&lck->locked) != 1); -} - -int holding(struct spinlock *lck) { - int r; - r = (lck->locked && lck->cpu == mycpu()); - return r; -} \ No newline at end of file diff --git a/laos/src/kernel/start.c b/laos/src/kernel/start.c deleted file mode 100644 index d699197..0000000 --- a/laos/src/kernel/start.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "kernel.h" -#include "la32r.h" - -__attribute__ ((aligned (16))) char stack0[4096 * NCPU]; - -void start() { - // 设置特权等级 - volatile u32 crmd_info = r_crmd(); - crmd_info = crmd_info & 0xfffffffc; - w_crmd(crmd_info); - - // ERTN 返回地址 - w_eentry((intptr_t)main); - - // 设置 tp - int id = r_cpuid(); - w_tp(id); - - asm volatile("ertn"); -} \ No newline at end of file diff --git a/laos/src/kernel/vm.c b/laos/src/kernel/vm.c deleted file mode 100644 index be20fda..0000000 --- a/laos/src/kernel/vm.c +++ /dev/null @@ -1 +0,0 @@ -extern char etext[]; \ No newline at end of file diff --git a/laos/src/lib/Makefile b/laos/src/lib/Makefile deleted file mode 100644 index 2bd2ce9..0000000 --- a/laos/src/lib/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -CURNAME := lib -BUILD_DIR := $(TOP_BUILD_DIR)/$(CURNAME) - -CSRC := $(wildcard *.c) -OBJS := $(patsubst %.c,%.o,$(CSRC)) -BUILD_OBJS := $(addprefix $(BUILD_DIR)/,$(OBJS)) - -.PHONY: build all message - -all: message build - -$(BUILD_DIR): - @mkdir -p $(BUILD_DIR) - -$(BUILD_OBJS): $(BUILD_DIR)/%.o:%.c $(BUILD_DIR) - @$(CC) -c -o $@ $< $(CPPFLAGS) $(CFLAGS) - -build: $(BUILD_OBJS) - -message: - @echo "building $(CURNAME)" \ No newline at end of file diff --git a/laos/src/lib/path.c b/laos/src/lib/path.c deleted file mode 100644 index e69de29..0000000 diff --git a/laos/src/user/Makefile b/laos/src/user/Makefile deleted file mode 100644 index 4ac8724..0000000 --- a/laos/src/user/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -CURNAME := user -BUILD_DIR := $(TOP_BUILD_DIR)/$(CURNAME) - -CSRC := $(wildcard *.c) -OBJS := $(patsubst %.c,%.o,$(CSRC)) -BUILD_OBJS := $(addprefix $(BUILD_DIR)/,$(OBJS)) -BASENAMES := $(basename $(CSRC)) -BUILD_EXE := $(addprefix $(BUILD_DIR)/,$(BASENAMES)) - -.PHONY: build all message - -all: message build - -$(BUILD_DIR): - @mkdir -p $(BUILD_DIR) - -$(BUILD_OBJS): $(BUILD_DIR)/%.o:%.c $(BUILD_DIR) - @$(CC) -c -o $@ $< $(CPPFLAGS) $(CFLAGS) - -$(BUILD_EXE): %:%.o - @$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) - -build: $(BUILD_EXE) - -message: - @echo "building $(CURNAME)" - -native: $(BUILD_EXE) - @echo $(BASENAMES) diff --git a/laos/src/user/echo.c b/laos/src/user/echo.c deleted file mode 100644 index 974152b..0000000 --- a/laos/src/user/echo.c +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - for (int i = 1; i < argc; i++) { - write(STDOUT_FILENO, argv[i], strlen(argv[i])); - if(i + 1 < argc){ - write(STDOUT_FILENO, " ", 1); - } else { - write(STDOUT_FILENO, "\n", 1); - } - } - exit(0); -} \ No newline at end of file diff --git a/laos/src/user/shell.c b/laos/src/user/shell.c deleted file mode 100644 index e69de29..0000000 diff --git a/laos/src/user/xargs.c b/laos/src/user/xargs.c deleted file mode 100644 index 172dbc6..0000000 --- a/laos/src/user/xargs.c +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include -#include -#include -#include - -void remove_tail_newline(char *str, int len) { - if (len == 0) { - return; - } - if (str[len - 1] == '\n') { - str[len - 1] = '\0'; - } -} - -int main(int argc, char *argv[]) { - if (argc < 1) { - exit(EXIT_FAILURE); - } - - char **args = malloc(argc * sizeof(char *)); - memcpy(args, &argv[1], (argc - 1) * sizeof(char *)); - argc -= 1; - - const char *filename = argv[1]; - char input[128]; - read(STDIN_FILENO, input, 128); - remove_tail_newline(input, strlen(input)); - - char *tok = strtok(input, " "); - while (tok) { - args = realloc(args, (argc + 1) * sizeof(char *)); - args[argc] = tok; - argc += 1; - tok = strtok(NULL, " "); - } - - if (fork() == 0) { - execvp(filename, args); - exit(EXIT_FAILURE); - } - - wait(NULL); - free(args); - - return 0; -} \ No newline at end of file diff --git a/laos/src/util/Makefile b/laos/src/util/Makefile deleted file mode 100644 index cc66e2f..0000000 --- a/laos/src/util/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -CURNAME := util -BUILD_DIR := $(TOP_BUILD_DIR)/$(CURNAME) - -CSRC := $(wildcard *.c) -OBJS := $(patsubst %.c,%.o,$(CSRC)) -BUILD_OBJS := $(addprefix $(BUILD_DIR)/,$(OBJS)) - -.PHONY: build all message - -all: message build - -$(BUILD_DIR): - @mkdir -p $(BUILD_DIR) - -$(BUILD_OBJS): $(BUILD_DIR)/%.o:%.c $(BUILD_DIR) - @$(CC) -c -o $@ $< $(CPPFLAGS) $(CFLAGS) - -build: $(BUILD_OBJS) - -message: - @echo "building $(CURNAME)" \ No newline at end of file diff --git a/laos/src/util/filepath.c b/laos/src/util/filepath.c deleted file mode 100644 index c491943..0000000 --- a/laos/src/util/filepath.c +++ /dev/null @@ -1,71 +0,0 @@ -#include "defs.h" - -// -// bnm should be large enough to hold basename -// -char *basename(char *bnm, const char *path) { - const char *p = path; - const char *last_slash = NULL; - while (*p) { - if (*p == '/' || *p == '\\') { - last_slash = p; - } - p++; - } - - char *q = bnm; - p = last_slash + 1; - while (*p) { - *q++ = *p++; - } - - return bnm; -} - -// -// noext should be large enough to hold no-ext name -// -char *rmext(char *noext, const char *fname) { - const char *p = fname; - const char *last_dot = NULL; - while (*p) { - if (*p == '.') { - last_dot = p; - } - p++; - } - - char *q = noext; - p = fname; - while (p != last_dot) { - *q++ = *p++; - } - - return noext; -} - - -// -// bnm should be large enough to hold bearname name -// -char *bearname(char *bnm, const char *fname) { - const char *p = fname; - const char *last_slash = NULL; - const char *last_dot = NULL; - while (*p) { - if (*p == '/' || *p == '\\') { - last_slash = p; - } else if (*p == '.') { - last_dot = p; - } - p++; - } - - char *q = bnm; - p = last_slash + 1; - while (p != last_dot) { - *q++ = *p++; - } - - return bnm; -} \ No newline at end of file diff --git a/laos/src/util/string.c b/laos/src/util/string.c deleted file mode 100644 index c758f27..0000000 --- a/laos/src/util/string.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "string.h" -#include "latype.h" - -// mem ops could be more better -// use loop unrolling - -void *memset(void *dst, int c, uint n) { - char *cdst = (char *) dst; - for (uint i = 0; i < n; ++i) { - cdst[i] = c; - } - return dst; -} - -int memcmp(const void *m1, const void *m2, uint n) { - const uchar *s1, *s2; - - s1 = m1; - s2 = m2; - - while (n --> 0) { - if(*s1 != *s2) - return *s1 - *s2; - s1++; - s2++; - } - - return 0; -} - -void *memmove(void *dst, const void *src, uint n) { - const char *s; - char *d; - - if(n == 0) - return dst; - - s = src; - d = dst; - if(s < d && s + n > d){ - s += n; - d += n; - while(n-- > 0) - *--d = *--s; - } else - while(n-- > 0) - *d++ = *s++; - - return dst; -} - -void *memcpy(void *dst, const void *src, uint n) { - return memmove(dst, src, n); -} - -int strncmp(const char *p, const char *q, uint n) { - while(n > 0 && *p && *p == *q) - n--, p++, q++; - if(n == 0) - return 0; - return (uchar)*p - (uchar)*q; -} - -char *strncpy(char *s, const char *t, int n) { - char *os; - - os = s; - while(n-- > 0 && (*s++ = *t++) != 0) - ; - while(n-- > 0) - *s++ = 0; - return os; -} - -char *strcpy_s(char *s, const char *t, int n) { - char *os; - - os = s; - if(n <= 0) - return os; - while(--n > 0 && (*s++ = *t++) != 0) - ; - *s = 0; - return os; -} - -int strlen(const char *s) { - int n; - - for(n = 0; s[n]; n++) - ; - return n; -} \ No newline at end of file diff --git a/lasim/include/la32r.hh b/lasim/include/la32r.hh deleted file mode 100644 index 464dfae..0000000 --- a/lasim/include/la32r.hh +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -class LA32R { -public: - LA32R(SystemBus *bus); - void Step(unsigned in); -}; \ No newline at end of file diff --git a/lasim/la32r.cc b/lasim/la32r.cc deleted file mode 100644 index abbc1dc..0000000 --- a/lasim/la32r.cc +++ /dev/null @@ -1,1009 +0,0 @@ -#include - -#include -#include -#include - -namespace { - -// -// ----- ----- new type defines ----- ----- -// - -using u64 = uint64_t; -using i64 = int64_t; - -using u32 = uint32_t; -using i32 = int32_t; - -// -// ----- ----- enum defines ----- ----- -// - -enum regenum { - R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, - R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, - R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, - R30, R31, PC -}; - -enum CSRADDR { - CRMD = 0x000, /* 当前模式信息 */ - PRMD = 0x001, /* 例外前模式信息 */ - EUEN = 0x002, /* 拓展部件使能 */ - ECFG = 0x004, /* 例外配置 */ - ESTAT = 0x005, /* 例外状态 */ - ERA = 0x006, /* 例外返回地址 */ - BADV = 0x007, /* 出错虚地址 */ - EENTRY = 0x00c, /* 例外地址入口 */ - TLBIDX = 0x010, /* TLB 索引 */ - TLBEHI = 0x011, /* TLB 表项高位 */ - TLBELO0 = 0x012, /* TLB 表项低位 0 */ - TLBELO1 = 0x013, /* TLB 表项低位 1 */ - ASID = 0x018, /* 地址空间标识符 */ - PGDL = 0x019, /* 低半地址空间全局目录基址 */ - PGDH = 0x01a, /* 高半地址空间全局目录基址 */ - PGD = 0x01b, /* 全局目录基址 */ - CPUID = 0x020, /* 处理器编号 */ - SAVE0 = 0x030, /* 数据保存 0*/ - SAVE1 = 0x031, /* 数据保存 1*/ - SAVE2 = 0x032, /* 数据保存 2 */ - SAVE3 = 0x033, /* 数据保存 3 */ - TID = 0x040, /* 定时器编号 */ - TCFG = 0x041, /* 定时器配置 */ - TVAL = 0x042, /* 定时器值 */ - TICLR = 0x044, /* 定时中断清除 */ - LLBCTL = 0x060, /* LLBit 控制 */ - TLBRENTRY = 0x088, /* TLB 重填例外入口 */ - CTAG = 0x098, /* 高速缓存标签 */ - DMW0 = 0x180, /* 直接映射配置窗口 0 */ - DMW1 = 0x181, /* 直接映射配置窗口 1 */ -}; - -enum CSRRDATTR { - CSR_RW, /* 软件可读写 */ - CSR_R, /* 软件只读 */ - CSR_R0, /* 软件只 `读 0` */ - CSR_W1, /* 软件读无意义,只 `写 1` */ -}; - -enum PLV { - PLV0 = 0, - // PLV1, - // PLV2, - PLV3 = 3, -}; - -enum SCOP { - SC_RDHI, - SC_RDLO, - SC_RDID, -}; - -enum TLBOP { - TLB_SRCH, - TLB_RD, - TLB_WR, - TLB_FILL, -}; - -enum DATAKIND { - BYTE, - HWORD, - WORD, - DWORD, -}; - -// -// ----- ----- customize constant defines ----- ----- -// - -constexpr u32 RSTVEC = 0x1c00'0000; -constexpr u32 IDXLEN = 16; -constexpr u32 PALEN = 36; -constexpr u32 TVALLEN = 31; - -static_assert(IDXLEN <= 16); // TLB idx 宽度 -static_assert(36 >= PALEN && 13 <= PALEN); // 页表物理页号长度 -static_assert(TVALLEN <= 32); // 计时器计数宽度 - -const char *regnames[] = { - [R0] = "zero", - [R1] = "ra", - [R2] = "tp", - [R3] = "sp", - [R4] = "a0", [R5] = "a1", - [R6] = "a2", [R7] = "a3", [R8] = "a4", [R9] = "a5", [R10] = "a6", [R11] = "a7", - [R12] = "t0", [R13] = "t1", [R14] = "t2", [R15] = "t3", [R16] = "t4", [R17] = "t5", [R18] = "t6", [R19] = "t7", [R20] = "t8", - [R21] = "r21", - [R22] = "fp/s9", - [R23] = "s0", [R24] = "s1", [R25] = "s2", [R26] = "s3", [R27] = "s4", [R28] = "s5", [R29] = "s6", [R30] = "s7", [R31] = "s8", -}; - -// -// ----- ----- struct defines ----- ----- -// - -struct CSRBaseInfo { - u32 data = 0x0; - u32 wmask = 0xffff'ffff; - u32 w1mask = 0x0; -}; - -// -// ----- ----- class defines ----- ----- -// - - -/** - * @bug no cached flag set -*/ -class Cache { -private: - // mem addr - // ------------------------------------------------------- - // | tag | idx 5bit | byte sel 5 bit | - // ------------------------------------------------------- - - // info - // ------------------------------------------------------- - // | | MAT | PLV | cached | dirty | - // ------------------------------------------------------- - using lane = u32[8]; - lane mem_ck1[32]; - u32 tags_ck1[32]; - u32 info_ck1[32]; - - lane mem_ck2[32]; - u32 tags_ck2[32]; - u32 info_ck2[32]; - - // common info - // ------------------------------------------------------- - // | | recent | - // ------------------------------------------------------- - // recent => 1: recent use blk1, 0: recent use blk2 - u32 info[32]; - - u32 load(u32 addr) { - auto word_sel = (addr >> 2) & 0b111; - auto idx = (addr >> 5) & 0b11111; - auto tag = addr >> 10; - - if (tags_ck1[idx] == tag) { - // 将 recent 为设置为 1 - info[idx] |= 0b1; - return mem_ck1[idx][word_sel]; - } else if (tags_ck2[idx] == tag) { - // 将 recent 为设置为 0 - info[idx] &= ~0b1; - return mem_ck2[idx][word_sel]; - } - - u32 laneaddr = addr << 10 | idx << 5; - u32 trans = 0; - - if (info[idx] & 0b1) { - // 最近使用块 1 - // 将块 2 替换下去 - - if (info_ck2[idx] & 0b1) { - u32 oldlaneaddr = tags_ck2[idx] << 10 | idx << 5; - for (size_t i = 0; i < 8; ++i) { - trans = mem_ck2[idx][i]; - sysbus->write32(trans, oldlaneaddr); - oldlaneaddr += 4; - } - } - - tags_ck2[idx] = tag; - - for (size_t i = 0; i < 8; ++i) { - sysbus->read32(trans, laneaddr); - mem_ck2[idx][i] = trans; - laneaddr += 4; - } - - // 将 recent 为设置为 0 - info[idx] &= ~0b1; - // 设置脏位 - info_ck1[idx] &= ~0b1; - - return mem_ck2[idx][word_sel]; - } else { - // 最近使用块 2 - // 将块 1 替换下去 - - if (info_ck1[idx] & 0b1) { - u32 oldlaneaddr = tags_ck1[idx] << 10 | idx << 5; - for (size_t i = 0; i < 8; ++i) { - trans = mem_ck1[idx][i]; - sysbus->write32(trans, oldlaneaddr); - oldlaneaddr += 4; - } - } - - tags_ck1[idx] = tag; - - for (size_t i = 0; i < 8; ++i) { - sysbus->read32(trans, laneaddr); - mem_ck1[idx][i] = trans; - laneaddr += 4; - } - - // 将 recent 为设置为 1 - info[idx] |= 0b1; - // 设置脏位 - info_ck1[idx] &= ~0b1; - - return mem_ck1[idx][word_sel]; - } - - } - - void store(u32 addr, u32 data, u32 bytemsk) { - auto word_sel = (addr >> 2) & 0b111; - auto idx = (addr >> 5) & 0b11111; - auto tag = addr >> 10; - - data = bytemsk & data; - - if (tags_ck1[idx] == tag) { - // 将 recent 为设置为 1 - info[idx] |= 0b1; - // 设置脏位 - info_ck1[idx] |= 0b1; - - mem_ck1[idx][word_sel] = data | (mem_ck1[idx][word_sel] & ~bytemsk); - return; - } else if (tags_ck2[idx] == tag) { - // 将 recent 为设置为 0 - info[idx] &= ~0b1; - // 设置脏位 - info_ck2[idx] |= 0b1; - - mem_ck2[idx][word_sel] = data | (mem_ck2[idx][word_sel] & ~bytemsk); - return; - } - - u32 laneaddr = addr << 10 | idx << 5; - u32 trans = 0; - - if (info[idx] & 0b1) { - // 最近使用块 1 - // 将块 2 替换下去 - - if (info_ck2[idx] & 0b1) { - u32 oldlaneaddr = tags_ck2[idx] << 10 | idx << 5; - for (size_t i = 0; i < 8; ++i) { - trans = mem_ck2[idx][i]; - sysbus->write32(trans, oldlaneaddr); - oldlaneaddr += 4; - } - } - - tags_ck2[idx] = tag; - - for (size_t i = 0; i < 8; ++i) { - sysbus->read32(trans, laneaddr); - mem_ck2[idx][i] = trans; - laneaddr += 4; - } - - // 将 recent 为设置为 0 - info[idx] &= ~0b1; - // 设置脏位 - info_ck2[idx] |= 0b1; - - mem_ck2[idx][word_sel] = data | (mem_ck2[idx][word_sel] & ~bytemsk); - } else { - // 最近使用块 2 - // 将块 1 替换下去 - - if (info_ck1[idx] & 0b1) { - u32 oldlaneaddr = tags_ck1[idx] << 10 | idx << 5; - for (size_t i = 0; i < 8; ++i) { - trans = mem_ck1[idx][i]; - sysbus->write32(trans, oldlaneaddr); - oldlaneaddr += 4; - } - } - - tags_ck1[idx] = tag; - - for (size_t i = 0; i < 8; ++i) { - sysbus->read32(trans, laneaddr); - mem_ck1[idx][i] = trans; - laneaddr += 4; - } - - // 将 recent 为设置为 1 - info[idx] |= 0b1; - // 设置脏位 - info_ck1[idx] |= 0b1; - - mem_ck1[idx][word_sel] = data | (mem_ck1[idx][word_sel] & ~bytemsk); - } - } - - void prefetch(u32 addr, u32 hint) { - auto word_sel = (addr >> 2) & 0b111; - auto idx = (addr >> 5) & 0b11111; - auto tag = addr >> 10; - - if (tags_ck1[idx] == tag) { - // 将 recent 为设置为 1 - info[idx] |= 0b1; - return; - } else if (tags_ck2[idx] == tag) { - // 将 recent 为设置为 0 - info[idx] &= ~0b1; - return; - } - - u32 laneaddr = addr << 10 | idx << 5; - u32 trans = 0; - - if (info[idx] & 0b1) { - // 最近使用块 1 - // 将块 2 替换下去 - - if (info_ck2[idx] & 0b1) { - u32 oldlaneaddr = tags_ck2[idx] << 10 | idx << 5; - for (size_t i = 0; i < 8; ++i) { - trans = mem_ck2[idx][i]; - sysbus->write32(trans, oldlaneaddr); - oldlaneaddr += 4; - } - } - - tags_ck2[idx] = tag; - - for (size_t i = 0; i < 8; ++i) { - sysbus->read32(trans, laneaddr); - mem_ck2[idx][i] = trans; - laneaddr += 4; - } - - // 将 recent 为设置为 0 - info[idx] &= ~0b1; - } else { - // 最近使用块 2 - // 将块 1 替换下去 - - if (info_ck1[idx] & 0b1) { - u32 oldlaneaddr = tags_ck1[idx] << 10 | idx << 5; - for (size_t i = 0; i < 8; ++i) { - trans = mem_ck1[idx][i]; - sysbus->write32(trans, oldlaneaddr); - oldlaneaddr += 4; - } - } - - tags_ck1[idx] = tag; - - for (size_t i = 0; i < 8; ++i) { - sysbus->read32(trans, laneaddr); - mem_ck1[idx][i] = trans; - laneaddr += 4; - } - - // 将 recent 为设置为 1 - info[idx] |= 0b1; - } - } -}; - -class Registers { -private: - u32 regs_[31] = {0}; - u32 pc_ = 0; - u32 _; - -public: - Registers() = default; - - void operator >> (u32 addr) { - pc_ = addr; - } - - const u32 &operator()(u32 idx) { - panicifnot((0 <= idx && 32 >= idx) || idx == PC); - if (idx == 0) { - return 0; - } - - if (idx == PC) { - return pc_; - } - - if (1 <= idx && 32 >= idx) { - return regs_[idx - 1]; - } - - panic("Unexpected register access"); - } - - u32 &operator[](u32 idx) { - _ = 0; - panicifnot(0 <= idx && 32 >= idx); - if (idx == 0) { - return _; - } - - if (1 <= idx && 32 >= idx) { - return regs_[idx - 1]; - } - - panic("Unexpected register access"); - } -}; - -// -// ----- ----- static values ----- ----- -// - -PLV PrivilegeLevel; - -Registers Regs; - -std::unordered_map CSRs; - -u64 stblcnt[4] = {0}; - -SystemBus *sysbus; - -// -// ----- ----- binary operations ----- ----- -// - -constexpr u32 gb(u32 hi, u32 lo, u32 data) { - panicifnot(hi >= lo); - - data = data >> lo; - u32 width = hi - lo + 1; - u32 mask = (u32)(~0) >> (32 - width); - return data & mask; -} - -constexpr u32 msk(u32 hi, u32 lo) { - panicifnot(hi >= lo); - - u32 width = hi - lo + 1; - u32 mask = (u32)(~0) >> (32 - width); - return mask << lo; -} - -constexpr u32 msk(u32 pos) { - return 0x1 << pos; -} - -constexpr u32 sext(u32 data, u32 width) { - u32 upper = 32 - width; - u32 result = (i32)(data << upper) >> upper; - return result; -} - -constexpr u32 sll(u32 data, u32 sa) { - if (sa == 0) - return data; - - return data << sa; -} - -constexpr u32 srl(u32 data, u32 sa) { - if (sa == 0) - return data; - - return data >> sa; -} - -constexpr u32 sra(u32 data, u32 sa) { - if (sa == 0) - return data; - - return (i32)data >> sa; -} - -constexpr u32 sb(u32 hi, u32 lo, u32 &data, u32 wdata) { - auto &&mask = msk(hi, lo); - auto &&rem = data & ~mask; - auto &&wr = (wdata << lo) & mask; - data = rem | wdata; - return data; -} - -constexpr u32 sb(u32 pos, u32 &data, u32 wdata) { - auto &&mask = msk(pos); - auto &&rem = data & ~mask; - auto &&wr = (wdata << pos) & mask; - data = rem | wdata; - return data; -} - -constexpr u32 rounddown(u32 data, u32 agn = 2) { - return (data >> agn) << agn; -} - -constexpr u32 roundfup(u32 data, u32 agn = 2) { - auto &&upper = gb(31, agn, data); - return (upper + 1) << agn; -} - -constexpr u32 roundup(u32 data, u32 agn = 2) { - auto &&upper = gb(31, agn, data); - auto &&lower = agn ? gb(agn - 1, 0, data) : 0; - return lower ? (upper + 1) << agn : upper << agn; -} - - -// -// ----- ----- unit test ----- ----- -// - -static_assert(gb(15, 0, 0xdead'beef) == 0x0000'beef); -static_assert(gb(31, 16, 0xdead'beef) == 0x0000'dead); - -static_assert(msk( 0, 0) == 0x0000'0001); -static_assert(msk(31, 0) == 0xffff'ffff); -static_assert(msk( 3, 0) == 0x0000'000f); -static_assert(msk(23, 12) == 0x00ff'f000); -static_assert(msk(31, 31) == 0x8000'0000); - -static_assert(msk( 0) == 0x0000'0001); -static_assert(msk( 1) == 0x0000'0002); -static_assert(msk( 2) == 0x0000'0004); -static_assert(msk(30) == 0x4000'0000); -static_assert(msk(31) == 0x8000'0000); - -static_assert(sext(0x0000'0001, 1) == 0xffff'ffff); -static_assert(sext(0x0000'0fff, 16) == 0x0000'0fff); -static_assert(sext(0x0000'dead, 16) == 0xffff'dead); -static_assert(sext(0x000f'dead, 20) == 0xffff'dead); - -static_assert(sll(0x1, 0) == 0x1); -static_assert(sll(0x1, 1) == 0x2); -static_assert(sll(0x1, 31) == 0x8000'0000); - -static_assert(srl(0x8000'0000, 0) == 0x8000'0000); -static_assert(srl(0x8000'0000, 1) == 0x4000'0000); -static_assert(srl(0x8000'0000, 31) == 0x1); - -static_assert(srl(0x8000'0000, 0) == 0x8000'0000); -static_assert(sra(0x8000'0000, 1) == 0xc000'0000); -static_assert(sra(0x8000'0000, 31) == 0xffff'ffff); - -// -// ----- ----- CSR Control ----- ----- -// - -#define CRMD_PLV 1, 0 -#define CRMD_IE 2 -#define CRMD_DA 3 -#define CRMD_PG 4 -#define CRMD_DATF 6, 5 -#define CRMD_DATM 8, 7 - -#define EUEN_FPE 0 - -#define ECFG_LIE_09_00 9, 0 -#define ECFG_LIE_12_11 12,11 - -#define ESTAT_IS_01_00 1, 0 -// #define ESTAT_IS_09_02 9, 2 -// #define ESTAT_IS_11 11 -// #define ESTAT_IS_12 12 -// #define ESTAT_Ecode 21,16 -// #define ESTAT_EsubCode 30,22 - -#define TCFG_En 0 -#define TCFG_Periodic 1 -#define TCFG_InitVal (TVALLEN - 1),2 - -#define LLBCTL_WCLLB 1 -#define LLBCTL_KLO 2 - -#define DMW_PLV0 0 -#define DMW_PLV3 3 -#define DMW_MAT 5, 4 -#define DMW_PSEG 27,25 -#define DMW_VSEG 31,29 - - - -// -// ----- ----- control logic functions ----- ----- -// - -void init_csr() { - CSRs.emplace(CRMD , CSRBaseInfo{ - .wmask = msk(8, 7) | msk(6, 5) | msk(4) | msk(3) | msk(2) | msk(1, 0), - }); - CSRs.emplace(PRMD , CSRBaseInfo{ - .wmask = msk(2) | msk(1, 0), - }); - CSRs.emplace(EUEN , CSRBaseInfo{ - .wmask = msk(0), - }); - CSRs.emplace(ECFG , CSRBaseInfo{ - .wmask = msk(12, 11) | msk(9, 0), - }); - CSRs.emplace(ESTAT , CSRBaseInfo{ - .wmask = msk(1, 0), - }); - CSRs.emplace(ERA , CSRBaseInfo{ - .wmask = msk(31, 0), - }); - CSRs.emplace(BADV , CSRBaseInfo{ - .wmask = msk(31, 0), - }); - CSRs.emplace(EENTRY , CSRBaseInfo{ - .wmask = msk(31, 6), - }); - CSRs.emplace(TLBIDX , CSRBaseInfo{ - .wmask = msk(31) | msk(29, 24) | msk(IDXLEN - 1, 0), - }); - CSRs.emplace(TLBEHI , CSRBaseInfo{ - .wmask = msk(31, 13), - }); - CSRs.emplace(TLBELO0 , CSRBaseInfo{ - .wmask = msk(31, 13), - }); - CSRs.emplace(TLBELO1 , CSRBaseInfo{ - .wmask = msk(PALEN - 5, 8) | msk(6) | msk(5, 4) | msk(3, 2) | msk(1) | msk(0), - }); - CSRs.emplace(ASID , CSRBaseInfo{ - .wmask = msk(9, 0), - }); - CSRs.emplace(PGDL , CSRBaseInfo{ - .wmask = msk(31, 12), - }); - CSRs.emplace(PGDH , CSRBaseInfo{ - .wmask = msk(31, 12), - }); - CSRs.emplace(PGD , CSRBaseInfo{ - .wmask = 0, - }); - CSRs.emplace(CPUID , CSRBaseInfo{ - .wmask = 0, - }); - CSRs.emplace(SAVE0 , CSRBaseInfo{ - .wmask = msk(31, 0), - }); - CSRs.emplace(SAVE1 , CSRBaseInfo{ - .wmask = msk(31, 0), - }); - CSRs.emplace(SAVE2 , CSRBaseInfo{ - .wmask = msk(31, 0), - }); - CSRs.emplace(SAVE3 , CSRBaseInfo{ - .wmask = msk(31, 0), - }); - CSRs.emplace(TID , CSRBaseInfo{ - .wmask = msk(31, 0), - }); - CSRs.emplace(TCFG , CSRBaseInfo{ - .wmask = msk(TVALLEN - 1, 2) | msk(1) | msk(0), - }); - CSRs.emplace(TVAL , CSRBaseInfo{ - .wmask = 0, - }); - CSRs.emplace(TICLR , CSRBaseInfo{ - .w1mask = msk(0), - }); - CSRs.emplace(LLBCTL , CSRBaseInfo{ - .wmask = msk(2), - .w1mask = msk(1), - }); - CSRs.emplace(TLBRENTRY , CSRBaseInfo{ - .wmask = msk(31, 6), - }); - CSRs.emplace(CTAG , CSRBaseInfo{ - .wmask = 0, - }); - CSRs.emplace(DMW0 , CSRBaseInfo{ - .wmask = msk(31, 29) | msk(27, 25) | msk(5, 4) | msk(3) | msk(0), - }); - CSRs.emplace(DMW1 , CSRBaseInfo{ - .wmask = msk(31, 29) | msk(27, 25) | msk(5, 4) | msk(3) | msk(0), - }); -} - -/** - * @brief 始终返回旧值 -*/ -u32 csr_wr(bool wen, u32 data, u32 addr) { - auto &&csr = CSRs.at(addr); - auto old = csr.data; - if (wen) { - auto &&wdata = data & (csr.wmask & ~csr.w1mask); - auto &&must1 = data & csr.w1mask ; - csr.data = wdata | must1; - } - return old; -} - -u32 stable_counter(bool rhi) { - auto &&tid = csr_wr(false, 0x0, TID); - return rhi ? stblcnt[tid] >> 32 : stblcnt[tid]; -} - -void exception_enter(u32 code) { - panic("Not implemented yet"); -} - -void exception_return() { - panic("Not implemented yet"); -} - -void exception_break(u32 code) { - panic("Not implemented yet"); -} - -void exception_syscall(u32 code) { - panic("Not implemented yet"); -} - -void cache_ctrl(u32 code, u32 addr) { - panic("Not implemented yet"); -} - -void tlb_ctrl(TLBOP opcode) { - panic("Not implemented yet"); -} - -void invtbl(u32 op, u32 asid, u32 vaddr) { - panic("Not implemented yet"); -} - -void idle_wait() { - panic("Not implemented yet"); -} - -u32 ll(u32 addr) { - panic("Not implemented yet"); -} - -u32 sc(u32 addr) { - panic("Not implemented yet"); -} - -u32 cache_visit(DATAKIND datakind, bool wen, u32 wdata, u32 addr) { - - if (wen) { - - } - panic("Not implemented yet"); -} - -u32 cache_prefetch(u32 hint, u32 addr) { - panic("Not implemented yet"); -} - -void inst_barrier(u32 hint) {} - -void data_barrier(u32 hint) {} - -// -// ----- ----- decode and execute ----- ----- -// - -bool check(const char *instfmt, u32 inst) { - size_t len = strlen(instfmt); - panicifnot(len >= 32); - - u32 hit = 0; - - // alert ! i should gt 0 not geq 0 - for (size_t i = len; i > 0; --i) { - auto idx = i - 1; - - if (std::tolower(instfmt[idx]) == 'x') { - inst >>= 1; - hit += 1; - continue; - } else if (instfmt[idx] == '0' && (inst & 0x1) == 0x0) { - inst >>= 1; - hit += 1; - continue; - } else if (instfmt[idx] == '1' && (inst & 0x1) == 0x1) { - inst >>= 1; - hit += 1; - continue; - } else if (strchr("'., ", instfmt[idx])) { - continue; - } - - return false; - } - - return hit == 32; -} - -#define BEGIN_CHECK() if (false) {} - -#define INST(str, instname, extracond, ...) \ -else if (check((str), (inst)) && (extracond)) { \ - curinst = #instname; \ - __VA_ARGS__; \ -} - - -u32 decode_and_exec(u32 inst, u32 curpc) { - - u32 nxtpc = curpc + 4; - - // These decode is fixed - u32 rd = gb( 4, 0, inst); - u32 rj = gb( 9, 5, inst); - u32 cj = gb( 7, 5, inst); - u32 rk = gb(14, 10, inst); - - - u32 ui5 = rk; - u32 ui12 = gb(21, 10, inst); - u32 si12 = sext(ui12, 12); - u32 si14 = sext(gb(23, 10, inst), 14); - u32 si20 = sext(gb(24, 5, inst), 20); - - u32 csraddr = gb(23, 10, inst); - - u32 offs_15_00 = gb(25, 10, inst); - u32 offs_20_16 = gb( 4, 0, inst); - u32 offs_25_16 = gb( 9, 0, inst); - - u32 offs16 = offs_15_00; - u32 offs21 = offs_20_16 << 16 | offs_15_00; - u32 offs26 = offs_25_16 << 16 | offs_15_00; - - u32 code = rk << 10 | rj << 5 | rd << 0; - u32 level = code; - u32 hint = code; - - u32 code5 = rd; - u32 hint5 = code5; - u32 op = code5; - - const char *curinst = nullptr; - - BEGIN_CHECK() - INST("00000000000000000'1100'0'xxxxx'00000", RDCNTID.W, gb(4, 0, inst) == 0, Regs[rj] = csr_wr(false, 0x0, TID)) - INST("00000000000000000'1100'0'00000'xxxxx", RDCNTVL.W, gb(9, 5, inst) == 0, Regs[rd] = stable_counter(false)) - INST("00000000000000000'1100'1'00000'xxxxx", RDCNTVH.W, gb(9, 5, inst) == 0, Regs[rd] = stable_counter(true )) - - INST("00000000000'100000'xxxxx'xxxxx'xxxxx", ADD.W, true, Regs[rd] = Regs(rj) + Regs(rk)) - INST("00000000000'100010'xxxxx'xxxxx'xxxxx", SUB.W, true, Regs[rd] = Regs(rj) - Regs(rk)) - INST("00000000000'100100'xxxxx'xxxxx'xxxxx", SLT, true, Regs[rd] = (i32)Regs(rj) < (i32)Regs(rk)) - INST("00000000000'100101'xxxxx'xxxxx'xxxxx", SLTU, true, Regs[rd] = Regs(rj) < Regs(rk)) - INST("00000000000'101000'xxxxx'xxxxx'xxxxx", NOR, true, Regs[rd] = ~(Regs(rj) | Regs(rk))) - INST("00000000000'101001'xxxxx'xxxxx'xxxxx", AND, true, Regs[rd] = Regs(rj) & Regs(rk)) - INST("00000000000'101010'xxxxx'xxxxx'xxxxx", OR, true, Regs[rd] = Regs(rj) | Regs(rk)) - INST("00000000000'101011'xxxxx'xxxxx'xxxxx", XOR, true, Regs[rd] = Regs(rj) ^ Regs(rk)) - INST("00000000000'101110'xxxxx'xxxxx'xxxxx", sll.W, true, Regs[rd] = sll(Regs(rj), gb(4, 0, Regs(rk)))) - INST("00000000000'101111'xxxxx'xxxxx'xxxxx", srl.W, true, Regs[rd] = srl(Regs(rj), gb(4, 0, Regs(rk)))) - INST("00000000000'110000'xxxxx'xxxxx'xxxxx", sra.W, true, Regs[rd] = sra(Regs(rj), gb(4, 0, Regs(rk)))) - INST("00000000000'111000'xxxxx'xxxxx'xxxxx", MUL.W, true, Regs[rd] = Regs(rj) * Regs(rk)) - INST("00000000000'111001'xxxxx'xxxxx'xxxxx", MULH.W, true, Regs[rd] = (u32)(((i64)(i32)Regs(rj) * (i64)(i32)Regs(rk)) >> 32)) - INST("00000000000'111010'xxxxx'xxxxx'xxxxx", MULH.WU, true, Regs[rd] = (u32)(((u64)Regs(rj) * (u64)Regs(rk)) >> 32)) - INST("0000000000'1000000'xxxxx'xxxxx'xxxxx", DIV.W, true, Regs[rd] = (i32)Regs(rj) / (i32)Regs(rk)) - INST("0000000000'1000001'xxxxx'xxxxx'xxxxx", MOD.W, true, Regs[rd] = (i32)Regs(rj) % (i32)Regs(rk)) - INST("0000000000'1000010'xxxxx'xxxxx'xxxxx", DIV.WU, true, Regs[rd] = Regs(rj) / Regs(rk)) - INST("0000000000'1000011'xxxxx'xxxxx'xxxxx", MOD.WU, true, Regs[rd] = Regs(rj) % Regs(rk)) - - INST("0000000000'1010100'xxxxx xxxxx xxxxx", BREAK, true, exception_break (code)) - INST("0000000000'1010110'xxxxx xxxxx xxxxx", SYSCALL, true, exception_syscall(code)) - - INST("000000000'10000'000'xxxxx'xxxxx'xxxxx", SLLI.W, true, Regs[rd] = sll(Regs(rj), ui5)) - INST("000000000'10000'001'xxxxx'xxxxx'xxxxx", SRLI.W, true, Regs[rd] = srl(Regs(rj), ui5)) - INST("000000000'10000'010'xxxxx'xxxxx'xxxxx", SRAI.W, true, Regs[rd] = sra(Regs(rj), ui5)) - - INST("000000'1000'xxxxxxx xxxxx'xxxxx'xxxxx", SLTI, true, Regs[rd] = (i32)Regs(rj) < (i32)si12) - INST("000000'1001'xxxxxxx xxxxx'xxxxx'xxxxx", SLTUI, true, Regs[rd] = Regs(rj) < si12) - INST("000000'1010'xxxxxxx xxxxx'xxxxx'xxxxx", ADDI.W, true, Regs[rd] = Regs(rj) + si12) - INST("000000'1101'xxxxxxx xxxxx'xxxxx'xxxxx", ANDI, true, Regs[rd] = Regs(rj) & ui12) - INST("000000'1110'xxxxxxx xxxxx'xxxxx'xxxxx", ORI, true, Regs[rd] = Regs(rj) | ui12) - INST("000000'1111'xxxxxxx xxxxx'xxxxx'xxxxx", XORI, true, Regs[rd] = Regs(rj) ^ ui12) - - INST("00000'100'xxxxxxxxxxxxxx'00000'xxxxx", CSRRD, gb(9, 5, inst) == 0, Regs[rd] = csr_wr(false, 0x0, csraddr)) - INST("00000'100'xxxxxxxxxxxxxx'00001'xxxxx", CSRWR, gb(9, 5, inst) == 1, Regs[rd] = csr_wr(true, Regs(rd), csraddr)) - INST("00000'100'xxxxxxxxxxxxxx'xxxxx'xxxxx", CSRXCHG, gb(9, 5, inst) > 1, Regs[rd] = csr_wr(true, Regs(rd) & Regs(rj), csraddr)) - - INST("00000'11000'xxxxxxxxxxxx'xxxxx'xxxxx", CACOP, true, cache_ctrl(code5, si12 + Regs[rj])) - - INST("00000'1100'1001000001'010'00000'00000", TLBSRCH, true, tlb_ctrl(TLB_SRCH)) - INST("00000'1100'1001000001'011'00000'00000", TLBRD, true, tlb_ctrl(TLB_RD )) - INST("00000'1100'1001000001'100'00000'00000", TLBWR, true, tlb_ctrl(TLB_WR )) - INST("00000'1100'1001000001'101'00000'00000", TLBFILL, true, tlb_ctrl(TLB_FILL)) - INST("00000'1100'1001000001'110'00000'00000", ERTN, true, exception_return()) - - INST("00000'1100'1001'0001'xxxxx xxxxx xxxxx", IDLE, true, idle_wait()) - INST("00000'1100'1001'0011'xxxxx'xxxxx'xxxxx", INVTLB, true, invtbl(op, Regs(rj), Regs(rk))) - - INST("000'1010'xxxxxxxxxxxxxxxxxxxx'xxxxx", LU12I.W, true, Regs[rd] = si20 << 12) - INST("000'1110'xxxxxxxxxxxxxxxxxxxx'xxxxx", PCADDU12I, true, Regs[rd] = si20 << 12 + curpc) - - INST("00'100000'xxxxxxxxxxxxxx'xxxxx'xxxxx", LL.W, true, Regs[rd] = ll((si14 << 2) + Regs[rj])) - INST("00'100001'xxxxxxxxxxxxxx'xxxxx'xxxxx", SC.W, true, Regs[rd] = sc((si14 << 2) + Regs[rj])) - - INST("00'10100000'xxxxxxxxxxxx'xxxxx'xxxxx", LD.B, true, Regs[rd] = sext(cache_visit(BYTE, false, 0x0, si12 + Regs[rj]), 8)) - INST("00'10100001'xxxxxxxxxxxx'xxxxx'xxxxx", LD.H, true, Regs[rd] = sext(cache_visit(BYTE, false, 0x0, si12 + Regs[rj]), 16)) - INST("00'10100010'xxxxxxxxxxxx'xxxxx'xxxxx", LD.W, true, Regs[rd] = cache_visit(BYTE, false, 0x0, si12 + Regs[rj]) ) - INST("00'10100100'xxxxxxxxxxxx'xxxxx'xxxxx", ST.B, true, cache_visit(BYTE, true, Regs[rd], si12 + Regs[rj])) - INST("00'10100101'xxxxxxxxxxxx'xxxxx'xxxxx", ST.H, true, cache_visit(BYTE, true, Regs[rd], si12 + Regs[rj])) - INST("00'10100110'xxxxxxxxxxxx'xxxxx'xxxxx", ST.W, true, cache_visit(BYTE, true, Regs[rd], si12 + Regs[rj])) - INST("00'10101000'xxxxxxxxxxxx'xxxxx'xxxxx", LD.BU, true, Regs[rd] = cache_visit(BYTE, false, 0x0, si12 + Regs[rj])) - INST("00'10101001'xxxxxxxxxxxx'xxxxx'xxxxx", LD.HU, true, Regs[rd] = cache_visit(BYTE, false, 0x0, si12 + Regs[rj])) - INST("00'10101011'xxxxxxxxxxxx'xxxxx'xxxxx", PRELD, true, cache_prefetch(hint5, si12 + Regs[rj])) - - INST("00'111000011100100'xxxxx xxxxx xxxxx", DBAR, true, data_barrier(hint)) - INST("00'111000011100101'xxxxx xxxxx xxxxx", IBAR, true, inst_barrier(hint)) - - INST("0'10011'xxxxxxxxxxxxxxxx'xxxxx'xxxxx", JIRL, true, Regs[rd] = curpc + 4; nxtpc = Regs[rj] + sext(offs16 << 2, 18)) - INST("0'10100'xxxxxxxxxxxxxxxx'xxxxx xxxxx", B, true, nxtpc = curpc + sext(offs26 << 2, 28)) - INST("0'10101'xxxxxxxxxxxxxxxx'xxxxx xxxxx", BL, true, Regs[R1] = curpc + 4; nxtpc = curpc + sext(offs26 << 2, 28)) - INST("0'10110'xxxxxxxxxxxxxxxx'xxxxx'xxxxx", BEQ, true, nxtpc = Regs(rj) == Regs(rd) ? curpc + sext(offs16 << 2, 18) : nxtpc) - INST("0'10111'xxxxxxxxxxxxxxxx'xxxxx'xxxxx", BNE, true, nxtpc = Regs(rj) != Regs(rd) ? curpc + sext(offs16 << 2, 18) : nxtpc) - INST("0'11000'xxxxxxxxxxxxxxxx'xxxxx'xxxxx", BLT, true, nxtpc = (i32)Regs(rj) < (i32)Regs(rd) ? curpc + sext(offs16 << 2, 18) : nxtpc) - INST("0'11001'xxxxxxxxxxxxxxxx'xxxxx'xxxxx", BGE, true, nxtpc = (i32)Regs(rj) >= (i32)Regs(rd) ? curpc + sext(offs16 << 2, 18) : nxtpc) - INST("0'11010'xxxxxxxxxxxxxxxx'xxxxx'xxxxx", BLTU, true, nxtpc = Regs(rj) < Regs(rd) ? curpc + sext(offs16 << 2, 18) : nxtpc) - INST("0'11011'xxxxxxxxxxxxxxxx'xxxxx'xxxxx", BGEU, true, nxtpc = Regs(rj) >= Regs(rd) ? curpc + sext(offs16 << 2, 18) : nxtpc) - - printf("%08x: %s\n", inst, curinst); - - return nxtpc; -} - -u32 fetch() { - u32 inst; - sysbus->read32(inst, Regs(PC)); - return inst; -} - -void reset() { - - auto &&crmd = CSRs.at(CRMD).data; - sb( CRMD_PLV, crmd, 0); - sb( CRMD_IE, crmd, 0); - sb( CRMD_DA, crmd, 1); - sb( CRMD_PG, crmd, 0); - sb(CRMD_DATF, crmd, 0); - sb(CRMD_DATM, crmd, 0); - - auto &&euen = CSRs.at(EUEN).data; - sb(EUEN_FPE, euen, 0); - - auto &&ecfg = CSRs.at(ECFG).data; - sb(ECFG_LIE_09_00, ecfg, 0); - sb(ECFG_LIE_12_11, ecfg, 0); - - auto &&estat = CSRs.at(ESTAT).data; - sb(ESTAT_IS_01_00, estat, 0); - - auto &&tcfg = CSRs.at(TCFG).data; - sb(TCFG_En, tcfg, 0); - - auto &&llbctl = CSRs.at(LLBCTL).data; - sb(LLBCTL_KLO, llbctl, 0); - - auto &&dmw0 = CSRs.at(DMW0).data; - sb(DMW_PLV0, dmw0, 0); - sb(DMW_PLV3, dmw0, 0); - - auto &&dmw1 = CSRs.at(DMW0).data; - sb(DMW_PLV0, dmw1, 0); - sb(DMW_PLV3, dmw1, 0); -} - -} - -LA32R::LA32R(SystemBus *bus) { - sysbus = bus; - init_csr(); - Regs >> RSTVEC; -} - -void LA32R::Step(unsigned in) { - u32 inst = fetch(); - auto &&nxtpc = decode_and_exec(inst, Regs(PC)); - Regs >> nxtpc; -} \ No newline at end of file diff --git a/lasim/main.cc b/lasim/main.cc deleted file mode 100644 index f1b478d..0000000 --- a/lasim/main.cc +++ /dev/null @@ -1,38 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - // if (argc < 2) { - // std::cout << "Usage: sim "; - // return 0; - // } - - SystemBus bus; - Memory ram(2 * 1024 * 1024); - Memory stk(256 * 1024); - - Memory flash(1024 * 1024); - flash.load("../laos/build/neula-os"); - ram.load(&flash, 0x0, flash.size()); - - bus.regdev(&ram, RAM_ADDR); - bus.regdev(&stk, STK_ADDR); - - Serial bios(1); - bus.regdev(&bios, SERIAL_PORT); - - auto cpu = new LA32R(&bus); - - while (true) { - cpu->Step(1); - } - - delete cpu; - return 0; -} \ No newline at end of file diff --git a/lavsim/main.cc b/lavsim/main.cc deleted file mode 100644 index 4576bd9..0000000 --- a/lavsim/main.cc +++ /dev/null @@ -1,43 +0,0 @@ -// DESCRIPTION: Verilator: Verilog example module -// -// This file ONLY is placed under the Creative Commons Public Domain, for -// any use, without warranty, 2017 by Wilson Snyder. -// SPDX-License-Identifier: CC0-1.0 -//====================================================================== - -// Include common routines -#include - -// Include model header, generated from Verilating "top.v" -#include "Vtop.h" - -int main(int argc, char** argv) { - // See a similar example walkthrough in the verilator manpage. - - // This is intended to be a minimal example. Before copying this to start a - // real project, it is better to start with a more complete example, - // e.g. examples/c_tracing. - - // Pass arguments so Verilated code can see them, e.g. $value$plusargs - // This needs to be called before you create any model - Verilated::commandArgs(argc, argv); - - // Construct the Verilated model, from Vtop.h generated from Verilating "top.v" - Vtop* top = new Vtop(); - - // Simulate until $finish - while (!Verilated::gotFinish()) { - - // Evaluate model - top->eval(); - } - - // Final model cleanup - top->final(); - - // Destroy model - delete top; - - // Return good completion status - return 0; -}