Rodrigo Arias Mallo
934b67ac0b
Events from the kthread that dumps the buffer to the console are filtered, otherwise we make an infinite loop.
282 lines
8.5 KiB
Nix
282 lines
8.5 KiB
Nix
{ config, lib, pkgs, modulesPath, self, ... }:
|
|
|
|
{
|
|
imports = [
|
|
"${modulesPath}/installer/sd-card/sd-image.nix"
|
|
];
|
|
|
|
#nixpkgs.crossSystem = {
|
|
# system = "riscv64-linux";
|
|
# gcc.arch = "rv64imafd";
|
|
# gcc.tune = "generic";
|
|
#};
|
|
|
|
boot.kernelPackages = pkgs.linuxPackages_latest;
|
|
boot = {
|
|
kernelPatches = [
|
|
{
|
|
name = assert false; "sbi-early-console";
|
|
patch = null;
|
|
extraConfig =
|
|
# Early console via SBI
|
|
''
|
|
RISCV_SBI y
|
|
RISCV_SBI_V01 y
|
|
SERIAL_EARLYCON y
|
|
SERIAL_EARLYCON_RISCV_SBI y
|
|
HVC_DRIVER y
|
|
HVC_RISCV_SBI y
|
|
''
|
|
# Enable console driver
|
|
+''
|
|
SERIAL_8250 y
|
|
SERIAL_8250_CONSOLE y
|
|
SERIAL_OF_PLATFORM y
|
|
CONSOLE_POLL y
|
|
''
|
|
# Allows regions of persistent memory to be described in the device-tree.
|
|
+ ''
|
|
OF_PMEM y
|
|
''
|
|
# Allow you to use a contiguous range of reserved memory as one or more
|
|
# persistent block devices (/dev/pmem0)
|
|
+ ''
|
|
LIBNVDIMM y
|
|
BLK_DEV_PMEM y
|
|
''
|
|
# No vector extensions
|
|
+ ''
|
|
RISCV_ISA_V n
|
|
RISCV_ISA_V_DEFAULT_ENABLE n
|
|
''
|
|
# Debugging
|
|
+ ''
|
|
DEBUG_KERNEL y
|
|
DEBUG_MISC y
|
|
DEBUG_WX y
|
|
MAGIC_SYSRQ y
|
|
SYSRQ_SERIAL y
|
|
DEBUG_VM y
|
|
SOFTLOCKUP_DETECTOR y
|
|
SOFTLOCKUP_DETECTOR_INTR_STORM y
|
|
HARDLOCKUP_DETECTOR y
|
|
DETECT_HUNG_TASK y
|
|
WQ_WATCHDOG y
|
|
WQ_CPU_INTENSIVE_REPORT y
|
|
TRACING y
|
|
BOOTTIME_TRACING y
|
|
STRICT_DEVMEM n
|
|
''
|
|
# Disable SMP so we don't have IPI
|
|
+ ''
|
|
SMP n
|
|
''
|
|
;
|
|
}
|
|
];
|
|
|
|
initrd = {
|
|
# Avoid zstd as we don't have the tools in "cucu" machine
|
|
compressor = "gzip";
|
|
kernelModules = [ ];
|
|
|
|
# Write a counter to the DMA region, so we can check the kernel is not
|
|
# dead. Monitor from the host with:
|
|
# while [ 1 ]; do xxd -s $((0x1bfff0000 - 0x60000000)) \
|
|
# -l 4 /dev/qdma34000-MM-1; sleep 0.2; done
|
|
preDeviceCommands = ''
|
|
echo "Creating a heartbeat counter at 0x1bfff0000"
|
|
sh -c 'hb=0; while [ 1 ]; do let hb=$hb+1; devmem 0x1bfff0000 32 $hb; done' &
|
|
''
|
|
+
|
|
# Exclude the second pid, which is the kthread that will dump the trace to
|
|
# the console, otherwise we live lock the kernel. Then enable the sched
|
|
# events.
|
|
''
|
|
echo "Exclude pid 2 from sched"
|
|
echo '(prev_pid != 2 && next_pid != 2)' > /sys/kernel/debug/tracing/events/sched/filter
|
|
echo "Enable all events from sched subsystem"
|
|
echo 1 > /sys/kernel/debug/tracing/events/sched/enable
|
|
'';
|
|
};
|
|
|
|
loader = {
|
|
grub.enable = false;
|
|
generic-extlinux-compatible.enable = true;
|
|
};
|
|
};
|
|
|
|
# No network
|
|
services.openssh.enable = false;
|
|
|
|
# Run getty on /dev/console and restartt until it works
|
|
systemd.services."serial-getty@console" = {
|
|
enable = true;
|
|
wantedBy = [ "getty.target" ]; # to start at boot
|
|
serviceConfig.Restart = "always";
|
|
};
|
|
|
|
# Disable hvc0 as it is racing for the same console
|
|
systemd.services."serial-getty@hvc0" = {
|
|
enable = lib.mkForce false;
|
|
wantedBy = lib.mkForce [ ];
|
|
};
|
|
|
|
sdImage = {
|
|
# The image will be loaded as-is in memory, so no compression
|
|
compressImage = false;
|
|
imageName = "rootfs.img";
|
|
# Not needed for now
|
|
expandOnBoot = false;
|
|
populateFirmwareCommands = "";
|
|
populateRootCommands = ''
|
|
mkdir -p ./files/boot
|
|
${config.boot.loader.generic-extlinux-compatible.populateCmd} \
|
|
-c ${config.system.build.toplevel} \
|
|
-d ./files/boot
|
|
'';
|
|
};
|
|
|
|
nixpkgs.overlays = [ (final: prev: {
|
|
#busybox = prev.busybox.overrideAttrs (old: {
|
|
# # Print some debug lines on switch_root to see where it hangs.
|
|
# patches = (old.patches or []) ++ [ ./busybox-debug.patch ];
|
|
#});
|
|
|
|
linuxPackages_latest = prev.linuxPackages_latest;
|
|
#linuxPackages_latest = prev.linuxPackages_latest.extend (lib.const (ksuper: {
|
|
# kernel = ksuper.kernel.override {
|
|
# stdenv = prev.gcc8Stdenv;
|
|
# };
|
|
#}));
|
|
|
|
ox-dtb = prev.runCommand "ox.dtb" {
|
|
dtsFile = ./ox-plic.dts;
|
|
#dtsFile = ./xavi.dts;
|
|
nativeBuildInputs = [ prev.buildPackages.dtc ];
|
|
} "dtc -O dtb -o $out $dtsFile";
|
|
|
|
uboot = prev.ubootQemuRiscv64Smode.override {
|
|
filesToInstall = [ "u-boot.bin" "u-boot-nodtb.bin" ];
|
|
#version = "2023.07.02-print-cpu-probe";
|
|
#src = builtins.fetchGit {
|
|
# url = "file:///home/Computational/rarias/riscv/u-boot";
|
|
# rev = "f80a22a480f0e4157647bacf90e663be457c72c4";
|
|
#};
|
|
#patches = [ ./u-boot-debug.patch ];
|
|
#
|
|
# CONFIG_SERIAL_PRESENT=n
|
|
# CONFIG_SYS_NS16550=n
|
|
extraConfig = ''
|
|
CONFIG_RISCV_ISA_C=n
|
|
CONFIG_REQUIRE_SERIAL_CONSOLE=n
|
|
CONFIG_SERIAL=y
|
|
CONFIG_SERIAL_PUTS=y
|
|
CONFIG_SHOW_BOOT_PROGRESS=y
|
|
CONFIG_SHOW_REGS=y
|
|
CONFIG_LIBCOMMON_SUPPORT=y
|
|
CONFIG_SERIAL_SEARCH_ALL=n
|
|
CONFIG_SERIAL_PROBE_ALL=n
|
|
CONFIG_OF_CONTROL=y
|
|
CONFIG_OF_EMBED=y
|
|
CONFIG_OF_HAS_PRIOR_STAGE=y
|
|
CONFIG_BLKMAP=y
|
|
CONFIG_CMD_BLKMAP=y
|
|
CONFIG_SBI_V01=y
|
|
CONFIG_DEBUG_UART=y
|
|
CONFIG_DEBUG_UART_ANNOUNCE=y
|
|
CONFIG_DEBUG_SBI_CONSOLE=y
|
|
CONFIG_SMP=n
|
|
CONFIG_TRACE_EARLY=y
|
|
''
|
|
# # Enable debug logs
|
|
# +
|
|
# ''
|
|
# CONFIG_LOG=y
|
|
# CONFIG_LOGLEVEL=9
|
|
# CONFIG_LOG_MAX_LEVEL=9
|
|
# CONFIG_LOG_DEFAULT_LEVEL=9
|
|
# ''
|
|
;
|
|
extraMakeFlags = [
|
|
#"KCPPFLAGS=-DLOG_DEBUG"
|
|
#"EXT_DTB=${final.ox-dtb}"
|
|
];
|
|
};
|
|
|
|
uboot-env = let
|
|
init = "${config.system.build.toplevel}/init";
|
|
initrd = "${config.system.build.initialRamdisk}/initrd";
|
|
rev = if self ? rev then self.rev
|
|
else throw ("Refusing to build from a dirty Git tree!");
|
|
in prev.runCommand "uboot.txt" {} ''
|
|
cat > $out <<EOF
|
|
# Git commit: ${rev}
|
|
|
|
# Create pmem of 3 GiB [0x140000000, 0x200000000)
|
|
fdt mknode / pmem@0x140000000
|
|
fdt set /pmem@0x140000000 compatible "pmem-region"
|
|
fdt set /pmem@0x140000000 reg <0x1 0x40000000 0x0 0xc0000000>
|
|
|
|
# Reduce memory to 3 GiB [0x80000000, 0x140000000)
|
|
fdt set /memory@80000000 reg <0x0 0x80000000 0x0 0xc0000000>
|
|
|
|
# Set kernel options
|
|
setenv debugargs "debug1 trace_options=sym-addr trace_event=initcall:* tp_printk trace_buf_size=1M"
|
|
setenv bootargs "root=/dev/ram0 loglevel=7 debug rw earlycon=sbi boot.trace console=hvc0 \''${debugargs} init=${init}"
|
|
|
|
EOF
|
|
|
|
# Populate the bood commands from the initrd size
|
|
echo "# Boot system" >> $out
|
|
echo "setenv ramdisk_size $(stat --format %s $(readlink -f ${initrd}))" >> $out
|
|
echo 'booti ''${kernel_addr_r} ''${ramdisk_addr_r}:''${ramdisk_size} ''${fdtcontroladdr}' >> $out
|
|
'';
|
|
|
|
opensbi = prev.opensbi.overrideAttrs (old: rec {
|
|
version = "1.4";
|
|
src = prev.fetchFromGitHub {
|
|
owner = "riscv-software-src";
|
|
repo = "opensbi";
|
|
rev = "v${version}";
|
|
hash = "sha256-T8ZeAzjM9aeTXitjE7s+m+jjGGtDo2jK1qO5EuKiVLU=";
|
|
};
|
|
#NIX_DEBUG=5;
|
|
makeFlags = [
|
|
"PLATFORM=fpga/ox_alveo"
|
|
#"CONFIG_SBI_ECALL_RFENCE=n"
|
|
#"PLATFORM_RISCV_ISA=rv64imafd" # No compressed instructions
|
|
#"PLATFORM_RISCV_ISA=rv64g" # No compressed instructions
|
|
#"PLATFORM_RISCV_ABI=lp64d"
|
|
"FW_PAYLOAD_PATH=${final.uboot}/u-boot.bin"
|
|
"FW_FDT_PATH=${final.ox-dtb}"
|
|
];
|
|
patches = [ ./ox-alveo-platform-plic.patch ];
|
|
});
|
|
# opensbi = prev.opensbi.overrideAttrs (old: {
|
|
# #NIX_DEBUG=5;
|
|
# # Compile dts to dtb form
|
|
# #nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ prev.buildPackages.dtc ];
|
|
# #preBuild = ''
|
|
# # dtc -O dtb -o ox.dtb ${./ox.dts}
|
|
# #'';
|
|
# makeFlags = old.makeFlags ++ [
|
|
# "PLATFORM=fpga/sargantana_alveo"
|
|
# #"PLATFORM_RISCV_ISA=rv64imafd" # No compressed instructions
|
|
# "PLATFORM_RISCV_ISA=rv64g" # No compressed instructions
|
|
# #"PLATFORM_RISCV_ABI=lp64d"
|
|
# "FW_PAYLOAD_PATH=${final.uboot}/u-boot-nodtb.bin"
|
|
# #"FW_FDT_PATH=ox.dtb"
|
|
# ];
|
|
# patches = [ ./alveo-uart-sbi-hack.patch ];
|
|
# });
|
|
# opensbi = prev.opensbi.overrideAttrs (old: {
|
|
# makeFlags = old.makeFlags ++ [
|
|
# "PLATFORM=fpga/openpiton"
|
|
# "FW_PAYLOAD_PATH=${final.uboot}/u-boot-nodtb.bin"
|
|
# ];
|
|
# patches = [ ./opensbi-lagarto-hun.patch ];
|
|
# });
|
|
}) ];
|
|
}
|