blob: 8d1be5fb445d58a9140bb4d24eff04816c44e155 (
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
{
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;
}
);
}
|