aos/hake/ARMv8.hs
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

204 lines
7.7 KiB
Haskell

--------------------------------------------------------------------------
-- Copyright (c) 2015, ETH Zurich.
-- All rights reserved.
--
-- This file is distributed under the terms in the attached LICENSE file.
-- If you do not find this file, copies can be found by writing to:
-- ETH Zurich D-INFK, CAB F.78, Universitaetstrasse 6, CH-8092 Zurich.
-- Attn: Systems Group.
--
-- Architectural definitions for Barrelfish on ARMv8.
--
--------------------------------------------------------------------------
module ARMv8 where
import HakeTypes
import qualified Config
import qualified ArchDefaults
import Data.Char
-------------------------------------------------------------------------
--
-- Architecture specific definitions for ARM
--
-------------------------------------------------------------------------
arch = "armv8"
archFamily = "aarch64"
compiler = Config.aarch64_cc
objcopy = Config.aarch64_objcopy
objdump = Config.aarch64_objdump
ar = Config.aarch64_ar
ranlib = Config.aarch64_ranlib
cxxcompiler = Config.aarch64_cxx
ourCommonFlags = [ Str "-fno-unwind-tables",
Str "-Wno-packed-bitfield-compat",
Str "-fno-stack-protector",
Str "-mcpu=cortex-a57",
Str "-march=armv8-a",
Str "-mabi=lp64",
Str "-mstrict-align",
Str "-fPIE",
-- The dispatcher needs a scratch register on ARMv8.
-- We use r18, which is reserved as the 'platform register'
-- by the ARM-64 ABI.
Str "-ffixed-x18",
Str "-D__ARM_CORTEX__",
Str "-D__ARM_ARCH_8A__",
-- Str "-DPREFER_SIZE_OVER_SPEED",
Str "-Wno-unused-but-set-variable",
Str "-Wno-format"
]
cFlags = ArchDefaults.commonCFlags
++ ArchDefaults.commonFlags
++ ourCommonFlags
cxxFlags = ArchDefaults.commonCxxFlags
++ ArchDefaults.commonFlags
++ ourCommonFlags
++ [Str "-std=gnu++11"]
cDefines = ArchDefaults.cDefines options
ourLdFlags = [ Str "-Wl,--build-id=none", Str "-static" ]
ldFlags = ArchDefaults.ldFlags arch ++ ourLdFlags
ldCxxFlags = ArchDefaults.ldCxxFlags arch ++ ourLdFlags
stdLibs = ArchDefaults.stdLibs arch
options = (ArchDefaults.options arch archFamily) {
optFlags = cFlags,
optCxxFlags = cxxFlags,
optDefines = cDefines,
optDependencies =
[ PreDep InstallTree arch "/include/trace_definitions/trace_defs.h",
PreDep InstallTree arch "/include/errors/errno.h",
PreDep InstallTree arch "/include/barrelfish_kpi/capbits.h",
PreDep InstallTree arch "/include/asmoffsets.h"
],
optLdFlags = ldFlags,
optLdCxxFlags = ldCxxFlags,
optLibs = stdLibs,
optInterconnectDrivers = ["lmp", "ump", "multihop", "local"],
optFlounderBackends = ["lmp", "ump", "multihop", "local"]
}
--
-- Compilers
--
cCompiler = ArchDefaults.cCompiler arch compiler Config.cOptFlags
cxxCompiler = ArchDefaults.cxxCompiler arch cxxcompiler Config.cOptFlags
makeDepend = ArchDefaults.makeDepend arch compiler
makeCxxDepend = ArchDefaults.makeCxxDepend arch cxxcompiler
cToAssembler = ArchDefaults.cToAssembler arch compiler Config.cOptFlags
assembler = ArchDefaults.assembler arch compiler Config.cOptFlags
archive = ArchDefaults.archive arch
linker = ArchDefaults.linker arch compiler
ldtLinker = ArchDefaults.ldtLinker arch compiler
strip = ArchDefaults.strip arch objcopy
debug = ArchDefaults.debug arch objcopy
cxxlinker = ArchDefaults.cxxlinker arch cxxcompiler
ldtCxxlinker = ArchDefaults.ldtCxxlinker arch cxxcompiler
--
-- The kernel needs different flags
--
kernelCFlags = [ Str s | s <- [ "-fno-builtin",
"-fno-unwind-tables",
"-nostdinc",
"-std=c99",
"-mcpu=cortex-a57",
"-march=armv8-a+nofp",
"-mgeneral-regs-only",
"-mabi=lp64",
"-mstrict-align",
"-U__linux__",
"-Wall",
"-Wshadow",
"-Wstrict-prototypes",
"-Wold-style-definition",
"-Wmissing-prototypes",
"-Wmissing-declarations",
"-Wmissing-field-initializers",
"-Wredundant-decls",
"-Werror",
"-imacros deputy/nodeputy.h",
"-fno-stack-check",
"-ffreestanding",
"-fomit-frame-pointer",
"-Wmissing-noreturn",
"-D__ARM_CORTEX__",
"-D__ARM_ARCH_8A__",
"-DPREFER_SIZE_OVER_SPEED",
"-Wno-unused-but-set-variable",
"-Wno-format"
]]
kernelLdFlags = [ Str "-Wl,-N",
Str "-pie",
Str "-fno-builtin",
Str "-nostdlib",
Str "-Wl,--fatal-warnings",
Str "-Wl,--build-id=none"
]
--
-- Link the kernel (CPU Driver)
--
linkKernel :: Options -> [String] -> [String] -> String -> String -> HRule
linkKernel opts objs libs name driverType=
let linkscript = "/kernel/" ++ name ++ ".lds"
kernelmap = "/kernel/" ++ name ++ ".map"
kasmdump = "/kernel/" ++ name ++ ".asm"
kbinary = "/sbin/" ++ name
kdebug = kbinary ++ ".debug"
kfull = kbinary ++ ".full"
in
Rules ([ Rule ([ Str compiler ] ++
map Str Config.cOptFlags ++
[ NStr "-T", In BuildTree arch linkscript,
Str "-o",
Out arch kfull,
NStr "-Wl,-Map,", Out arch kernelmap
]
++ (optLdFlags opts)
++
[ In BuildTree arch o | o <- objs ]
++
[ In BuildTree arch l | l <- libs ]
++
(ArchDefaults.kernelLibs arch)
++
[ NL, NStr "bash -c \"echo -e '\\0002'\" | dd of=",
Out arch kfull,
Str "bs=1 seek=16 count=1 conv=notrunc status=noxfer"
]
),
Rule $ strip opts kfull kdebug kbinary,
Rule $ debug opts kfull kdebug,
-- Generate kernel assembly dump
Rule [ Str objdump,
Str "-d",
Str "-M reg-names-raw",
In BuildTree arch kbinary,
Str ">",
Out arch kasmdump ],
Rule [ Str "cpp",
NStr "-I", NoDep SrcTree "src" "/kernel/include/arch/armv8",
NStr "-I", NoDep SrcTree "src" "/kernel/include",
Str "-D__ASSEMBLER__",
Str "-P", In SrcTree "src"
("/kernel/arch/armv8/"++driverType++".lds.in"),
Out arch linkscript
]
] ++ [ Phony ((map toUpper arch) ++ "_All") False
[ Dep BuildTree arch kbinary]])