blob: c2bcf136e469af9da66b92b58080721ad2e42d11 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
{
inputs = {
fenix-flake = {
url = "github:nix-community/fenix";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = { self, fenix-flake, flake-utils, nixpkgs }:
flake-utils.lib.eachSystem [ "aarch64-linux" "x86_64-linux" ] (system:
let
pkgsBuild = nixpkgs.legacyPackages.${system};
pkgsHost = import nixpkgs {
inherit system;
crossSystem.config = "riscv64-unknown-none-elf";
};
fenix = fenix-flake.packages.${system};
toolchain = fenix.combine [
fenix.stable.cargo
fenix.stable.rustc
fenix.stable.clippy
fenix.targets.riscv64gc-unknown-none-elf.stable.rust-std
];
rust = pkgsHost.makeRustPlatform {
cargo = toolchain;
rustc = toolchain;
};
packages = rec {
boards = import ./boards {
inherit libkernel;
pkgs = pkgsHost;
};
libkernel = pkgsBuild.callPackage ./kernel { inherit rust; };
};
run-vm = pkgsBuild.writeShellApplication {
name = "run-vm";
runtimeInputs = [ pkgsBuild.qemu ];
text = ''
set -x
qemu-system-riscv64 \
-machine virt \
-m 1G \
-nographic \
-bios none \
-kernel ${packages.boards.qemu-virt}/kernel.elf \
"$@"
'';
};
in {
apps = {
default = {
type = "app";
program = pkgsBuild.lib.getExe run-vm;
};
run = {
type = "app";
program = pkgsBuild.lib.getExe run-vm;
};
debug = {
type = "app";
program = pkgsBuild.lib.getExe (pkgsBuild.writeShellApplication {
name = "run-vm-debug";
runtimeInputs = [ run-vm ];
text = ''
port=$(( 1000 * ("$(id -u)" - 990) ))
run-vm -gdb tcp::$port -S "$@"
'';
});
};
gdb = {
type = "app";
program = pkgsBuild.lib.getExe (pkgsBuild.writeShellApplication {
name = "gdb";
runtimeInputs = [ toolchain ];
text = ''
port=$(( 1000 * ("$(id -u)" - 990) ))
rust-gdb ${packages.boards.qemu-virt}/kernel.elf \
-ex "target remote 127.0.0.1:$port" \
-ex "set riscv use-compressed-breakpoints yes" \
-ex "layout asm" \
-ex "layout regs" \
-ex "focus cmd" \
-ex "tbreak hart0_boot" \
-ex "c"
'';
});
};
};
devShells.default = pkgsBuild.mkShell {
inputsFrom =
builtins.attrValues (flake-utils.lib.flattenTree packages);
nativeBuildInputs = [
pkgsBuild.cargo-watch
pkgsBuild.qemu
pkgsHost.stdenv.cc.bintools.bintools
];
CARGO_BUILD_TARGET = "riscv64gc-unknown-none-elf";
};
packages = flake-utils.lib.flattenTree packages;
});
}
|