running with kvm

This commit is contained in:
nakst 2021-09-19 11:47:22 +01:00
parent 5b9b87afe9
commit bae0cc032e
3 changed files with 35 additions and 26 deletions

View File

@ -73,9 +73,9 @@ Start the build system.
Follow the on-screen instructions to build a cross compiler. Follow the on-screen instructions to build a cross compiler.
Once complete, you can test the operating system in an emulator. Once complete, you can test the operating system in an emulator.
* Please note that by default a checked build is produced, which runs additional checks at runtime (such as heap validation on every allocation and deallocation). This may impact the performance during testing. * If you have Qemu and KVM installed, run `k` in the build system. **Recommended!**
* If you have Qemu installed, run `t2` in the build system. * If you have Qemu installed, run `t2` in the build system.
* If you have VirtualBox installed, make a 128MB drive called `vbox.vdi` in the `bin` folder, attach it as a to a virtual machine called "Essence" (choose "Windows 7 64-bit" as the OS), and run `v` in the build system. * If you have VirtualBox installed, make a 128MB drive called `vbox.vdi` in the `bin` folder, attach it to a virtual machine called "Essence" (choose "Windows 7 64-bit" as the OS), and run `v` in the build system.
## Configuration ## Configuration

View File

@ -54,8 +54,8 @@ const EsStyle styleSettingsGroupContainer2 = {
const uint32_t windowColors[] = { const uint32_t windowColors[] = {
0xFF0032, 0xFF0032,
0xFF6042, 0xFF6042,
0xFF7F24, 0xFF7F24, // TODO Hue shift looks bad.
0xFFFF24, 0xFFFF24, // TODO Hue shift looks bad.
0x67EFC4, 0x67EFC4,
0x54ACE5, 0x54ACE5,
0x448CF5, 0x448CF5,

View File

@ -143,7 +143,7 @@ void BuildAPIDependencies() {
CallSystem("cp -p kernel/module.h root/Applications/POSIX/include"); CallSystem("cp -p kernel/module.h root/Applications/POSIX/include");
} }
void OutputStartOfBuildINI(FILE *f) { void OutputStartOfBuildINI(FILE *f, bool forceDebugBuildOff) {
LoadOptions(); LoadOptions();
FILE *f2 = popen("which nasm", "r"); FILE *f2 = popen("which nasm", "r");
@ -174,6 +174,10 @@ void OutputStartOfBuildINI(FILE *f) {
continue; continue;
} }
if (0 == strcmp(option->id, "Flag.DEBUG_BUILD") && forceDebugBuildOff) {
continue;
}
if (option->type == OPTION_TYPE_BOOL && option->state.b) { if (option->type == OPTION_TYPE_BOOL && option->state.b) {
fprintf(f, "-D%s ", option->id + 5); fprintf(f, "-D%s ", option->id + 5);
} else if (option->type == OPTION_TYPE_STRING) { } else if (option->type == OPTION_TYPE_STRING) {
@ -236,10 +240,12 @@ void OutputStartOfBuildINI(FILE *f) {
void BuildUtilities(); void BuildUtilities();
#define COMPILE_ENABLE_OPTIMISATIONS (1 << 0)
#define COMPILE_SKIP_COMPILE (1 << 1) #define COMPILE_SKIP_COMPILE (1 << 1)
#define COMPILE_DO_BUILD (1 << 2) #define COMPILE_DO_BUILD (1 << 2)
#define COMPILE_FOR_EMULATOR (1 << 3) #define COMPILE_FOR_EMULATOR (1 << 3)
#define OPTIMISE_OFF (1 << 4)
#define OPTIMISE_ON (1 << 5)
#define OPTIMISE_FULL (1 << 6)
void Compile(uint32_t flags, int partitionSize, const char *volumeLabel) { void Compile(uint32_t flags, int partitionSize, const char *volumeLabel) {
buildStartTimeStamp = time(NULL); buildStartTimeStamp = time(NULL);
@ -250,9 +256,9 @@ void Compile(uint32_t flags, int partitionSize, const char *volumeLabel) {
FILE *f = fopen("bin/build.ini", "wb"); FILE *f = fopen("bin/build.ini", "wb");
OutputStartOfBuildINI(f); OutputStartOfBuildINI(f, flags & OPTIMISE_FULL);
fprintf(f, "[general]\nfor_emulator=%d\noptimise=%d\nskip_compile=%d\n\n", fprintf(f, "[general]\nfor_emulator=%d\noptimise=%d\nskip_compile=%d\n\n",
!!(flags & COMPILE_FOR_EMULATOR), !!(flags & COMPILE_ENABLE_OPTIMISATIONS), !!(flags & COMPILE_SKIP_COMPILE)); !!(flags & COMPILE_FOR_EMULATOR), (flags & OPTIMISE_ON) || (flags & OPTIMISE_FULL), !!(flags & COMPILE_SKIP_COMPILE));
uintptr_t fontIndex = 0; uintptr_t fontIndex = 0;
@ -345,7 +351,7 @@ void BuildUtilities() {
} }
} }
void Build(bool enableOptimisations, bool compile) { void Build(int optimise, bool compile) {
struct timespec startTime, endTime; struct timespec startTime, endTime;
clock_gettime(CLOCK_REALTIME, &startTime); clock_gettime(CLOCK_REALTIME, &startTime);
@ -375,7 +381,7 @@ void Build(bool enableOptimisations, bool compile) {
#endif #endif
LoadOptions(); LoadOptions();
Compile((enableOptimisations ? COMPILE_ENABLE_OPTIMISATIONS : 0) | (compile ? 0 : COMPILE_SKIP_COMPILE) | COMPILE_DO_BUILD | COMPILE_FOR_EMULATOR, Compile(optimise | (compile ? 0 : COMPILE_SKIP_COMPILE) | COMPILE_DO_BUILD | COMPILE_FOR_EMULATOR,
atoi(GetOptionString("Emulator.PrimaryDriveMB")), NULL); atoi(GetOptionString("Emulator.PrimaryDriveMB")), NULL);
clock_gettime(CLOCK_REALTIME, &endTime); clock_gettime(CLOCK_REALTIME, &endTime);
@ -468,13 +474,13 @@ void Run(int emulator, int log, int debug) {
const char *logFlags = log == LOG_VERBOSE ? "-d cpu_reset,int > bin/qemu_log.txt 2>&1" const char *logFlags = log == LOG_VERBOSE ? "-d cpu_reset,int > bin/qemu_log.txt 2>&1"
: (log == LOG_NORMAL ? " > bin/qemu_log.txt 2>&1" : " > /dev/null 2>&1"); : (log == LOG_NORMAL ? " > bin/qemu_log.txt 2>&1" : " > /dev/null 2>&1");
CallSystemF("%s %s qemu-system-x86_64 %s%s %s -m %d -s %s -smp cores=%d -cpu Haswell " CallSystemF("%s %s qemu-system-x86_64 %s%s %s -m %d %s -smp cores=%d -cpu Haswell "
" -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0,id=mykeyboard -device usb-mouse,bus=xhci.0,id=mymouse " " -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0,id=mykeyboard -device usb-mouse,bus=xhci.0,id=mymouse "
" -netdev user,id=u1 -device e1000,netdev=u1 -object filter-dump,id=f1,netdev=u1,file=bin/net.dat " " -netdev user,id=u1 -device e1000,netdev=u1 -object filter-dump,id=f1,netdev=u1,file=bin/net.dat "
" %s %s %s %s %s %s ", " %s %s %s %s %s %s ",
audioFlags, IsOptionEnabled("Emulator.RunWithSudo") ? "sudo " : "", drivePrefix, driveFlags, cdromFlags, audioFlags, IsOptionEnabled("Emulator.RunWithSudo") ? "sudo " : "", drivePrefix, driveFlags, cdromFlags,
atoi(GetOptionString("Emulator.MemoryMB")), atoi(GetOptionString("Emulator.MemoryMB")),
debug ? (debug == DEBUG_NONE ? "-enable-kvm" : "-S") : "", debug ? (debug == DEBUG_NONE ? "-enable-kvm" : "-s -S") : "-s",
atoi(GetOptionString("Emulator.Cores")), audioFlags2, logFlags, usbFlags, usbFlags2, secondaryDriveFlags, biosFlags); atoi(GetOptionString("Emulator.Cores")), audioFlags2, logFlags, usbFlags, usbFlags2, secondaryDriveFlags, biosFlags);
} break; } break;
@ -713,7 +719,7 @@ void BuildCrossCompiler() {
BuildUtilities(); BuildUtilities();
BuildAPIDependencies(); BuildAPIDependencies();
FILE *f = fopen("bin/build.ini", "wb"); FILE *f = fopen("bin/build.ini", "wb");
OutputStartOfBuildINI(f); OutputStartOfBuildINI(f, false);
fclose(f); fclose(f);
if (CallSystem("bin/build_core standard bin/build.ini")) goto fail; if (CallSystem("bin/build_core standard bin/build.ini")) goto fail;
} }
@ -1060,7 +1066,7 @@ void GatherFilesForInstallerArchive(FILE *file, const char *path1, const char *p
closedir(directory); closedir(directory);
} }
void BuildAndRun(bool optimise, bool compile, bool debug, int emulator) { void BuildAndRun(int optimise, bool compile, int debug, int emulator) {
Build(optimise, compile); Build(optimise, compile);
if (encounteredErrors) { if (encounteredErrors) {
@ -1087,25 +1093,27 @@ void DoCommand(const char *l) {
} }
if (0 == strcmp(l, "b") || 0 == strcmp(l, "build")) { if (0 == strcmp(l, "b") || 0 == strcmp(l, "build")) {
BuildAndRun(false /* optimise */, true /* compile */, false /* debug */, -1); BuildAndRun(OPTIMISE_OFF, true /* compile */, false /* debug */, -1);
} else if (0 == strcmp(l, "opt") || 0 == strcmp(l, "build-optimised")) { } else if (0 == strcmp(l, "opt") || 0 == strcmp(l, "build-optimised")) {
BuildAndRun(true /* optimise */, true /* compile */, false /* debug */, -1); BuildAndRun(OPTIMISE_ON, true /* compile */, false /* debug */, -1);
} else if (0 == strcmp(l, "d") || 0 == strcmp(l, "debug")) { } else if (0 == strcmp(l, "d") || 0 == strcmp(l, "debug")) {
BuildAndRun(false /* optimise */, true /* compile */, true /* debug */, EMULATOR_QEMU); BuildAndRun(OPTIMISE_OFF, true /* compile */, true /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "d3") || 0 == strcmp(l, "debug-without-compile")) { } else if (0 == strcmp(l, "d3") || 0 == strcmp(l, "debug-without-compile")) {
BuildAndRun(false /* optimise */, false /* compile */, true /* debug */, EMULATOR_QEMU); BuildAndRun(OPTIMISE_OFF, false /* compile */, true /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "v") || 0 == strcmp(l, "vbox")) { } else if (0 == strcmp(l, "v") || 0 == strcmp(l, "vbox")) {
BuildAndRun(true /* optimise */, true /* compile */, false /* debug */, EMULATOR_VIRTUALBOX); BuildAndRun(OPTIMISE_ON, true /* compile */, false /* debug */, EMULATOR_VIRTUALBOX);
} else if (0 == strcmp(l, "v2") || 0 == strcmp(l, "vbox-without-opt")) { } else if (0 == strcmp(l, "v2") || 0 == strcmp(l, "vbox-without-opt")) {
BuildAndRun(false /* optimise */, true /* compile */, false /* debug */, EMULATOR_VIRTUALBOX); BuildAndRun(OPTIMISE_OFF, true /* compile */, false /* debug */, EMULATOR_VIRTUALBOX);
} else if (0 == strcmp(l, "v3") || 0 == strcmp(l, "vbox-without-compile")) { } else if (0 == strcmp(l, "v3") || 0 == strcmp(l, "vbox-without-compile")) {
BuildAndRun(false /* optimise */, false /* compile */, false /* debug */, EMULATOR_VIRTUALBOX); BuildAndRun(OPTIMISE_OFF, false /* compile */, false /* debug */, EMULATOR_VIRTUALBOX);
} else if (0 == strcmp(l, "t") || 0 == strcmp(l, "qemu-with-opt")) { } else if (0 == strcmp(l, "t") || 0 == strcmp(l, "qemu-with-opt")) {
BuildAndRun(true /* optimise */, true /* compile */, false /* debug */, EMULATOR_QEMU); BuildAndRun(OPTIMISE_ON, true /* compile */, false /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "t2") || 0 == strcmp(l, "test")) { } else if (0 == strcmp(l, "t2") || 0 == strcmp(l, "test")) {
BuildAndRun(false /* optimise */, true /* compile */, false /* debug */, EMULATOR_QEMU); BuildAndRun(OPTIMISE_OFF, true /* compile */, false /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "t3") || 0 == strcmp(l, "qemu-without-compile")) { } else if (0 == strcmp(l, "t3") || 0 == strcmp(l, "qemu-without-compile")) {
BuildAndRun(false /* optimise */, false /* compile */, false /* debug */, EMULATOR_QEMU); BuildAndRun(OPTIMISE_OFF, false /* compile */, false /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "k") || 0 == strcmp(l, "qemu-with-kvm")) {
BuildAndRun(OPTIMISE_FULL, true /* compile */, DEBUG_NONE /* debug */, EMULATOR_QEMU);
} else if (0 == strcmp(l, "exit") || 0 == strcmp(l, "x") || 0 == strcmp(l, "quit") || 0 == strcmp(l, "q")) { } else if (0 == strcmp(l, "exit") || 0 == strcmp(l, "x") || 0 == strcmp(l, "quit") || 0 == strcmp(l, "q")) {
exit(0); exit(0);
} else if (0 == strcmp(l, "compile") || 0 == strcmp(l, "c")) { } else if (0 == strcmp(l, "compile") || 0 == strcmp(l, "c")) {
@ -1279,12 +1287,13 @@ void DoCommand(const char *l) {
} }
bool wantISO = 0 == strcmp(argv[2], "iso"); bool wantISO = 0 == strcmp(argv[2], "iso");
uint32_t flags = COMPILE_ENABLE_OPTIMISATIONS | COMPILE_DO_BUILD; uint32_t flags = OPTIMISE_ON | COMPILE_DO_BUILD;
const char *label = NULL; const char *label = NULL;
for (int i = 4; i < argc; i++) { for (int i = 4; i < argc; i++) {
if (0 == strcmp(argv[i], "noopt")) { if (0 == strcmp(argv[i], "noopt")) {
flags &= ~COMPILE_ENABLE_OPTIMISATIONS; flags &= ~OPTIMISE_ON;
flags |= OPTIMISE_OFF;
} else if (0 == memcmp(argv[i], "label=", 6)) { } else if (0 == memcmp(argv[i], "label=", 6)) {
label = argv[i] + 6; label = argv[i] + 6;
} }