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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -38,7 +38,7 @@ elif (env["ARCH"] == "arm64"):
src.append(src_arm64) src.append(src_arm64)
src.append(src_common) 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.Append(CPPPATH = ['#build/include'])
libc_env.StaticLibrary("libc", src) libc_env.StaticLibrary("libc", src)

View File

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

View File

@ -15,7 +15,9 @@ src.append(src_common)
src.append(env["CRTEND"]) src.append(env["CRTEND"])
init_env.Append(LINKFLAGS = ['-nostdlib']) 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(CPPPATH = ['#build/include'])
init_env.Append(LIBPATH = ['#build/lib/libc'], LIBS = ['c']) init_env.Append(LIBPATH = ['#build/lib/libc'], LIBS = ['c'])

View File

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

View File

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

View File

@ -86,7 +86,7 @@ Debug_Breakpoint(TrapFrame *tf)
static void static void
Debug_Registers(int argc, const char *argv[]) Debug_Registers(int argc, const char *argv[])
{ {
TrapFrame *tf = frames[CPU()]; UNUSED TrapFrame *tf = frames[CPU()];
if (argc == 2) { if (argc == 2) {
int cpuNo = Debug_StrToInt(argv[1]); int cpuNo = Debug_StrToInt(argv[1]);
@ -104,7 +104,7 @@ REGISTER_DBGCMD(registers, "Show CPU registers", Debug_Registers);
static void static void
Debug_Backtrace(int argc, const char *argv[]) Debug_Backtrace(int argc, const char *argv[])
{ {
TrapFrame *tf = frames[CPU()]; UNUSED TrapFrame *tf = frames[CPU()];
uint64_t *ptr; uint64_t *ptr;
uint64_t rip; uint64_t rip;
uint64_t rbp; uint64_t rbp;
@ -143,7 +143,7 @@ Debug_SetBreakpoint(int argc, const char *argv[])
return; return;
} }
uint64_t addr = Debug_StrToInt(argv[1]); UNUSED uint64_t addr = Debug_StrToInt(argv[1]);
kprintf("NOT IMPLEMENTED\n"); kprintf("NOT IMPLEMENTED\n");
} }
@ -151,7 +151,7 @@ Debug_SetBreakpoint(int argc, const char *argv[])
REGISTER_DBGCMD(bkpt, "Set breakpoint", Debug_SetBreakpoint); REGISTER_DBGCMD(bkpt, "Set breakpoint", Debug_SetBreakpoint);
static void static void
Debug_ClearBreakpoint(int argc, const char *argv[]) Debug_ClearBreakpoint(int argc, UNUSED const char *argv[])
{ {
if (argc != 2) { if (argc != 2) {
kprintf("clrbkpt [0-3]"); kprintf("clrbkpt [0-3]");
@ -164,7 +164,7 @@ Debug_ClearBreakpoint(int argc, const char *argv[])
REGISTER_DBGCMD(clrbkpt, "Clear breakpoint", Debug_ClearBreakpoint); REGISTER_DBGCMD(clrbkpt, "Clear breakpoint", Debug_ClearBreakpoint);
static void static void
Debug_ListBreakpoints(int argc, const char *argv[]) Debug_ListBreakpoints(UNUSED int argc, UNUSED const char *argv[])
{ {
kprintf("NOT IMPLEMENTED\n"); kprintf("NOT IMPLEMENTED\n");
} }
@ -172,7 +172,7 @@ Debug_ListBreakpoints(int argc, const char *argv[])
REGISTER_DBGCMD(bkpts, "List breakpoint", Debug_ListBreakpoints); REGISTER_DBGCMD(bkpts, "List breakpoint", Debug_ListBreakpoints);
static void static void
Debug_Reboot(int argc, const char *argv[]) Debug_Reboot(UNUSED int argc, UNUSED const char *argv[])
{ {
kprintf("NOT IMPLEMENTED\n"); 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. * and return updated location.
*/ */
static uintptr_t 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; int regmodrm;
const struct finst * fp; 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. * next instruction.
*/ */
uintptr_t uintptr_t
db_disasm(uintptr_t loc, bool altfmt) db_disasm(uintptr_t loc, UNUSED bool altfmt)
{ {
int inst; int inst;
int size; int size;

View File

@ -309,7 +309,7 @@ gic_wakeup_redist(uint32_t rdid)
} }
static int 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; uint32_t max_spi;
// Check Ext SPI implemented // Check Ext SPI implemented

View File

@ -28,14 +28,6 @@
#define ROUNDUP_PGSIZE(x) (((x) + LARGE_PGSIZE - 1) & ~LARGE_PGMASK) #define ROUNDUP_PGSIZE(x) (((x) + LARGE_PGSIZE - 1) & ~LARGE_PGMASK)
#define ROUNDDOWN_PGSIZE(x) ((x) & ~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 */ /* SCTLR_EL1 */
#define SCTLR_M 0x00000001 /* MMU Enable */ #define SCTLR_M 0x00000001 /* MMU Enable */
#define SCTLR_A 0x00000002 /* Alignment Check */ #define SCTLR_A 0x00000002 /* Alignment Check */

View File

@ -6,27 +6,43 @@
#ifndef __ARM64OP_H__ #ifndef __ARM64OP_H__
#define __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"); __asm__ volatile("msr daifclr, #(0x0002)\n");
} }
static INLINE void disable_interrupts() static ALWAYS_INLINE INLINE void disable_interrupts()
{ {
__asm__ volatile("msr daifset, #(0x0002)\n"); __asm__ volatile("msr daifset, #(0x0002)\n");
} }
static INLINE void hlt() static ALWAYS_INLINE INLINE void hlt()
{ {
__asm__ volatile("wfi"); __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"); __asm__ volatile("yield");
} }
static INLINE void breakpoint() static ALWAYS_INLINE INLINE void breakpoint()
{ {
__asm__ volatile("brk #0"); __asm__ volatile("brk #0");
} }

View File

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

View File

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

View File

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

View File

@ -3,9 +3,6 @@
#include <machine/pmap.h> #include <machine/pmap.h>
#include <sys/types.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 // 1GB page ident map region
#define REGION_DMAP_PGSHIFT (30) #define REGION_DMAP_PGSHIFT (30)
// 16K page userspace // 16K page userspace
@ -21,10 +18,13 @@ struct vmpte {
}; };
_Static_assert(sizeof(struct vmpte) == 8); _Static_assert(sizeof(struct vmpte) == 8);
#define VM_PTBUCKETS (PGSIZE / sizeof(struct vmpte))
struct vmpt { struct vmpt {
struct vmpte entries[VM_PTBUCKETS]; struct vmpte entries[VM_PTBUCKETS];
}; };
_Static_assert(sizeof(struct vmpt) == VM_PTBUCKETS * sizeof(struct vmpte)); _Static_assert(sizeof(struct vmpt) == VM_PTBUCKETS * sizeof(struct vmpte));
_Static_assert(sizeof(struct vmpt) == PGSIZE);
// //
// Page Table Entry (must be 8 bytes aligned) // 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 typedef struct AS
{ {
PageTable *root; struct vmpt *xmem_tbl;
uint64_t tables; struct vmpt *dmap_tbl;
uint64_t mappings; struct vmpt *user_tbl;
} AS; } AS;
void PMap_Init(); 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); bool PMap_Unmap(AS *as, uint64_t virt, uint64_t pages);
// Manipulate Kernel Memory // 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_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_SystemMap(uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags);
bool PMap_SystemUnmap(uint64_t virt, uint64_t pages); bool PMap_SystemUnmap(uint64_t virt, uint64_t pages);

View File

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

View File

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

View File

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

View File

@ -1,4 +1,5 @@
#include "machine/metalp.h" #include "machine/metalp.h"
#include <machine/metal.h>
#include <machine/mrt.h> #include <machine/mrt.h>
#include <string.h> #include <string.h>
@ -8,11 +9,28 @@ DECL_MVAR(struct inst_intercept_table, mtl_inst_tbl);
#define METAL_BOOTSTACK_SZ (4096) #define METAL_BOOTSTACK_SZ (4096)
DECL_MVAR_ALIGNED(static char, mtl_bootstack[METAL_BOOTSTACK_SZ], METAL_BOOTSTACK_SZ); 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_mrt_tbl, 0, sizeof(mtl_mrt_tbl));
memset(&mtl_exc_tbl, 0, sizeof(mtl_exc_tbl)); memset(&mtl_exc_tbl, 0, sizeof(mtl_exc_tbl));
@ -21,57 +39,59 @@ IMPL_SHORT_MROUTINE(mrt_init, 0)
// mroutine 0 - 8 // mroutine 0 - 8
mtl_mrt_tbl.entries[0] = MROUTINE_ENTRY_MAKE(mrt_dummy, 1); 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_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_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_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].esrbits = (0b100100 << 26) | (0b00100); // data abort, lv0 translation
mtl_exc_tbl.entries[0].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100100 << 26) | (0b00101); // data abort, lv1 translation
mtl_exc_tbl.entries[1].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100100 << 26) | (0b00110); // data abort, lv2 translation
mtl_exc_tbl.entries[2].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100100 << 26) | (0b00111); // data abort, lv3 translation
mtl_exc_tbl.entries[3].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100001 << 26) | (0b00100); // inst abort, lv0 translation
mtl_exc_tbl.entries[4].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100001 << 26) | (0b00101); // inst abort, lv1 translation
mtl_exc_tbl.entries[5].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100001 << 26) | (0b00110); // inst abort, lv2 translation
mtl_exc_tbl.entries[6].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100001 << 26) | (0b00111); // inst abort, lv3 translation
mtl_exc_tbl.entries[7].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100101 << 26) | (0b00100); // data abort, lv0 translation
mtl_exc_tbl.entries[8].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100101 << 26) | (0b00101); // data abort, lv1 translation
mtl_exc_tbl.entries[9].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100101 << 26) | (0b00110); // data abort, lv2 translation
mtl_exc_tbl.entries[10].esrmask = (0b111111 << 26) | (0b11111); 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].esrbits = (0b100101 << 26) | (0b00111); // data abort, lv3 translation
mtl_exc_tbl.entries[11].esrmask = (0b111111 << 26) | (0b11111); 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 // load mroutine table
void* tbl_addr = &mtl_mrt_tbl; void* tbl_addr = &mtl_mrt_tbl;
@ -94,4 +114,6 @@ IMPL_SHORT_MROUTINE(mrt_init, 0)
// temporary metal stack // temporary metal stack
regval_t mstk = (regval_t)&mtl_bootstack[METAL_BOOTSTACK_SZ]; regval_t mstk = (regval_t)&mtl_bootstack[METAL_BOOTSTACK_SZ];
METAL_WMR(METAL_REG_MSTK, mstk); 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)); METAL_PLDR64(cur, pte + offsetof(struct vmpte, first));
vaddr_t curvaddr; vaddr_t curvaddr;
uint64_t attr;
while (cur != (paddr_t)NULL) { while (cur != (paddr_t)NULL) {
METAL_PLDR64(curvaddr, cur + offsetof(struct vmpd, vaddr)); METAL_PLDR64(curvaddr, cur + offsetof(struct vmpd, vaddr));
if (vm_get_pfn(curvaddr, pgshift) == pfn) { if (vm_get_pfn(curvaddr, pgshift) == pfn) {
METAL_PLDR64(attr, cur + offsetof(struct vmpd, attr));
if (attr & VMPD_ATTR_P) {
*out = cur; *out = cur;
return 0; return 0;
} }
}
METAL_PLDR64(cur, cur + offsetof(struct vmpd, next)); 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 // 0 if success
// //
static MCODE int static MCODE int
vmm_map_page(vaddr_t uva) vmm_map_page(vaddr_t uva, int itlb)
{ {
int status; int status;
paddr_t ptb; paddr_t ptb;
@ -126,7 +130,7 @@ vmm_map_page(vaddr_t uva)
#define MAIR_NORMAL (0b11111111ul) #define MAIR_NORMAL (0b11111111ul)
#define MAIR_DEV (0b0ul) #define MAIR_DEV (0b0ul)
const regval_t extIAttrs = const regval_t extIAttrs =
(1 << 0) | // itlb ((itlb & 0x1) << 0) | // itlb
(0b01 << 1) | // el1 (0b01 << 1) | // el1
(0b11 << 3) | // translv = 3 (0b11 << 3) | // translv = 3
(0b00 << 5) | // 4k page (0b00 << 5) | // 4k page
@ -144,35 +148,37 @@ vmm_map_page(vaddr_t uva)
METAL_WMR(METAL_REG_MR2, pgvaddr); METAL_WMR(METAL_REG_MR2, pgvaddr);
METAL_WTLB(METAL_REG_MR0, METAL_REG_MR1, METAL_REG_MR2); 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; return 0;
} }
// flag: skip exception intercept on the next instruction upon mreturn // 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; vaddr_t vaddr;
METAL_RMR(METAL_REG_MER2, 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; unsigned int idx;
int ret = 0; int ret = 0;
@ -199,12 +205,16 @@ IMPL_MROUTINE(mrt_set_mptb, 0)
} }
METAL_MROUTINE_SETRET(0, ret); METAL_MROUTINE_SETRET(0, ret);
return 0;
} }
IMPL_MROUTINE(mrt_set_mtp, 0) IMPL_MROUTINE(mrt_set_mtp)
{ {
uint64_t mtp; uint64_t mtp;
METAL_MROUTINE_GETARG(0, mtp); METAL_MROUTINE_GETARG(0, mtp);
METAL_WMR(METAL_REG_MTP, mtp); METAL_WMR(METAL_REG_MTP, mtp);
return 0;
} }

View File

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

View File

@ -20,8 +20,8 @@ PCIGetAddr(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
uint8_t uint8_t
PCICfgRead8(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg) PCICfgRead8(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
{ {
uint32_t addr = PCIGetAddr(bus, slot, func, reg); UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x3); UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
return 0; return 0;
} }
@ -29,8 +29,8 @@ PCICfgRead8(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
uint16_t uint16_t
PCICfgRead16(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg) PCICfgRead16(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
{ {
uint32_t addr = PCIGetAddr(bus, slot, func, reg); UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x2); UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x2);
ASSERT((reg & 0x1) == 0); ASSERT((reg & 0x1) == 0);
@ -40,8 +40,8 @@ PCICfgRead16(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
uint32_t uint32_t
PCICfgRead32(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg) PCICfgRead32(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
{ {
uint32_t addr = PCIGetAddr(bus, slot, func, reg); UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE; UNUSED uint16_t port = PCI_PORT_DATABASE;
ASSERT((reg & 0x3) == 0); ASSERT((reg & 0x3) == 0);
@ -50,28 +50,28 @@ PCICfgRead32(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg)
void void
PCICfgWrite8(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg, 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); UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x3); UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
} }
void void
PCICfgWrite16(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg, 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); UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x3); UNUSED uint16_t port = PCI_PORT_DATABASE + (reg & 0x3);
} }
void void
PCICfgWrite32(uint32_t bus, uint32_t slot, uint32_t func, uint32_t reg, 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); UNUSED uint32_t addr = PCIGetAddr(bus, slot, func, reg);
uint16_t port = PCI_PORT_DATABASE + (reg & 0x3); 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 <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <string.h>
#include <sys/kconfig.h> #include <sys/kconfig.h>
#include <sys/kassert.h> #include <sys/kassert.h>
@ -12,37 +13,54 @@
#include <machine/cpuop.h> #include <machine/cpuop.h>
#include <machine/pmap.h> #include <machine/pmap.h>
#include <machine/paging.h>
#include <machine/pdcache.h>
#include <machine/mrt.h>
AS systemAS; AS systemAS;
AS *currentAS[MAX_CPUS]; 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 void
PMap_Init() PMap_Init()
{ {
int i, j;
kprintf("Initializing PMAP ... "); kprintf("Initializing PMAP ... ");
// Setup global state // Setup global state
for (i = 0; i < MAX_CPUS; i++) { for (int i = 0; i < MAX_CPUS; i++) {
currentAS[i] = 0; currentAS[i] = 0;
} }
// Allocate system page table // Allocate system page table
systemAS.root = PAlloc_AllocPage(); systemAS.dmap_tbl = PMapAllocPageTable();
systemAS.tables = PAGETABLE_ENTRIES / 2 + 1; systemAS.xmem_tbl = PMapAllocPageTable();
systemAS.mappings = 0;
if (!systemAS.root) if (!systemAS.dmap_tbl)
PANIC("Cannot allocate system page table"); PANIC("Cannot allocate dmap page table");
if (!systemAS.xmem_tbl)
PANIC("Cannot allocate xmem page table");
// Setup system mappings // Setup system mappings
PMap_SystemLMap(0x0, MEM_DIRECTMAP_BASE + 0x0, PMap_SystemLMap(0x0, MEM_DIRECTMAP_BASE,
3*512, 0); // 3GB RWX 128, VMPD_ATTR_P | VMPD_ATTR_AO_KRW); // 128GB RWX
PMap_SystemLMap(0xC0000000, MEM_DIRECTMAP_BASE + 0xC0000000, PMap_SystemLMap(0x0, MEM_DIRECTMAP_DEV_BASE,
512, 0); // 1GB RW + PCD 128, VMPD_ATTR_P | VMPD_ATTR_AO_KRW | VMPD_ATTR_DEV); // 128GB Device
PMap_SystemLMap(0x100000000, MEM_DIRECTMAP_BASE + 0x100000000,
60*512, 0); // 60GB RWX
PMap_LoadAS(&systemAS); PMap_LoadAS(&systemAS);
@ -65,17 +83,14 @@ PMap_InitAP()
AS* AS*
PMap_NewAS() PMap_NewAS()
{ {
int i;
AS *as = PAlloc_AllocPage(); AS *as = PAlloc_AllocPage();
if (!as) if (!as)
return NULL; return NULL;
as->root = PAlloc_AllocPage(); as->dmap_tbl = systemAS.dmap_tbl;
as->tables = 1; as->xmem_tbl = systemAS.xmem_tbl;
as->mappings = 0; as->user_tbl = PMapAllocPageTable();
// NOT IMPLEMENTED
return as; return as;
} }
@ -90,6 +105,11 @@ PMap_NewAS()
void void
PMap_DestroyAS(AS *space) 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 void
PMap_LoadAS(AS *space) PMap_LoadAS(AS *space)
{ {
// Flush TLB
currentAS[CPU()] = space; 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 -- * PMap_Translate --
@ -143,31 +176,12 @@ PMapAllocPageTable()
* @param [in] va Virtual address we wish to translate. * @param [in] va Virtual address we wish to translate.
*/ */
uintptr_t uintptr_t
PMap_Translate(AS *space, uintptr_t va) PMap_Translate(UNUSED AS *space, UNUSED uintptr_t va)
{ {
NOT_IMPLEMENTED(); NOT_IMPLEMENTED();
return 0; 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 -- * PMap_Map --
* *
@ -183,7 +197,7 @@ PMapLookupEntry(AS *space, uint64_t va, PageEntry **entry, int size)
* @retval false On failure * @retval false On failure
*/ */
bool 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(); NOT_IMPLEMENTED();
return true; 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 * @retval false On failure
*/ */
bool 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(); NOT_IMPLEMENTED();
return true; return true;
@ -223,7 +237,7 @@ PMap_Unmap(AS *as, uint64_t va, uint64_t pages)
* @retval false On failure * @retval false On failure
*/ */
bool 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(); NOT_IMPLEMENTED();
return true; 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 [out] entry Pointer will point to the PageEntry.
* @param [in] size Page size we want to use. * @param [in] size Page size we want to use.
*/ */
void // void
PMap_SystemLookup(uint64_t va, PageEntry **entry, int size) // PMap_SystemLookup(uint64_t va, PageEntry **entry, int size)
{ // {
PMapLookupEntry(&systemAS, va, entry, size); // PMapLookupEntry(&systemAS, va, entry, size);
} // }
/** /**
* PMap_SystemLMap -- * 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. * address space that is shared by all processes.
* *
* @param [in] phys Physical address. * @param [in] phys Physical address.
@ -263,6 +277,26 @@ PMap_SystemLookup(uint64_t va, PageEntry **entry, int size)
bool bool
PMap_SystemLMap(uint64_t phys, uint64_t virt, uint64_t lpages, uint64_t flags) 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; return true;
} }
@ -284,7 +318,28 @@ PMap_SystemLMap(uint64_t phys, uint64_t virt, uint64_t lpages, uint64_t flags)
bool bool
PMap_SystemMap(uint64_t phys, uint64_t virt, uint64_t pages, uint64_t flags) 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; 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! * We do not currently use this!
*/ */
bool bool
PMap_SystemUnmap(uint64_t virt, uint64_t pages) PMap_SystemUnmap(UNUSED uint64_t virt, UNUSED uint64_t pages)
{ {
NOT_IMPLEMENTED(); NOT_IMPLEMENTED();
return false; 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 void
PMap_Dump(AS *space) PMap_Dump(UNUSED AS *space)
{ {
return; return;
} }
static void static void
Debug_PMapDump(int argc, const char *argv[]) Debug_PMapDump(UNUSED int argc, UNUSED const char *argv[])
{ {
PMap_Dump(currentAS[CPU()]); PMap_Dump(currentAS[CPU()]);
} }

View File

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

View File

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

View File

@ -105,7 +105,7 @@ trap_entry(void)
} }
static void static void
Debug_Traps(int argc, const char *argv[]) Debug_Traps(UNUSED int argc, UNUSED const char *argv[])
{ {
int i; 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); memcpy((void *)&ct->cfis[0], cfis, len);
// Convert SGArray into PRDT // Convert SGArray into PRDT
int i; unsigned int i;
for (i = 0; i < sga->len; i++) for (i = 0; i < sga->len; i++)
{ {
ct->prdt[i].dba = sga->entries[i].offset; ct->prdt[i].dba = sga->entries[i].offset;

View File

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

View File

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

View File

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

View File

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

View File

@ -127,7 +127,7 @@ void Thread_Dump(Thread *thr);
// Platform functions // Platform functions
void Thread_InitArch(Thread *thr); 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); uintptr_t arg1, uintptr_t arg2, uintptr_t arg3);
void Thread_SetupUThread(Thread *thr, uint64_t rip, uint64_t arg); void Thread_SetupUThread(Thread *thr, uint64_t rip, uint64_t arg);
void Thread_SwitchArch(Thread *oldthr, Thread *newthr); void Thread_SwitchArch(Thread *oldthr, Thread *newthr);

View File

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

View File

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

View File

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

View File

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

View File

@ -148,7 +148,7 @@ memcpy(void *dst, const void *src, size_t length)
int int
memcmp(const void *b1, const void *b2, size_t length) memcmp(const void *b1, const void *b2, size_t length)
{ {
int i; size_t i;
const char *c1 = (const char *)b1; const char *c1 = (const char *)b1;
const char *c2 = (const char *)b2; 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. * Load the ELF binary into the process belonging to the thread.
*/ */
bool 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; int i;
const Elf64_Ehdr *ehdr; const Elf64_Ehdr *ehdr;

View File

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

View File

@ -16,7 +16,7 @@
#include <sys/semaphore.h> #include <sys/semaphore.h>
#include <sys/thread.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); LIST_HEAD(SemaListHead, Semaphore) semaList = LIST_HEAD_INITIALIZER(semaList);
extern uint64_t ticksPerSecond; extern uint64_t ticksPerSecond;

View File

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

View File

@ -3,6 +3,7 @@
* All rights reserved. * All rights reserved.
*/ */
#include "sys/queue.h"
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
@ -16,12 +17,15 @@
#include <machine/atomic.h> #include <machine/atomic.h>
#include <machine/cpu.h> #include <machine/cpu.h>
#include <machine/metal.h>
#include <machine/cpuop.h> #include <machine/cpuop.h>
Spinlock lockListLock = { Spinlock lockListLock = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
SPINLOCK_TYPE_NORMAL, SPINLOCK_TYPE_NORMAL,
"SPINLOCK LIST", "SPINLOCK LIST",
{0},
{0}
}; };
LIST_HEAD(LockListHead, Spinlock) lockList = LIST_HEAD_INITIALIZER(lockList); LIST_HEAD(LockListHead, Spinlock) lockList = LIST_HEAD_INITIALIZER(lockList);
@ -35,7 +39,7 @@ Spinlock_EarlyInit()
int c; int c;
for (c = 0; c < MAX_CPUS; 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 void
XMem_Destroy(XMem *xmem) XMem_Destroy(XMem *xmem)
{ {
uintptr_t off; NOT_IMPLEMENTED();
PageEntry *entry;
for (off = 0; off < xmem->length; off += PGSIZE) { // uintptr_t off;
PMap_SystemLookup(xmem->base + off, &entry, PGSIZE); // 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); //PMap_SystemUnmap(virt, pages);
} }

View File

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