Arm: Initial functionality.
This commit is contained in:
parent
10cadedaea
commit
119689f123
9
Makefile
9
Makefile
|
@ -63,7 +63,11 @@ OBJ := $(patsubst %.ld,$(PAT_OBJ), $(patsubst %.S,$(PAT_OBJ), $(patsubst %.cpp,$
|
||||||
OBJ_DEP := $(OBJ:%.o=%.d)
|
OBJ_DEP := $(OBJ:%.o=%.d)
|
||||||
|
|
||||||
DIG := $(BLD_DIR)/digest
|
DIG := $(BLD_DIR)/digest
|
||||||
|
ifeq ($(ARCH),aarch64)
|
||||||
|
HYP := $(BLD_DIR)/$(ARCH)-$(BOARD)-nova
|
||||||
|
else
|
||||||
HYP := $(BLD_DIR)/$(ARCH)-nova
|
HYP := $(BLD_DIR)/$(ARCH)-nova
|
||||||
|
endif
|
||||||
ELF := $(HYP).elf
|
ELF := $(HYP).elf
|
||||||
BIN := $(HYP).bin
|
BIN := $(HYP).bin
|
||||||
|
|
||||||
|
@ -87,7 +91,10 @@ VPATH := $(SRC_DIR)
|
||||||
# Optimization options
|
# Optimization options
|
||||||
DFLAGS := -MP -MMD -pipe
|
DFLAGS := -MP -MMD -pipe
|
||||||
OFLAGS := -Os
|
OFLAGS := -Os
|
||||||
ifeq ($(ARCH),x86_64)
|
ifeq ($(ARCH),aarch64)
|
||||||
|
AFLAGS := -march=armv8-a -mcmodel=large -mgeneral-regs-only $(call check,-mno-outline-atomics) -mstrict-align
|
||||||
|
DEFINES += BOARD_$(BOARD)
|
||||||
|
else ifeq ($(ARCH),x86_64)
|
||||||
AFLAGS := -Wa,--divide,--noexecstack -march=x86-64-v2 -mcmodel=kernel -mgeneral-regs-only -mno-red-zone
|
AFLAGS := -Wa,--divide,--noexecstack -march=x86-64-v2 -mcmodel=kernel -mgeneral-regs-only -mno-red-zone
|
||||||
else
|
else
|
||||||
$(error $(ARCH) is not a valid architecture)
|
$(error $(ARCH) is not a valid architecture)
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* External Symbols
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2025 Udo Steinberg, BlueRock Security, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of the NOVA microhypervisor.
|
||||||
|
*
|
||||||
|
* NOVA is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* NOVA is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License version 2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "types.hpp"
|
||||||
|
|
||||||
|
extern char GIT_VER;
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Low-Level Functions
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2025 Udo Steinberg, BlueRock Security, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of the NOVA microhypervisor.
|
||||||
|
*
|
||||||
|
* NOVA is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* NOVA is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License version 2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "compiler.hpp"
|
||||||
|
|
||||||
|
static inline void pause()
|
||||||
|
{
|
||||||
|
asm volatile ("yield" : : : "memory");
|
||||||
|
}
|
||||||
|
|
||||||
|
[[noreturn]] static inline void shutdown()
|
||||||
|
{
|
||||||
|
for (;;)
|
||||||
|
asm volatile ("wfi" : : : "memory");
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Virtual-Memory Layout
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2025 Udo Steinberg, BlueRock Security, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of the NOVA microhypervisor.
|
||||||
|
*
|
||||||
|
* NOVA is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* NOVA is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License version 2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "alignment.hpp"
|
||||||
|
#include "board.hpp"
|
||||||
|
|
||||||
|
#ifndef RAM_SIZE
|
||||||
|
#define RAM_SIZE 0x80000000 // Assume 2GiB populated
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef RAM_BASE
|
||||||
|
#define LOAD_ADDR 0
|
||||||
|
#else
|
||||||
|
#define LOAD_ADDR (RAM_BASE + RAM_SIZE - 0x2000000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PTE_BPL 9
|
||||||
|
#define PAGE_BITS 12
|
||||||
|
#define LEVL_BITS(L) ((L) * PTE_BPL + PAGE_BITS)
|
||||||
|
#define PAGE_SIZE(L) BITN (LEVL_BITS (L))
|
||||||
|
#define OFFS_MASK(L) (PAGE_SIZE (L) - 1)
|
||||||
|
|
||||||
|
#define LINK_ADDR LOAD_ADDR
|
||||||
|
#define MMAP_CPU_DATA 0
|
||||||
|
#define OFFSET (LINK_ADDR - LOAD_ADDR)
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* Startup Code
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2025 Udo Steinberg, BlueRock Security, Inc.
|
||||||
|
*
|
||||||
|
* This file is part of the NOVA microhypervisor.
|
||||||
|
*
|
||||||
|
* NOVA is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* NOVA is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License version 2 for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "arch.hpp"
|
||||||
|
#include "memory.hpp"
|
||||||
|
|
||||||
|
.global __init_bsp
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Macros
|
||||||
|
*/
|
||||||
|
.macro DCACHE OP
|
||||||
|
mrs x3, ctr_el0
|
||||||
|
ubfm x3, x3, #16, #19
|
||||||
|
mov x2, #4
|
||||||
|
lsl x2, x2, x3
|
||||||
|
add x1, x0, x1
|
||||||
|
sub x3, x2, #1
|
||||||
|
bic x0, x0, x3
|
||||||
|
1: dc \OP, x0
|
||||||
|
add x0, x0, x2
|
||||||
|
cmp x0, x1
|
||||||
|
blo 1b
|
||||||
|
dsb sy
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialization Code
|
||||||
|
*/
|
||||||
|
.section .init
|
||||||
|
|
||||||
|
__init_bsp:
|
||||||
|
// Determine image boundaries
|
||||||
|
adrp x22, NOVA_HPAS
|
||||||
|
adrp x23, NOVA_HPAE
|
||||||
|
mov x24, LINK_ADDR
|
||||||
|
sub x24, x24, x22
|
||||||
|
|
||||||
|
// Refuse invalid load address
|
||||||
|
and x2, x22, #ALIGNMENT_OFFS (ALIGNMENT_NOVA)
|
||||||
|
cbnz x2, .
|
||||||
|
|
||||||
|
// Clean image to PoC
|
||||||
|
mov x0, x22
|
||||||
|
sub x1, x23, x22
|
||||||
|
DCACHE cvac
|
||||||
|
|
||||||
|
1: msr daifset, #0xf
|
||||||
|
msr spsel, #0x1
|
||||||
|
|
||||||
|
// Enable I$, D$, Disable MMU
|
||||||
|
mrs x0, sctlr_el2
|
||||||
|
orr x0, x0, #SCTLR_I
|
||||||
|
orr x0, x0, #SCTLR_C
|
||||||
|
bic x0, x0, #SCTLR_M
|
||||||
|
msr sctlr_el2, x0
|
||||||
|
isb
|
||||||
|
|
||||||
|
// Zero BSS
|
||||||
|
adr x0, ZERO_HPAS
|
||||||
|
.Lbss_loop: str xzr, [x0], #__SIZEOF_POINTER__
|
||||||
|
cmp x0, x23
|
||||||
|
blo .Lbss_loop
|
||||||
|
|
||||||
|
// Invalidate stale cache lines
|
||||||
|
adr x0, ZERO_HPAS
|
||||||
|
sub x1, x23, x0
|
||||||
|
DCACHE ivac
|
||||||
|
|
||||||
|
// Switch to boot stack
|
||||||
|
adr x0, STACK
|
||||||
|
mov sp, x0
|
||||||
|
|
||||||
|
b .
|
Loading…
Reference in New Issue