fix clang18; Wextra; lots of stuff

This commit is contained in:
quackerd 2024-10-04 01:55:19 -04:00
parent f92a26f9f7
commit db457ba1ba
54 changed files with 517 additions and 271 deletions

View File

@ -26,7 +26,7 @@ opts.AddVariables(
)
env = Environment(options = opts,
tools = ['default', 'compilation_db'],
tools = ['default', 'compilation_db', 'clang'],
ENV = os.environ)
Help(opts.GenerateHelpText(env))
@ -75,14 +75,14 @@ if env["WITH_GPROF"] == "1":
env.Append(CPPFLAGS = "-DBUILDTYPE=" + env["BUILDTYPE"])
if env["BUILDTYPE"] == "DEBUG":
env.Append(CPPFLAGS = [ "-g", "-DDEBUG", "-Wall", "-O2",
"-Wno-deprecated-declarations" ])
env.Append(CPPFLAGS = [ "-g", "-DDEBUG", "-Wall", "-Wextra", "-Werror", "-O2",
"-Wno-deprecated-declarations", "-Wno-unused-parameter" ])
env.Append(LINKFLAGS = [ "-g" ])
elif env["BUILDTYPE"] == "PERF":
env.Append(CPPFLAGS = [ "-g", "-DNDEBUG", "-Wall", "-O2"])
env.Append(CPPFLAGS = [ "-g", "-DNDEBUG", "-Wall", "-Wextra", "-Werror", "-O2", "-Wno-unused-parameter"])
env.Append(LDFLAGS = [ "-g" ])
elif env["BUILDTYPE"] == "RELEASE":
env.Append(CPPFLAGS = ["-DNDEBUG", "-Wall", "-O2"])
env.Append(CPPFLAGS = ["-DNDEBUG", "-Wall", "-Wextra", "-Werror", "-O2", "-Wno-unused-parameter"])
else:
print("Error BUILDTYPE must be RELEASE or DEBUG")
sys.exit(-1)
@ -150,8 +150,8 @@ if not conf.CheckCC():
print('Your C compiler and/or environment is incorrectly configured.')
CheckFailed()
if not env["CCVERSION"].startswith("15."):
print('Only Clang 15 is supported')
if not env["CCVERSION"].startswith("18."):
print('Only Clang 18 is supported')
print('You are running: ' + env["CCVERSION"])
# CheckFailed()

View File

@ -3,7 +3,7 @@
#include <time.h>
int
main(int argc, const char *argv[])
main(UNUSED int argc, UNUSED const char *argv[])
{
time_t t = time(NULL);
fputs(ctime(&t), stdout);

View File

@ -30,7 +30,7 @@ dumpPacket()
}
void
readPacket(NIC *nic)
readPacket(UNUSED NIC *nic)
{
uint64_t status;

View File

@ -13,7 +13,7 @@ static char buf[4096];
static MBuf mbuf;
void
writePacket(NIC *nic)
writePacket(UNUSED NIC *nic)
{
uint64_t status;
@ -37,7 +37,7 @@ writePacket(NIC *nic)
}
int
main(int argc, const char *argv[])
main(UNUSED int argc, UNUSED const char *argv[])
{
uint64_t status;
NIC nic;

View File

@ -1,6 +1,7 @@
#include <sys/cdefs.h>
int
main(int argc, const char *argv[])
main(UNUSED int argc, UNUSED const char *argv[])
{
return 1;
}

View File

@ -15,7 +15,7 @@
void DispatchCommand(char *buf);
int
main(int argc, const char *argv[])
main(UNUSED int argc, UNUSED const char *argv[])
{
char buf[256];
@ -30,7 +30,7 @@ main(int argc, const char *argv[])
}
void
Cmd_Help(int argc, const char *argv[])
Cmd_Help(UNUSED int argc, UNUSED const char *argv[])
{
printf("bkpt Trigger a kernel breakpoint\n");
printf("exit Exit shell\n");

View File

@ -1,6 +1,7 @@
#include <sys/cdefs.h>
int
main(int argc, const char *argv[])
main(UNUSED int argc, UNUSED const char *argv[])
{
return 0;
}

View File

@ -38,7 +38,7 @@ elif (env["ARCH"] == "arm64"):
src.append(src_arm64)
src.append(src_common)
libc_env.Append(CPPFLAGS = ['-nostdinc'])
libc_env.Append(CPPFLAGS = ['-nostdinc', "-Wno-sign-compare"])
libc_env.Append(CPPPATH = ['#build/include'])
libc_env.StaticLibrary("libc", src)

View File

@ -4,7 +4,7 @@
#include <syscall.h>
int
main(int argc, const char *argv[])
main(UNUSED int argc, UNUSED const char *argv[])
{
int i;
uint64_t status;

View File

@ -15,7 +15,9 @@ src.append(src_common)
src.append(env["CRTEND"])
init_env.Append(LINKFLAGS = ['-nostdlib'])
init_env.Append(CPPFLAGS = ['-nostdinc', '-mno-sse'])
if init_env["ARCH"] == "amd64":
init_env.Append(CPPFLAGS = ['-mno-sse'])
init_env.Append(CPPFLAGS = ['-nostdinc'])
init_env.Append(CPPPATH = ['#build/include'])
init_env.Append(LIBPATH = ['#build/lib/libc'], LIBS = ['c'])

View File

@ -2,7 +2,7 @@
#include <stdio.h>
#include <syscall.h>
int
main(int argc, const char *argv[])
main(UNUSED int argc, UNUSED const char *argv[])
{
uint64_t status;

View File

@ -55,6 +55,7 @@ src_arm64 = [
"arm64/trap.c",
"arm64/trapentry.S",
"arm64/gic.c",
"arm64/pdcache.c",
# Devices
"dev/arm64/uart.c",
# Metal
@ -111,13 +112,13 @@ src.append(src_common)
kern_env.Append(LINKFLAGS = ['-T', ldscript[1:], '-nostdlib'])
kern_env.Append(CPPFLAGS = ['-D_KERNEL'])
kern_env.Append(CPPFLAGS = ['-ffreestanding', '-fno-builtin', '-nostdinc',
'-mno-red-zone', '-std=c11', "-Wno-c2x-extensions"])
'-mno-red-zone', '-std=c2x', "-Wno-c2x-extensions"])
if env["ARCH"] == "amd64":
kern_env.Append(CPPFLAGS = ['-mno-mmx', '-mno-sse', '-mcmodel=large'])
# '-target', 'amd64-orion-eabi'
elif env["ARCH"] == "arm64":
kern_env.Append(CPPFLAGS = ['-mcmodel=large', '-arch', 'armv8.1+nofp'])
kern_env.Append(CPPFLAGS = ['-mcmodel=large'])
kern_env.Append(CPPPATH = ['#build/include'])

View File

@ -86,7 +86,7 @@ Debug_Breakpoint(TrapFrame *tf)
static void
Debug_Registers(int argc, const char *argv[])
{
TrapFrame *tf = frames[CPU()];
UNUSED TrapFrame *tf = frames[CPU()];
if (argc == 2) {
int cpuNo = Debug_StrToInt(argv[1]);
@ -104,7 +104,7 @@ REGISTER_DBGCMD(registers, "Show CPU registers", Debug_Registers);
static void
Debug_Backtrace(int argc, const char *argv[])
{
TrapFrame *tf = frames[CPU()];
UNUSED TrapFrame *tf = frames[CPU()];
uint64_t *ptr;
uint64_t rip;
uint64_t rbp;
@ -143,7 +143,7 @@ Debug_SetBreakpoint(int argc, const char *argv[])
return;
}
uint64_t addr = Debug_StrToInt(argv[1]);
UNUSED uint64_t addr = Debug_StrToInt(argv[1]);
kprintf("NOT IMPLEMENTED\n");
}
@ -151,7 +151,7 @@ Debug_SetBreakpoint(int argc, const char *argv[])
REGISTER_DBGCMD(bkpt, "Set breakpoint", Debug_SetBreakpoint);
static void
Debug_ClearBreakpoint(int argc, const char *argv[])
Debug_ClearBreakpoint(int argc, UNUSED const char *argv[])
{
if (argc != 2) {
kprintf("clrbkpt [0-3]");
@ -164,7 +164,7 @@ Debug_ClearBreakpoint(int argc, const char *argv[])
REGISTER_DBGCMD(clrbkpt, "Clear breakpoint", Debug_ClearBreakpoint);
static void
Debug_ListBreakpoints(int argc, const char *argv[])
Debug_ListBreakpoints(UNUSED int argc, UNUSED const char *argv[])
{
kprintf("NOT IMPLEMENTED\n");
}
@ -172,7 +172,7 @@ Debug_ListBreakpoints(int argc, const char *argv[])
REGISTER_DBGCMD(bkpts, "List breakpoint", Debug_ListBreakpoints);
static void
Debug_Reboot(int argc, const char *argv[])
Debug_Reboot(UNUSED int argc, UNUSED const char *argv[])
{
kprintf("NOT IMPLEMENTED\n");
}

View File

@ -1092,7 +1092,7 @@ db_print_address(const char *seg, int size, int rex, struct i_addr *addrp)
* and return updated location.
*/
static uintptr_t
db_disasm_esc(uintptr_t loc, int inst, int rex, int short_addr, int size, const char *seg)
db_disasm_esc(uintptr_t loc, int inst, int rex, int short_addr, UNUSED int size, const char *seg)
{
int regmodrm;
const struct finst * fp;
@ -1183,7 +1183,7 @@ db_disasm_esc(uintptr_t loc, int inst, int rex, int short_addr, int size, const
* next instruction.
*/
uintptr_t
db_disasm(uintptr_t loc, bool altfmt)
db_disasm(uintptr_t loc, UNUSED bool altfmt)
{
int inst;
int size;

View File

@ -309,7 +309,7 @@ gic_wakeup_redist(uint32_t rdid)
}
static int
gic_is_valid_extspi(uint32_t rd, uint32_t ID)
gic_is_valid_extspi(UNUSED uint32_t rd, uint32_t ID)
{
uint32_t max_spi;
// Check Ext SPI implemented

View File

@ -28,14 +28,6 @@
#define ROUNDUP_PGSIZE(x) (((x) + LARGE_PGSIZE - 1) & ~LARGE_PGMASK)
#define ROUNDDOWN_PGSIZE(x) ((x) & ~LARGE_PGMASK)
#define PAGETABLE_ENTRIES 512
typedef uint64_t PageEntry;
typedef struct PageTable {
PageEntry entries[PAGETABLE_ENTRIES];
} PageTable;
/* SCTLR_EL1 */
#define SCTLR_M 0x00000001 /* MMU Enable */
#define SCTLR_A 0x00000002 /* Alignment Check */

View File

@ -6,27 +6,43 @@
#ifndef __ARM64OP_H__
#define __ARM64OP_H__
static INLINE void enable_interrupts()
#include <stdint.h>
#include <sys/cdefs.h>
static ALWAYS_INLINE INLINE void enable_interrupts()
{
__asm__ volatile("msr daifclr, #(0x0002)\n");
}
static INLINE void disable_interrupts()
static ALWAYS_INLINE INLINE void disable_interrupts()
{
__asm__ volatile("msr daifset, #(0x0002)\n");
}
static INLINE void hlt()
static ALWAYS_INLINE INLINE void hlt()
{
__asm__ volatile("wfi");
}
static INLINE void pause()
static ALWAYS_INLINE INLINE void flushtlb()
{
uint64_t zero = 0;
__asm__ volatile (
"msr ttbr0_el1, %x0;"
"msr ttbr1_el1, %x0;"
"TLBI VMALLE1;"
:
: "r" (zero)
:
);
}
static ALWAYS_INLINE INLINE void pause()
{
__asm__ volatile("yield");
}
static INLINE void breakpoint()
static ALWAYS_INLINE INLINE void breakpoint()
{
__asm__ volatile("brk #0");
}

View File

@ -15,7 +15,7 @@
#if defined(IMPL_MROUTINE)
#undef IMPL_MROUTINE
#define IMPL_MROUTINE(name, exit_flag) void MCODE _ ## name ## _impl(void); \
#define IMPL_MROUTINE(name) int MCODE _ ## name ## _impl(void); \
__asm__ ( \
".section \"mcode\";" \
".globl " _METAL_STR(name) ";" \
@ -28,14 +28,15 @@
"mov x0, xzr;" \
"ldr x0,=_" _METAL_STR(name) "_impl;" \
"blr x0;" \
"ldr x0, [sp], #16;" \
"mov sp, x0;" \
METAL_MEXIT_GAS(exit_flag) \
"ldr x1, [sp], #16;" \
"mov sp, x1;" \
METAL_WMR_GAS(METAL_REG_MR0, AARCH_REG_X0) \
METAL_MEXIT_GAS(METAL_REG_MR0) \
); \
void MCODE _ ## name ## _impl(void)
int MCODE _ ## name ## _impl(void)
#endif
#define IMPL_SHORT_MROUTINE(name, exit_flag) void MCODE _ ## name ## _impl(void); \
#define IMPL_SHORT_MROUTINE(name) int MCODE _ ## name ## _impl(void); \
__asm__ ( \
".section \"mcode\";" \
".globl " _METAL_STR(name) ";" \
@ -44,9 +45,10 @@ void MCODE _ ## name ## _impl(void)
"mov x0, xzr;" \
"ldr x0,=_" _METAL_STR(name) "_impl;" \
"blr x0;" \
METAL_MEXIT_GAS(exit_flag) \
METAL_WMR_GAS(METAL_REG_MR0, AARCH_REG_X0) \
METAL_MEXIT_GAS(METAL_REG_MR0) \
); \
void MCODE _ ## name ## _impl(void)
int MCODE _ ## name ## _impl(void)
#define DECL_MVAR(type, name) type MDATA name
#define DECL_MVAR_ALIGNED(type, name, align) type ALIGNED(align) MDATA name

View File

@ -128,18 +128,20 @@ extern "C" {
); \
} while(0)
#define METAL_MEXIT_ENCODING(flags) (0xd61f2400 | ((flags) << 0))
#define METAL_MEXIT_GAS(flags) METAL_GAS_ENCODE(METAL_MEXIT_ENCODING(flags))
#define METAL_MEXIT(flags) do { \
#define METAL_MEXIT_ENCODING(mreg) (0xd61f2400 | ((mreg) << 0))
#define METAL_MEXIT_GAS(mreg) METAL_GAS_ENCODE(METAL_MEXIT_ENCODING(mreg))
#define METAL_MEXIT(mreg) do { \
__asm__ volatile ( \
METAL_MEXIT_GAS(flags) \
METAL_MEXIT_GAS(mreg) \
: \
: \
: \
); } while(0)
#define MEXIT_FLAG_IIM (1 << 1) // this mexit masks instruction intercept for the instruction returned to
#define MEXIT_FLAG_RFI (1 << 0) // this mexit is a return from intercept (also restores CPSR from MSPSR)
#define MEXIT_FLAG_IIM (1 << 2) // this mexit masks instruction intercept for the first instruction after mexit
#define MEXIT_FLAG_RFI (1 << 1) // this mexit is a return from intercept (also restores CPSR from MSPSR)
#define MEXIT_FLAG_ID (1 << 0) // this mexit masks interrupts for the first instruction after mexit
#define MEXIT_FLAG_EIM (1 << 3) // this mexit masks exception intercept for the first instruction after mexit
// do not provide C version of RAR/WAR for the current bank
// can't decide which GP register to use as temp
@ -311,16 +313,17 @@ extern "C" {
METAL_RMR(METAL_REG_MO0 + idx, var); \
} while(0)
#define DECL_MROUTINE(name) void __attribute__((aligned(16))) name(void)
#define IMPL_MROUTINE(name, exit_flag) void _ ## name ## _impl(void); \
#define DECL_MROUTINE(name) int __attribute__((aligned(16))) name(void)
#define IMPL_MROUTINE(name) int _ ## name ## _impl(void); \
__asm__ ( \
".globl " _METAL_STR(name) ";" \
".balign 16;" \
_METAL_STR(name) ":;" \
"bl _" _METAL_STR(name) "_impl;" \
METAL_MEXIT_GAS(exit_flag) \
METAL_WMR_GAS(METAL_REG_MR0, AARCH_REG_X0) \
METAL_MEXIT_GAS(METAL_REG_MR0) \
); \
void _ ## name ## _impl(void)
int _ ## name ## _impl(void)
// mroutine table defs
@ -372,12 +375,14 @@ struct exc_intercept_table {
typedef uint64_t regval_t;
typedef regval_t msr_t;
#define METAL_MSR_MASK_INIT (1ul << 63)
#define METAL_MSR_MASK_II (1ul << 62)
#define METAL_MSR_MASK_IM (1ul << 61)
#define METAL_MSR_MASK_LV (0xfful)
#define METAL_MSR_MASK_EI (1ul << 60)
#define METAL_MSR_MASK_PD (1ul << 59)
#define METAL_MSR_MASK_INIT (1ull << 63)
#define METAL_MSR_MASK_II (1ull << 62)
#define METAL_MSR_MASK_IM (1ull << 61)
#define METAL_MSR_MASK_EI (1ull << 60)
#define METAL_MSR_MASK_EM (1ull << 59)
#define METAL_MSR_MASK_PD (1ull << 58)
#define METAL_MSR_MASK_ID (1ull << 57)
#define METAL_MSR_MASK_LV (0xffull)
#ifdef __cplusplus
}

View File

@ -1,12 +1,16 @@
#pragma once
#include "machine/metalp.h"
#include <machine/metal.h>
DECL_MROUTINE(mrt_init);
#define MRT_INIT_IDX (1)
DECL_MROUTINE(mrt_pf_handler);
#define MRT_PF_HANDLER_IDX (2)
DECL_MROUTINE(mrt_pf_itlb_handler);
#define MRT_PF_ITLB_HANDLER_IDX (2)
DECL_MROUTINE(mrt_pf_dtlb_handler);
#define MRT_PF_DTLB_HANDLER_IDX (3)
DECL_MROUTINE(mrt_dummy);
@ -14,7 +18,7 @@ DECL_MROUTINE(mrt_dummy);
// int mrt_set_mptb(int ptbidx, regval_t val);
//
DECL_MROUTINE(mrt_set_mptb);
#define MRT_SET_MPTB_IDX (3)
#define MRT_SET_MPTB_IDX (4)
#define MRT_SET_MPTB_USER (0)
#define MRT_SET_MPTB_DMAP (1)
#define MRT_SET_MPTB_XMEM (2)
@ -27,9 +31,13 @@ DECL_MROUTINE(mrt_set_mptb);
// void mrt_set_mtp(regval_t mtp);
//
DECL_MROUTINE(mrt_set_mtp);
#define MRT_SET_MTP_IDX (4)
#define MRT_SET_MTP_IDX (5)
#define MRT_SET_MTP_ARG_MTP (0)
DECL_MROUTINE(mrt_wfi);
#define MRT_WFI_IDX (6)
extern DECL_MVAR(struct mroutine_table, mtl_mrt_tbl);
extern DECL_MVAR(struct exc_intercept_table, mtl_exc_tbl);

View File

@ -3,9 +3,6 @@
#include <machine/pmap.h>
#include <sys/types.h>
// 2048 buckets * 8 bytes / bucket = 16KB per page tbl = smallest page size
#define VM_PTBUCKETS (2048)
// 1GB page ident map region
#define REGION_DMAP_PGSHIFT (30)
// 16K page userspace
@ -21,10 +18,13 @@ struct vmpte {
};
_Static_assert(sizeof(struct vmpte) == 8);
#define VM_PTBUCKETS (PGSIZE / sizeof(struct vmpte))
struct vmpt {
struct vmpte entries[VM_PTBUCKETS];
};
_Static_assert(sizeof(struct vmpt) == VM_PTBUCKETS * sizeof(struct vmpte));
_Static_assert(sizeof(struct vmpt) == PGSIZE);
//
// Page Table Entry (must be 8 bytes aligned)

View File

@ -0,0 +1,7 @@
#pragma once
struct vmpd * pdcache_alloc();
void pdcache_free(struct vmpd * pd);
void pdcache_init();

View File

@ -57,9 +57,9 @@
typedef struct AS
{
PageTable *root;
uint64_t tables;
uint64_t mappings;
struct vmpt *xmem_tbl;
struct vmpt *dmap_tbl;
struct vmpt *user_tbl;
} AS;
void PMap_Init();
@ -79,7 +79,7 @@ bool PMap_AllocMap(AS *as, uint64_t virt, uint64_t len, uint64_t flags);
bool PMap_Unmap(AS *as, uint64_t virt, uint64_t pages);
// Manipulate Kernel Memory
void PMap_SystemLookup(uint64_t va, PageEntry **entry, int size);
// void PMap_SystemLookup(uint64_t va, PageEntry **entry, int size);
bool PMap_SystemLMap(uint64_t phys, uint64_t virt, uint64_t lpages, uint64_t flags);
bool PMap_SystemMap(uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags);
bool PMap_SystemUnmap(uint64_t virt, uint64_t pages);

View File

@ -21,7 +21,10 @@
#include <sys/elf64.h>
#include "../dev/console.h"
#include "machine/cpuop.h"
#include <machine/cpuop.h>
#include <machine/metal.h>
#include <machine/mrt.h>
#include <machine/pdcache.h>
extern void KTime_Init();
extern void KTimer_Init();
@ -64,7 +67,7 @@ Machine_EarlyInit()
}
static void
Machine_IdleThread(void *test)
Machine_IdleThread(UNUSED void *test)
{
while (1) { enable_interrupts(); hlt(); }
}
@ -79,9 +82,6 @@ Machine_IdleThread(void *test)
void Machine_Init()
{
Machine_EarlyInit();
/*
* Initialize Processor State
*/
if (gic_init() != 0) {
PANIC("gic initialization failed!\n");
@ -103,14 +103,15 @@ void Machine_Init()
while(1){
hlt();
};
}
//Machine_SyscallInit();
Machine_SyscallInit();
/*
* Initialize Memory Allocation and Virtual Memory
*/
PAlloc_AddRegion(DMPA2VA(16*1024*1024), 16*1024*1024);
pdcache_init();
PMap_Init();
XMem_Init();
PAlloc_LateInit();
@ -120,7 +121,7 @@ void Machine_Init()
* Initialize Time Keeping
*/
KTime_Init();
RTC_Init(); // Finishes initializing KTime
//RTC_Init(); // Finishes initializing KTime
/*
* Initialize Interrupts

View File

@ -29,7 +29,7 @@ static uintptr_t memRegionLen[MAX_REGIONS];
static int memRegionIdx;
void
MachineBoot_Entry(unsigned long magic, unsigned long addr)
MachineBoot_Entry(UNUSED unsigned long magic, UNUSED unsigned long addr)
{
// initialize metal mode
mtl_init();

View File

@ -162,14 +162,14 @@ MP_CrossCall(CrossCallCB cb, void *arg)
}
static int
MPPing(void *arg)
MPPing(UNUSED void *arg)
{
//kprintf("CPU %d Ack\n", CPU());
return 0;
}
static void
Debug_CrossCall(int argc, const char *argv[])
Debug_CrossCall(UNUSED int argc, UNUSED const char *argv[])
{
int i;
UnixEpochNS startTS, stopTS;
@ -190,7 +190,7 @@ Debug_CrossCall(int argc, const char *argv[])
REGISTER_DBGCMD(crosscall, "Ping crosscall", Debug_CrossCall);
static void
Debug_CPUS(int argc, const char *argv[])
Debug_CPUS(UNUSED int argc, UNUSED const char *argv[])
{
int c;
@ -204,7 +204,7 @@ Debug_CPUS(int argc, const char *argv[])
REGISTER_DBGCMD(cpus, "Show MP information", Debug_CPUS);
static void
Debug_CPU(int argc, const char *argv[])
Debug_CPU(UNUSED int argc, UNUSED const char *argv[])
{
kprintf("CPU %d\n", CPU());
}

View File

@ -1,4 +1,5 @@
#include "machine/metalp.h"
#include <machine/metal.h>
#include <machine/mrt.h>
#include <string.h>
@ -8,11 +9,28 @@ DECL_MVAR(struct inst_intercept_table, mtl_inst_tbl);
#define METAL_BOOTSTACK_SZ (4096)
DECL_MVAR_ALIGNED(static char, mtl_bootstack[METAL_BOOTSTACK_SZ], METAL_BOOTSTACK_SZ);
IMPL_SHORT_MROUTINE(mrt_dummy, 0)
IMPL_SHORT_MROUTINE(mrt_dummy)
{
return 0;
}
IMPL_SHORT_MROUTINE(mrt_init, 0)
IMPL_SHORT_MROUTINE(mrt_wfi)
{
unsigned int times;
METAL_MROUTINE_GETARG(0, times);
while (times > 0) {
__asm__ volatile (
"wfi;"
:
:
:
);
times--;
}
return 0;
}
IMPL_SHORT_MROUTINE(mrt_init)
{
memset(&mtl_mrt_tbl, 0, sizeof(mtl_mrt_tbl));
memset(&mtl_exc_tbl, 0, sizeof(mtl_exc_tbl));
@ -21,57 +39,59 @@ IMPL_SHORT_MROUTINE(mrt_init, 0)
// mroutine 0 - 8
mtl_mrt_tbl.entries[0] = MROUTINE_ENTRY_MAKE(mrt_dummy, 1);
mtl_mrt_tbl.entries[MRT_INIT_IDX] = MROUTINE_ENTRY_MAKE(mrt_init, 1);
mtl_mrt_tbl.entries[MRT_PF_HANDLER_IDX] = MROUTINE_ENTRY_MAKE(mrt_pf_handler, 1);
mtl_mrt_tbl.entries[MRT_PF_DTLB_HANDLER_IDX] = MROUTINE_ENTRY_MAKE(mrt_pf_dtlb_handler, 1);
mtl_mrt_tbl.entries[MRT_PF_ITLB_HANDLER_IDX] = MROUTINE_ENTRY_MAKE(mrt_pf_itlb_handler, 1);
mtl_mrt_tbl.entries[MRT_SET_MPTB_IDX] = MROUTINE_ENTRY_MAKE(mrt_set_mptb, 1);
mtl_mrt_tbl.entries[MRT_SET_MTP_IDX] = MROUTINE_ENTRY_MAKE(mrt_set_mtp, 1);
mtl_mrt_tbl.entries[MRT_WFI_IDX] = MROUTINE_ENTRY_MAKE(mrt_wfi, 1);
mtl_exc_tbl.entries[0].esrbits = (0b100100 << 26) | (0b00100); // data abort, lv0 translation
mtl_exc_tbl.entries[0].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[0].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[0].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_DTLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[1].esrbits = (0b100100 << 26) | (0b00101); // data abort, lv1 translation
mtl_exc_tbl.entries[1].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[1].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[1].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_DTLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[2].esrbits = (0b100100 << 26) | (0b00110); // data abort, lv2 translation
mtl_exc_tbl.entries[2].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[2].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[2].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_DTLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[3].esrbits = (0b100100 << 26) | (0b00111); // data abort, lv3 translation
mtl_exc_tbl.entries[3].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[3].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[3].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_DTLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[4].esrbits = (0b100001 << 26) | (0b00100); // inst abort, lv0 translation
mtl_exc_tbl.entries[4].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[4].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[4].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_ITLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[5].esrbits = (0b100001 << 26) | (0b00101); // inst abort, lv1 translation
mtl_exc_tbl.entries[5].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[5].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[5].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_ITLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[6].esrbits = (0b100001 << 26) | (0b00110); // inst abort, lv2 translation
mtl_exc_tbl.entries[6].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[6].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[6].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_ITLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[7].esrbits = (0b100001 << 26) | (0b00111); // inst abort, lv3 translation
mtl_exc_tbl.entries[7].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[7].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[7].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_ITLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[8].esrbits = (0b100101 << 26) | (0b00100); // data abort, lv0 translation
mtl_exc_tbl.entries[8].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[8].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[8].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_DTLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[9].esrbits = (0b100101 << 26) | (0b00101); // data abort, lv1 translation
mtl_exc_tbl.entries[9].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[9].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[9].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_DTLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[10].esrbits = (0b100101 << 26) | (0b00110); // data abort, lv2 translation
mtl_exc_tbl.entries[10].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[10].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[10].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_DTLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[11].esrbits = (0b100101 << 26) | (0b00111); // data abort, lv3 translation
mtl_exc_tbl.entries[11].esrmask = (0b111111 << 26) | (0b11111);
mtl_exc_tbl.entries[11].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
mtl_exc_tbl.entries[11].ctrl = EXC_INTERCEPT_MAKE_CTRL(MRT_PF_DTLB_HANDLER_IDX, EXC_INTERCEPT_MODE_SYNC, 1);
// load mroutine table
void* tbl_addr = &mtl_mrt_tbl;
@ -94,4 +114,6 @@ IMPL_SHORT_MROUTINE(mrt_init, 0)
// temporary metal stack
regval_t mstk = (regval_t)&mtl_bootstack[METAL_BOOTSTACK_SZ];
METAL_WMR(METAL_REG_MSTK, mstk);
return 0;
}

View File

@ -51,12 +51,16 @@ vmm_get_pd(paddr_t ptb, unsigned int pgshift, vaddr_t uva, paddr_t * out)
METAL_PLDR64(cur, pte + offsetof(struct vmpte, first));
vaddr_t curvaddr;
uint64_t attr;
while (cur != (paddr_t)NULL) {
METAL_PLDR64(curvaddr, cur + offsetof(struct vmpd, vaddr));
if (vm_get_pfn(curvaddr, pgshift) == pfn) {
METAL_PLDR64(attr, cur + offsetof(struct vmpd, attr));
if (attr & VMPD_ATTR_P) {
*out = cur;
return 0;
}
}
METAL_PLDR64(cur, cur + offsetof(struct vmpd, next));
}
@ -72,7 +76,7 @@ vmm_get_pd(paddr_t ptb, unsigned int pgshift, vaddr_t uva, paddr_t * out)
// 0 if success
//
static MCODE int
vmm_map_page(vaddr_t uva)
vmm_map_page(vaddr_t uva, int itlb)
{
int status;
paddr_t ptb;
@ -126,7 +130,7 @@ vmm_map_page(vaddr_t uva)
#define MAIR_NORMAL (0b11111111ul)
#define MAIR_DEV (0b0ul)
const regval_t extIAttrs =
(1 << 0) | // itlb
((itlb & 0x1) << 0) | // itlb
(0b01 << 1) | // el1
(0b11 << 3) | // translv = 3
(0b00 << 5) | // 4k page
@ -144,35 +148,37 @@ vmm_map_page(vaddr_t uva)
METAL_WMR(METAL_REG_MR2, pgvaddr);
METAL_WTLB(METAL_REG_MR0, METAL_REG_MR1, METAL_REG_MR2);
const regval_t extDAttrs =
(0 << 0) | // dtlb
(0b01 << 1) | // el1
(0b11 << 3) | // translv = 3
(0b00 << 5) | // 4k page
(0x0 << 7) | // asid = 0
(0 << 23) | // hyp = 0
(0 << 24) | // vmid
(1ul << 40) | // ao = 1
((regval_t)aoid << 41) | // aoid
((dev ? MAIR_DEV : MAIR_NORMAL) << 43) | // mair
(1ul << 51) | // ns = 0
(1ul << 52); // nstid = 1
METAL_WMR(METAL_REG_MR1, extDAttrs);
METAL_WTLB(METAL_REG_MR0, METAL_REG_MR1, METAL_REG_MR2);
return 0;
}
// flag: skip exception intercept on the next instruction upon mreturn
IMPL_MROUTINE(mrt_pf_handler, 1)
IMPL_MROUTINE(mrt_pf_dtlb_handler)
{
vaddr_t vaddr;
METAL_RMR(METAL_REG_MER2, vaddr);
vmm_map_page(vaddr);
if (vmm_map_page(vaddr, false) == 0) {
// on successful translation just RFI
return MEXIT_FLAG_RFI;
} else {
// unsuccessful, cascade to the OS
return MEXIT_FLAG_RFI | MEXIT_FLAG_ID | MEXIT_FLAG_EIM;
}
}
IMPL_MROUTINE(mrt_set_mptb, 0)
IMPL_MROUTINE(mrt_pf_itlb_handler)
{
vaddr_t vaddr;
METAL_RMR(METAL_REG_MER2, vaddr);
if (vmm_map_page(vaddr, true) == 0) {
return MEXIT_FLAG_RFI;
} else {
return MEXIT_FLAG_RFI | MEXIT_FLAG_ID | MEXIT_FLAG_EIM;
}
}
IMPL_MROUTINE(mrt_set_mptb)
{
unsigned int idx;
int ret = 0;
@ -199,12 +205,16 @@ IMPL_MROUTINE(mrt_set_mptb, 0)
}
METAL_MROUTINE_SETRET(0, ret);
return 0;
}
IMPL_MROUTINE(mrt_set_mtp, 0)
IMPL_MROUTINE(mrt_set_mtp)
{
uint64_t mtp;
METAL_MROUTINE_GETARG(0, mtp);
METAL_WMR(METAL_REG_MTP, mtp);
return 0;
}

View File

@ -82,13 +82,5 @@ void paging_init()
// reset page tables
uint64_t zero = 0;
__asm__ volatile (
"msr ttbr0_el1, %x0;"
"msr ttbr1_el1, %x0;"
"TLBI VMALLE1;"
:
: "r" (zero)
:
);
flushtlb();
}

View File

@ -20,8 +20,8 @@ PCIGetAddr(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
uint8_t
PCICfgRead8(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
{
uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
return 0;
}
@ -29,8 +29,8 @@ PCICfgRead8(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
uint16_t
PCICfgRead16(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
{
uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x2);
UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x2);
ASSERT((reg & 0x1) == 0);
@ -40,8 +40,8 @@ PCICfgRead16(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
uint32_t
PCICfgRead32(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
{
uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE;
UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
UNUSED uint16_t port = PCI_PORT_DATABASE;
ASSERT((reg & 0x3) == 0);
@ -50,28 +50,28 @@ PCICfgRead32(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
void
PCICfgWrite8(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg,
uint8_t data)
UNUSED uint8_t data)
{
uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
}
void
PCICfgWrite16(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg,
uint16_t data)
UNUSED uint16_t data)
{
uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
}
void
PCICfgWrite32(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg,
uint32_t data)
UNUSED uint32_t data)
{
uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
}

131
sys/arm64/pdcache.c Normal file
View File

@ -0,0 +1,131 @@
#include <errno.h>
#include <string.h>
#include <sys/kassert.h>
#include <sys/kmem.h>
#include <machine/paging.h>
#include <machine/pmap.h>
#include <sys/thread.h>
#include <sys/mutex.h>
#include <sys/spinlock.h>
struct pdcache_info {
void * next;
};
_Static_assert(sizeof(struct pdcache_info) <= sizeof(struct vmpd));
struct pdcache_desc {
struct pdcache_info * first;
unsigned long free;
unsigned long total;
Spinlock lock;
};
static struct pdcache_desc pdc;
static int
pdcache_init_region(void * region, unsigned long len, struct pdcache_info ** outf, struct pdcache_info ** outl, unsigned long * free)
{
if (len < sizeof(struct vmpd)) {
return ENOMEM;
}
unsigned long count = 0;
struct pdcache_info * first = NULL, * last = NULL;
while (true) {
if (len < sizeof(struct vmpd)) {
break;
}
len = len - sizeof(struct vmpd);
struct pdcache_info * info = (struct pdcache_info *)(region + len);
if (last == NULL) {
last = info;
}
info->next = first;
first = info;
count++;
}
*outf = first;
*outl = last;
*free = count;
return 0;
}
static int
pdcache_grow()
{
ASSERT(Spinlock_IsHeld(&pdc.lock));
void * page = PAlloc_AllocPage();
if (page == NULL) {
return ENOMEM;
}
struct pdcache_info * first, * last;
unsigned long free;
int ret;
// initialize the page
if ((ret = pdcache_init_region(page, (1 << PGSHIFT), &first, &last, &free)) != 0) {
return ret;
}
pdc.free += free;
last->next = pdc.first;
pdc.first = first;
pdc.total += free;
kprintf("Growing pdcache: +%d nodes, total: %d nodes.\n", free, pdc.total);
return 0;
}
// allocates a new pd and returns its vaddr
struct vmpd *
pdcache_alloc()
{
Spinlock_Lock(&pdc.lock);
if (pdc.free == 0) {
// we ran out
if (pdcache_grow() != 0) {
return NULL;
}
}
ASSERT(pdc.free > 0 && pdc.first != NULL);
struct pdcache_info * cur = pdc.first;
pdc.first = cur->next;
Spinlock_Unlock(&pdc.lock);
memset(cur, 0, sizeof(struct vmpd));
return (struct vmpd *)cur;
}
// frees an existing pdcache
void
pdcache_free(struct vmpd * pd)
{
Spinlock_Lock(&pdc.lock);
struct pdcache_info * ret = (struct pdcache_info *)pd;
struct pdcache_info * old = pdc.first->next;
pdc.first = ret;
ret->next = old;
pdc.free++;
ASSERT(pdc.total >= pdc.free);
Spinlock_Unlock(&pdc.lock);
}
void
pdcache_init()
{
Spinlock_Init(&pdc.lock, "pdcache lock", SPINLOCK_TYPE_NORMAL);
pdc.first = NULL;
pdc.free = 0;
pdc.total = 0;
}

View File

@ -1,6 +1,7 @@
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <sys/kconfig.h>
#include <sys/kassert.h>
@ -12,37 +13,54 @@
#include <machine/cpuop.h>
#include <machine/pmap.h>
#include <machine/paging.h>
#include <machine/pdcache.h>
#include <machine/mrt.h>
AS systemAS;
AS *currentAS[MAX_CPUS];
/**
* PMapAllocPageTable --
*
* Allocates and initializes a page table.
*
* @return Newly created PageTable.
*/
static struct vmpt *
PMapAllocPageTable()
{
struct vmpt * vmpt = PAlloc_AllocPage();
if (vmpt) {
memset(vmpt, 0, sizeof(struct vmpt));
}
return vmpt;
}
void
PMap_Init()
{
int i, j;
kprintf("Initializing PMAP ... ");
// Setup global state
for (i = 0; i < MAX_CPUS; i++) {
for (int i = 0; i < MAX_CPUS; i++) {
currentAS[i] = 0;
}
// Allocate system page table
systemAS.root = PAlloc_AllocPage();
systemAS.tables = PAGETABLE_ENTRIES / 2 + 1;
systemAS.mappings = 0;
systemAS.dmap_tbl = PMapAllocPageTable();
systemAS.xmem_tbl = PMapAllocPageTable();
if (!systemAS.root)
PANIC("Cannot allocate system page table");
if (!systemAS.dmap_tbl)
PANIC("Cannot allocate dmap page table");
if (!systemAS.xmem_tbl)
PANIC("Cannot allocate xmem page table");
// Setup system mappings
PMap_SystemLMap(0x0, MEM_DIRECTMAP_BASE + 0x0,
3*512, 0); // 3GB RWX
PMap_SystemLMap(0xC0000000, MEM_DIRECTMAP_BASE + 0xC0000000,
512, 0); // 1GB RW + PCD
PMap_SystemLMap(0x100000000, MEM_DIRECTMAP_BASE + 0x100000000,
60*512, 0); // 60GB RWX
PMap_SystemLMap(0x0, MEM_DIRECTMAP_BASE,
128, VMPD_ATTR_P | VMPD_ATTR_AO_KRW); // 128GB RWX
PMap_SystemLMap(0x0, MEM_DIRECTMAP_DEV_BASE,
128, VMPD_ATTR_P | VMPD_ATTR_AO_KRW | VMPD_ATTR_DEV); // 128GB Device
PMap_LoadAS(&systemAS);
@ -65,17 +83,14 @@ PMap_InitAP()
AS*
PMap_NewAS()
{
int i;
AS *as = PAlloc_AllocPage();
if (!as)
return NULL;
as->root = PAlloc_AllocPage();
as->tables = 1;
as->mappings = 0;
// NOT IMPLEMENTED
as->dmap_tbl = systemAS.dmap_tbl;
as->xmem_tbl = systemAS.xmem_tbl;
as->user_tbl = PMapAllocPageTable();
return as;
}
@ -90,6 +105,11 @@ PMap_NewAS()
void
PMap_DestroyAS(AS *space)
{
// free usertables
UNUSED struct vmpt * pt = space->user_tbl;
// release space itself
PAlloc_Release(space);
}
/**
@ -116,23 +136,36 @@ PMap_CurrentAS()
void
PMap_LoadAS(AS *space)
{
// Flush TLB
currentAS[CPU()] = space;
int ret;
// set dmap region
METAL_MROUTINE_SETARG(MRT_SET_MPTB_ARG_IDX, MRT_SET_MPTB_DMAP);
METAL_MROUTINE_SETARG(MRT_SET_MPTB_ARG_IDX, space->dmap_tbl);
METAL_MENTER(MRT_SET_MPTB_IDX);
METAL_MROUTINE_GETRET(MRT_SET_MPTB_RET_STATUS, ret);
if (ret != 0)
PANIC("Failed to load DMAP page table.");
// set xmem region
METAL_MROUTINE_SETARG(MRT_SET_MPTB_ARG_IDX, MRT_SET_MPTB_XMEM);
METAL_MROUTINE_SETARG(MRT_SET_MPTB_ARG_IDX, space->xmem_tbl);
METAL_MENTER(MRT_SET_MPTB_IDX);
METAL_MROUTINE_GETRET(MRT_SET_MPTB_RET_STATUS, ret);
if (ret != 0)
PANIC("Failed to load XMEM page table.");
// set userspace
METAL_MROUTINE_SETARG(MRT_SET_MPTB_ARG_IDX, MRT_SET_MPTB_USER);
METAL_MROUTINE_SETARG(MRT_SET_MPTB_ARG_IDX, space->user_tbl);
METAL_MENTER(MRT_SET_MPTB_IDX);
METAL_MROUTINE_GETRET(MRT_SET_MPTB_RET_STATUS, ret);
if (ret != 0)
PANIC("Failed to load USER page table.");
flushtlb();
}
/**
* PMapAllocPageTable --
*
* Allocates and initializes a page table.
*
* @return Newly created PageTable.
*/
static PageTable *
PMapAllocPageTable()
{
NOT_IMPLEMENTED();
return NULL;
}
/**
* PMap_Translate --
@ -143,31 +176,12 @@ PMapAllocPageTable()
* @param [in] va Virtual address we wish to translate.
*/
uintptr_t
PMap_Translate(AS *space, uintptr_t va)
PMap_Translate(UNUSED AS *space, UNUSED uintptr_t va)
{
NOT_IMPLEMENTED();
return 0;
}
/**
* PMapLookupEntry --
*
* Lookup a virtual address in a page table and return a pointer to the page
* entry. This function allocates page tables as necessary to fill in the
* 4-level heirarchy.
*
* @param [in] space Address space to search.
* @param [in] va Virtual address to lookup.
* @param [out] entry Pointer will point to the PageEntry.
* @param [in] size Page size we want to use.
*/
static void
PMapLookupEntry(AS *space, uint64_t va, PageEntry **entry, int size)
{
NOT_IMPLEMENTED();
return;
}
/**
* PMap_Map --
*
@ -183,7 +197,7 @@ PMapLookupEntry(AS *space, uint64_t va, PageEntry **entry, int size)
* @retval false On failure
*/
bool
PMap_Map(AS *as, uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags)
PMap_Map(UNUSED AS *as, UNUSED uint64_t phys, UNUSED uint64_t virt, UNUSED uint64_t pages, UNUSED uint64_t flags)
{
NOT_IMPLEMENTED();
return true;
@ -202,7 +216,7 @@ PMap_Map(AS *as, uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags)
* @retval false On failure
*/
bool
PMap_Unmap(AS *as, uint64_t va, uint64_t pages)
PMap_Unmap(UNUSED AS *as, UNUSED uint64_t va, UNUSED uint64_t pages)
{
NOT_IMPLEMENTED();
return true;
@ -223,7 +237,7 @@ PMap_Unmap(AS *as, uint64_t va, uint64_t pages)
* @retval false On failure
*/
bool
PMap_AllocMap(AS *as, uint64_t virt, uint64_t len, uint64_t flags)
PMap_AllocMap(UNUSED AS *as, UNUSED uint64_t virt, UNUSED uint64_t len, UNUSED uint64_t flags)
{
NOT_IMPLEMENTED();
return true;
@ -240,16 +254,16 @@ PMap_AllocMap(AS *as, uint64_t virt, uint64_t len, uint64_t flags)
* @param [out] entry Pointer will point to the PageEntry.
* @param [in] size Page size we want to use.
*/
void
PMap_SystemLookup(uint64_t va, PageEntry **entry, int size)
{
PMapLookupEntry(&systemAS, va, entry, size);
}
// void
// PMap_SystemLookup(uint64_t va, PageEntry **entry, int size)
// {
// PMapLookupEntry(&systemAS, va, entry, size);
// }
/**
* PMap_SystemLMap --
*
* Map a range of large (64MB) physical pages to virtual pages in the kernel
* Map a range of large (1GB) physical pages to virtual pages in the kernel
* address space that is shared by all processes.
*
* @param [in] phys Physical address.
@ -263,6 +277,26 @@ PMap_SystemLookup(uint64_t va, PageEntry **entry, int size)
bool
PMap_SystemLMap(uint64_t phys, uint64_t virt, uint64_t lpages, uint64_t flags)
{
// virt address must be within the dmap (l map) region
if (virt < MEM_DIRECTMAP_BASE && virt >= MEM_DIRECTMAP_TOP) {
return false;
}
unsigned int i = 0;
while (i < lpages) {
// allocate a new pd
struct vmpd * pd = pdcache_alloc();
if (pd == NULL) {
// XXX: if this fails and not the first page to be mapped
// the this function inflicts side effects
return false;
}
pd->vaddr = virt & ~((1ull << REGION_DMAP_PGSHIFT) - 1) + i * (1ull << REGION_DMAP_PGSHIFT);
pd->paddr = phys & ~((1ull << REGION_DMAP_PGSHIFT) - 1) + i * (1ull << REGION_DMAP_PGSHIFT);
pd->attr = flags;
// vm_insert_pd(systemAS.dmap_tbl, pd, REGION_DMAP_PGSHIFT, DMVA2PA(pd));
}
return true;
}
@ -284,7 +318,28 @@ PMap_SystemLMap(uint64_t phys, uint64_t virt, uint64_t lpages, uint64_t flags)
bool
PMap_SystemMap(uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags)
{
NOT_IMPLEMENTED();
// virt address must be within the dmap (l map) region
if (virt < MEM_XMAP_BASE && virt >= MEM_XMAP_TOP) {
return false;
}
unsigned int i = 0;
while (i < pages) {
// allocate a new pd
struct vmpd * pd = pdcache_alloc();
if (pd == NULL) {
// XXX: if this fails and not the first page to be mapped
// the this function inflicts side effects
return false;
}
pd->vaddr = virt & ~((1ull << REGION_XMEM_PGSHIFT) - 1) + i * (1ull << REGION_XMEM_PGSHIFT);
pd->paddr = phys & ~((1ull << REGION_XMEM_PGSHIFT) - 1) + i * (1ull << REGION_XMEM_PGSHIFT);
pd->attr = flags;
// vm_insert_pd(systemAS.xmem_tbl, pd, REGION_XMEM_PGSHIFT, DMVA2PA(pd));
}
return true;
}
@ -294,26 +349,20 @@ PMap_SystemMap(uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags)
* We do not currently use this!
*/
bool
PMap_SystemUnmap(uint64_t virt, uint64_t pages)
PMap_SystemUnmap(UNUSED uint64_t virt, UNUSED uint64_t pages)
{
NOT_IMPLEMENTED();
return false;
}
// static uint64_t
// AddrFromIJKL(uint64_t i, uint64_t j, uint64_t k, uint64_t l)
// {
// return (i << 39) | (j << HUGE_PGSHIFT) | (k << LARGE_PGSHIFT) | (l << PGSHIFT);
// }
void
PMap_Dump(AS *space)
PMap_Dump(UNUSED AS *space)
{
return;
}
static void
Debug_PMapDump(int argc, const char *argv[])
Debug_PMapDump(UNUSED int argc, UNUSED const char *argv[])
{
PMap_Dump(currentAS[CPU()]);
}

View File

@ -24,8 +24,8 @@ Thread_InitArch(Thread *thr)
}
void
Thread_SetupKThread(Thread *thr, void (*f)(),
uintptr_t arg1, uintptr_t arg2, uintptr_t arg3)
Thread_SetupKThread(Thread *thr, UNUSED void (*f)(void *),
UNUSED uintptr_t arg1, UNUSED uintptr_t arg2, UNUSED uintptr_t arg3)
{
// Initialize stack
uint64_t stacktop = thr->kstack + PGSIZE;
@ -43,7 +43,7 @@ Thread_SetupKThread(Thread *thr, void (*f)(),
}
static void
ThreadEnterUserLevelCB(uintptr_t arg1, uintptr_t arg2, uintptr_t arg3)
ThreadEnterUserLevelCB(UNUSED void * unused)
{
TrapFrame tf;

View File

@ -26,7 +26,7 @@ Time_GetTSCFreq()
}
static void
Debug_ReadTSC(int argc, const char *argv[])
Debug_ReadTSC(UNUSED int argc, UNUSED const char *argv[])
{
kprintf("RDTSC: %lld\n", Time_GetTSC());
}

View File

@ -105,7 +105,7 @@ trap_entry(void)
}
static void
Debug_Traps(int argc, const char *argv[])
Debug_Traps(UNUSED int argc, UNUSED const char *argv[])
{
int i;

View File

@ -262,7 +262,7 @@ AHCI_IssueCommand(AHCI *ahci, int port, SGArray *sga, void *cfis, int len)
memcpy((void *)&ct->cfis[0], cfis, len);
// Convert SGArray into PRDT
int i;
unsigned int i;
for (i = 0; i < sga->len; i++)
{
ct->prdt[i].dba = sga->entries[i].offset;

View File

@ -110,7 +110,7 @@ Panic(const char *str)
void
Console_Gets(char *str, size_t n)
{
int i;
unsigned int i;
for (i = 0; i < (n - 1); i++)
{
@ -197,7 +197,7 @@ Console_Read(Handle *handle, void *buf, uint64_t off, uint64_t len)
int
Console_Write(Handle *handle, void *buf, uint64_t off, uint64_t len)
{
int i;
unsigned int i;
uintptr_t b = (uintptr_t)buf;
char kbuf[512];
uint64_t nbytes = 0;

View File

@ -72,7 +72,7 @@ O2FS_Mount(Disk *disk)
}
// Read bitmap
for (int i = 0; i < sb->bitmapSize; i++) {
for (unsigned int i = 0; i < sb->bitmapSize; i++) {
ASSERT(i < 16);
BufCacheEntry *bentry;
@ -141,7 +141,7 @@ O2FSBAlloc(VFS *fs)
bitmap = bentry->buffer;
// XXX: Check for end of disk
for (int b = 0; b < fs->blksize; b++) {
for (unsigned int b = 0; b < fs->blksize; b++) {
for (int bi = 0; bi < 8; bi++) {
if (((bitmap[b] >> bi) & 0x1) == 0) {
/* Set bit */
@ -268,7 +268,7 @@ O2FSGrowVNode(VNode *vn, uint64_t filesz)
if (filesz > (vfs->blksize * 64))
return -EINVAL;
for (int i = 0; i < ((filesz + vfs->blksize - 1) / vfs->blksize); i++) {
for (unsigned int i = 0; i < ((filesz + vfs->blksize - 1) / vfs->blksize); i++) {
if (bn->direct[i].offset == 0) {
uint64_t blkno = O2FSBAlloc(vfs);
if (blkno == 0) {

View File

@ -44,7 +44,7 @@
#define __printflike(_fmt, _var) __attribute__((__format__(__printf__, _fmt, _var)))
#define offsetof(st, m) \
((size_t)((char *)&((st *)0)->m - (char *)0))
__builtin_offsetof(st, m)
#endif /* __CDEFS_H__ */

View File

@ -7,7 +7,7 @@ uint32_t LAPIC_CPU();
#define CPU LAPIC_CPU
#elif defined(__aarch64__)
static inline int ARM_CPU()
static inline unsigned int ARM_CPU()
{
return 0;
}

View File

@ -127,7 +127,7 @@ void Thread_Dump(Thread *thr);
// Platform functions
void Thread_InitArch(Thread *thr);
void Thread_SetupKThread(Thread *thr, void (*f)(),
void Thread_SetupKThread(Thread *thr, void (*f)(void *),
uintptr_t arg1, uintptr_t arg2, uintptr_t arg3);
void Thread_SetupUThread(Thread *thr, uint64_t rip, uint64_t arg);
void Thread_SwitchArch(Thread *oldthr, Thread *newthr);

View File

@ -282,7 +282,7 @@ BufCache_Write(BufCacheEntry *entry)
}
static void
Debug_BufCache(int argc, const char *argv[])
Debug_BufCache(UNUSED int argc, UNUSED const char *argv[])
{
kprintf("Hits: %lld\n", cacheHit);
kprintf("Misses: %lld\n", cacheMiss);

View File

@ -50,7 +50,7 @@ Critical_Level()
}
static void
Debug_Critical(int argc, const char *argv[])
Debug_Critical(UNUSED int argc, UNUSED const char *argv[])
{
int c;

View File

@ -115,7 +115,7 @@ Debug_GetValue(uintptr_t addr, int size, bool isSigned)
}
void
Debug_PrintSymbol(uintptr_t off, int strategy)
Debug_PrintSymbol(uintptr_t off, UNUSED int strategy)
{
kprintf("0x%llx", off);
}
@ -169,9 +169,9 @@ extern DebugCommand __kdbgcmd_start[];
extern DebugCommand __kdbgcmd_end[];
static void
Debug_Help(int argc, const char *argv[])
Debug_Help(UNUSED int argc, UNUSED const char *argv[])
{
int i;
uintptr_t i;
uintptr_t commands = (uintptr_t)&__kdbgcmd_end - (uintptr_t)&__kdbgcmd_start;
commands /= sizeof(DebugCommand);
DebugCommand *cmds = (DebugCommand *)&__kdbgcmd_start;
@ -281,7 +281,7 @@ Debug_Prompt()
return; // Continue
} else {
// execute command
int i;
uintptr_t i;
uintptr_t commands = (uintptr_t)&__kdbgcmd_end - (uintptr_t)&__kdbgcmd_start;
commands /= sizeof(DebugCommand);
DebugCommand *cmds = (DebugCommand *)&__kdbgcmd_start;

View File

@ -59,7 +59,7 @@ Disk_Flush(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
}
static void
Debug_Disks(int argc, const char *argv[])
Debug_Disks(UNUSED int argc, UNUSED const char *argv[])
{
Disk *d;

View File

@ -60,7 +60,7 @@ KTimeDaysInMonth(uint64_t year, uint64_t month)
void
KTime_Fixup(KTime *tm)
{
uint64_t m;
int m;
if (tm->yday == -1) {
uint64_t yday = 0;
@ -77,7 +77,7 @@ KTime_ToEpoch(const KTime *tm)
{
uint64_t days = 0;
uint64_t secs = 0;
uint64_t y, m;
int y, m;
// Convert to UNIX epoch
for (y = 1970; y < tm->year; y++) {
@ -210,7 +210,7 @@ KTime_GetEpochNS()
}
static void
Debug_Date()
Debug_Date(UNUSED int argc, UNUSED const char * argv[])
{
UnixEpoch epoch = KTime_GetEpoch();
KTime tm;
@ -227,7 +227,7 @@ Debug_Date()
REGISTER_DBGCMD(date, "Print date", Debug_Date);
static void
Debug_Ticks()
Debug_Ticks(UNUSED int argc, UNUSED const char * argv[])
{
kprintf("Ticks Per Second: %lu\n", ticksPerSecond);
}

View File

@ -148,7 +148,7 @@ memcpy(void *dst, const void *src, size_t length)
int
memcmp(const void *b1, const void *b2, size_t length)
{
int i;
size_t i;
const char *c1 = (const char *)b1;
const char *c2 = (const char *)b2;

View File

@ -128,7 +128,7 @@ LoaderZeroSegment(AS *as, uintptr_t vaddr, uintptr_t len)
* Load the ELF binary into the process belonging to the thread.
*/
bool
Loader_Load(Thread *thr, VNode *vn, void *buf, uint64_t len)
Loader_Load(Thread *thr, VNode *vn, void *buf, UNUSED uint64_t len)
{
int i;
const Elf64_Ehdr *ehdr;

View File

@ -43,7 +43,7 @@ NIC_GetByID(uint64_t nicNo)
}
void
Debug_NICs(int argc, const char *argv[])
Debug_NICs(UNUSED int argc, UNUSED const char *argv[])
{
NIC *n;

View File

@ -16,7 +16,7 @@
#include <sys/semaphore.h>
#include <sys/thread.h>
Spinlock semaListLock = { 0, 0, 0, 0, 0, 0, 0, 0, "Semaphore List" };
Spinlock semaListLock = { 0, 0, 0, 0, 0, 0, 0, 0, "Semaphore List", {0}, {0}};
LIST_HEAD(SemaListHead, Semaphore) semaList = LIST_HEAD_INITIALIZER(semaList);
extern uint64_t ticksPerSecond;

View File

@ -29,7 +29,7 @@ SGArray_Append(SGArray *sga, uint64_t off, uint64_t len)
void
SGArray_Dump(SGArray *sga)
{
int i;
unsigned int i;
kprintf("--- SGArray Begin ---\n");
for (i = 0; i < sga->len; i++)

View File

@ -3,6 +3,7 @@
* All rights reserved.
*/
#include "sys/queue.h"
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
@ -16,12 +17,15 @@
#include <machine/atomic.h>
#include <machine/cpu.h>
#include <machine/metal.h>
#include <machine/cpuop.h>
Spinlock lockListLock = {
0, 0, 0, 0, 0, 0, 0,
SPINLOCK_TYPE_NORMAL,
"SPINLOCK LIST",
{0},
{0}
};
LIST_HEAD(LockListHead, Spinlock) lockList = LIST_HEAD_INITIALIZER(lockList);
@ -35,7 +39,7 @@ Spinlock_EarlyInit()
int c;
for (c = 0; c < MAX_CPUS; c++) {
TAILQ_INIT(&lockStack[c]);
//TAILQ_INIT(&lockStack[c]);
}
}

View File

@ -63,16 +63,18 @@ XMem_New()
void
XMem_Destroy(XMem *xmem)
{
uintptr_t off;
PageEntry *entry;
NOT_IMPLEMENTED();
for (off = 0; off < xmem->length; off += PGSIZE) {
PMap_SystemLookup(xmem->base + off, &entry, PGSIZE);
// uintptr_t off;
// PageEntry *entry;
// Compute DM
// for (off = 0; off < xmem->length; off += PGSIZE) {
// PMap_SystemLookup(xmem->base + off, &entry, PGSIZE);
// Free Page
}
// // Compute DM
// // Free Page
// }
//PMap_SystemUnmap(virt, pages);
}

View File

@ -8,7 +8,7 @@
#include <syscall.h>
int
main(int argc, const char *argv[])
main(UNUSED int argc, const char *argv[])
{
int origpid[10], pid[10];
const char *program;