mirror of https://gitlab.com/nakst/essence
rename dependency files folder; put full log in kernel panic report
This commit is contained in:
parent
e26fb975e6
commit
510d4d866f
|
@ -153,6 +153,8 @@ void ProcessorOut8Delayed(uint16_t port, uint8_t value) {
|
||||||
ProcessorOut8(port, value);
|
ProcessorOut8(port, value);
|
||||||
|
|
||||||
// Read an unused port to get a short delay.
|
// Read an unused port to get a short delay.
|
||||||
|
// TODO This might hang some old laptops after ACPI is enabled.
|
||||||
|
// See https://lwn.net/Articles/263418/
|
||||||
ProcessorIn8(IO_UNUSED_DELAY);
|
ProcessorIn8(IO_UNUSED_DELAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,13 @@ void BGADebugPutBlock(uintptr_t x, uintptr_t y, bool toggle) {
|
||||||
((KPCIDevice *) vboxDisplay->parent)->baseAddressesVirtual[0]);
|
((KPCIDevice *) vboxDisplay->parent)->baseAddressesVirtual[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int BGADebugPutData(const uint8_t *data, size_t dataBytes) {
|
||||||
|
return GraphicsDebugPutData32(data, dataBytes,
|
||||||
|
vboxDisplay->screenWidth, vboxDisplay->screenHeight,
|
||||||
|
vboxDisplay->screenWidth * 4,
|
||||||
|
((KPCIDevice *) vboxDisplay->parent)->baseAddressesVirtual[0]);
|
||||||
|
}
|
||||||
|
|
||||||
void BGADebugClearScreen() {
|
void BGADebugClearScreen() {
|
||||||
GraphicsDebugClearScreen32(vboxDisplay->screenWidth, vboxDisplay->screenHeight,
|
GraphicsDebugClearScreen32(vboxDisplay->screenWidth, vboxDisplay->screenHeight,
|
||||||
vboxDisplay->screenWidth * 4,
|
vboxDisplay->screenWidth * 4,
|
||||||
|
@ -67,6 +74,7 @@ void BGADeviceAttached(KDevice *_parent) {
|
||||||
// Setup the graphics target.
|
// Setup the graphics target.
|
||||||
device->updateScreen = BGAUpdateScreen;
|
device->updateScreen = BGAUpdateScreen;
|
||||||
device->debugPutBlock = BGADebugPutBlock;
|
device->debugPutBlock = BGADebugPutBlock;
|
||||||
|
device->debugPutData = BGADebugPutData;
|
||||||
device->debugClearScreen = BGADebugClearScreen;
|
device->debugClearScreen = BGADebugClearScreen;
|
||||||
ProcessorOut16(IO_BGA_INDEX, 1 /* x resolution */);
|
ProcessorOut16(IO_BGA_INDEX, 1 /* x resolution */);
|
||||||
device->screenWidth = ProcessorIn16(IO_BGA_DATA);
|
device->screenWidth = ProcessorIn16(IO_BGA_DATA);
|
||||||
|
|
|
@ -591,6 +591,35 @@ void GraphicsDebugPutBlock32(uintptr_t x, uintptr_t y, bool toggle,
|
||||||
linearBuffer[(y + 1) * stride + (x + 1) * 4 + 2] = 0;
|
linearBuffer[(y + 1) * stride + (x + 1) * 4 + 2] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GraphicsDebugPutData32(const uint8_t *data, size_t dataBytes,
|
||||||
|
unsigned screenWidth, unsigned screenHeight, unsigned stride, volatile uint8_t *linearBuffer) {
|
||||||
|
uintptr_t width = (dataBytes + screenHeight * 2 - 1) / (screenHeight * 2);
|
||||||
|
uintptr_t x = screenWidth - width, y = 0;
|
||||||
|
|
||||||
|
for (uintptr_t i = 0; i < dataBytes; i += 2) {
|
||||||
|
linearBuffer[y * stride + x * 4 + 0] = data[i];
|
||||||
|
linearBuffer[y * stride + x * 4 + 1] = data[i + 1];
|
||||||
|
// Leave the red channel unmodified so we can see through to the crashed desktop state.
|
||||||
|
if (++x == screenWidth) x -= width, y++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detection pattern.
|
||||||
|
linearBuffer[0 * stride + (screenWidth - width + 0) * 4 + 2] = 0x12;
|
||||||
|
linearBuffer[0 * stride + (screenWidth - width + 1) * 4 + 2] = 0x34;
|
||||||
|
linearBuffer[0 * stride + (screenWidth - width + 2) * 4 + 2] = 0x56;
|
||||||
|
linearBuffer[0 * stride + (screenWidth - width + 3) * 4 + 2] = 0x78;
|
||||||
|
linearBuffer[0 * stride + (screenWidth - 1 - 0) * 4 + 2] = 0x12;
|
||||||
|
linearBuffer[0 * stride + (screenWidth - 1 - 1) * 4 + 2] = 0x34;
|
||||||
|
linearBuffer[0 * stride + (screenWidth - 1 - 2) * 4 + 2] = 0x56;
|
||||||
|
linearBuffer[0 * stride + (screenWidth - 1 - 3) * 4 + 2] = 0x78;
|
||||||
|
linearBuffer[(screenHeight - 1) * stride + (screenWidth - 1 - 0) * 4 + 2] = 0x12;
|
||||||
|
linearBuffer[(screenHeight - 1) * stride + (screenWidth - 1 - 1) * 4 + 2] = 0x34;
|
||||||
|
linearBuffer[(screenHeight - 1) * stride + (screenWidth - 1 - 2) * 4 + 2] = 0x56;
|
||||||
|
linearBuffer[(screenHeight - 1) * stride + (screenWidth - 1 - 3) * 4 + 2] = 0x78;
|
||||||
|
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
void GraphicsDebugClearScreen32(unsigned screenWidth, unsigned screenHeight, unsigned stride, volatile uint8_t *linearBuffer) {
|
void GraphicsDebugClearScreen32(unsigned screenWidth, unsigned screenHeight, unsigned stride, volatile uint8_t *linearBuffer) {
|
||||||
for (uintptr_t i = 0; i < screenHeight; i++) {
|
for (uintptr_t i = 0; i < screenHeight; i++) {
|
||||||
for (uintptr_t j = 0; j < screenWidth * 4; j += 4) {
|
for (uintptr_t j = 0; j < screenWidth * 4; j += 4) {
|
||||||
|
|
|
@ -25,6 +25,7 @@ void KernelMain(uintptr_t) {
|
||||||
desktopProcess = ProcessSpawn(PROCESS_DESKTOP); // Spawn the desktop process.
|
desktopProcess = ProcessSpawn(PROCESS_DESKTOP); // Spawn the desktop process.
|
||||||
DriversInitialise(); // Load the root device.
|
DriversInitialise(); // Load the root device.
|
||||||
ProcessStart(desktopProcess, EsLiteral(K_DESKTOP_EXECUTABLE)); // Start the desktop process.
|
ProcessStart(desktopProcess, EsLiteral(K_DESKTOP_EXECUTABLE)); // Start the desktop process.
|
||||||
|
KernelPanic("Test\n");
|
||||||
KEventWait(&shutdownEvent, ES_WAIT_NO_TIMEOUT); // Wait for a shutdown request.
|
KEventWait(&shutdownEvent, ES_WAIT_NO_TIMEOUT); // Wait for a shutdown request.
|
||||||
ProcessTerminateAll(); // Terminate all user processes.
|
ProcessTerminateAll(); // Terminate all user processes.
|
||||||
FSShutdown(); // Flush file cache and unmount filesystems.
|
FSShutdown(); // Flush file cache and unmount filesystems.
|
||||||
|
|
|
@ -923,6 +923,7 @@ struct KGraphicsTarget : KDevice {
|
||||||
void (*updateScreen)(K_USER_BUFFER const uint8_t *source, uint32_t sourceWidth, uint32_t sourceHeight, uint32_t sourceStride,
|
void (*updateScreen)(K_USER_BUFFER const uint8_t *source, uint32_t sourceWidth, uint32_t sourceHeight, uint32_t sourceStride,
|
||||||
uint32_t destinationX, uint32_t destinationY);
|
uint32_t destinationX, uint32_t destinationY);
|
||||||
void (*debugPutBlock)(uintptr_t x, uintptr_t y, bool toggle);
|
void (*debugPutBlock)(uintptr_t x, uintptr_t y, bool toggle);
|
||||||
|
int (*debugPutData)(const uint8_t *data, size_t dataBytes); // Return the width used. dataBytes must be a multiple of 16.
|
||||||
void (*debugClearScreen)();
|
void (*debugClearScreen)();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -939,6 +940,8 @@ void GraphicsUpdateScreen24(K_USER_BUFFER const uint8_t *_source, uint32_t sourc
|
||||||
uint32_t width, uint32_t height, uint32_t stride, volatile uint8_t *pixel);
|
uint32_t width, uint32_t height, uint32_t stride, volatile uint8_t *pixel);
|
||||||
void GraphicsDebugPutBlock32(uintptr_t x, uintptr_t y, bool toggle,
|
void GraphicsDebugPutBlock32(uintptr_t x, uintptr_t y, bool toggle,
|
||||||
unsigned screenWidth, unsigned screenHeight, unsigned stride, volatile uint8_t *linearBuffer);
|
unsigned screenWidth, unsigned screenHeight, unsigned stride, volatile uint8_t *linearBuffer);
|
||||||
|
int GraphicsDebugPutData32(const uint8_t *data, size_t dataBytes,
|
||||||
|
unsigned screenWidth, unsigned screenHeight, unsigned stride, volatile uint8_t *linearBuffer);
|
||||||
void GraphicsDebugClearScreen32(unsigned screenWidth, unsigned screenHeight, unsigned stride, volatile uint8_t *linearBuffer);
|
void GraphicsDebugClearScreen32(unsigned screenWidth, unsigned screenHeight, unsigned stride, volatile uint8_t *linearBuffer);
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -138,11 +138,18 @@ void DebugWriteCharacter(uintptr_t character) {
|
||||||
|
|
||||||
void StartDebugOutput() {
|
void StartDebugOutput() {
|
||||||
if (graphics.target && graphics.target->debugClearScreen && graphics.target->debugPutBlock && !printToDebugger) {
|
if (graphics.target && graphics.target->debugClearScreen && graphics.target->debugPutBlock && !printToDebugger) {
|
||||||
|
graphics.target->debugClearScreen();
|
||||||
|
|
||||||
|
int widthUsed = 0;
|
||||||
|
|
||||||
|
if (graphics.target->debugPutData) {
|
||||||
|
widthUsed = graphics.target->debugPutData((const uint8_t *) kernelLog, KERNEL_LOG_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
debugRows = (graphics.height - 1) / VGA_FONT_HEIGHT;
|
debugRows = (graphics.height - 1) / VGA_FONT_HEIGHT;
|
||||||
debugColumns = (graphics.width - 1) / VGA_FONT_WIDTH - 2;
|
debugColumns = (graphics.width - 1 - widthUsed) / VGA_FONT_WIDTH - 2;
|
||||||
debugCurrentRow = debugCurrentColumn = 0;
|
debugCurrentRow = debugCurrentColumn = 0;
|
||||||
printToDebugger = true;
|
printToDebugger = true;
|
||||||
graphics.target->debugClearScreen();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,7 +210,7 @@ void KernelPanic(const char *format, ...) {
|
||||||
|
|
||||||
StartDebugOutput();
|
StartDebugOutput();
|
||||||
|
|
||||||
EsPrint("\n--- System Error ---\n>> ");
|
EsPrint("\n--- System Error ---\n* If you are using an emulator, please capture a screenshot of the entire window and report the error. *\n>> ");
|
||||||
|
|
||||||
va_list arguments;
|
va_list arguments;
|
||||||
va_start(arguments, format);
|
va_start(arguments, format);
|
||||||
|
@ -227,7 +234,8 @@ void KernelPanic(const char *format, ...) {
|
||||||
|
|
||||||
#ifdef ES_ARCH_X86_64
|
#ifdef ES_ARCH_X86_64
|
||||||
EsPrint("%z %d %x @%x:%x ", (GetCurrentThread() == thread) ? "=>" : " ",
|
EsPrint("%z %d %x @%x:%x ", (GetCurrentThread() == thread) ? "=>" : " ",
|
||||||
thread->id, thread, thread->interruptContext->rip, thread->interruptContext->rbp);
|
thread->id, thread, thread->interruptContext ? thread->interruptContext->rip : 0,
|
||||||
|
thread->interruptContext ? thread->interruptContext->rbp : 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (thread->state == THREAD_WAITING_EVENT) {
|
if (thread->state == THREAD_WAITING_EVENT) {
|
||||||
|
@ -248,7 +256,7 @@ void KernelPanic(const char *format, ...) {
|
||||||
for (uintptr_t i = 0; i < KGetCPUCount(); i++) {
|
for (uintptr_t i = 0; i < KGetCPUCount(); i++) {
|
||||||
CPULocalStorage *local = KGetCPULocal(i);
|
CPULocalStorage *local = KGetCPULocal(i);
|
||||||
|
|
||||||
if (local->panicContext) {
|
if (local && local->panicContext) {
|
||||||
#ifdef ES_ARCH_X86_64
|
#ifdef ES_ARCH_X86_64
|
||||||
EsPrint("CPU %d LS %x RIP/RBP %x:%x TID %d\n", local->processorID, local,
|
EsPrint("CPU %d LS %x RIP/RBP %x:%x TID %d\n", local->processorID, local,
|
||||||
local->panicContext->rip, local->panicContext->rbp,
|
local->panicContext->rip, local->panicContext->rbp,
|
||||||
|
@ -401,6 +409,8 @@ void KernelPanic(const char *format, ...) {
|
||||||
while (KWaitKey() != ES_SCANCODE_ENTER);
|
while (KWaitKey() != ES_SCANCODE_ENTER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
EsPrint("End of report.\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ProcessorHalt();
|
ProcessorHalt();
|
||||||
|
|
2
start.sh
2
start.sh
|
@ -4,7 +4,7 @@
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
|
|
||||||
# Create the bin directories.
|
# Create the bin directories.
|
||||||
mkdir -p bin bin/Dependency\ Files bin/Logs bin/generated_code bin/cache
|
mkdir -p bin bin/dependency_files bin/Logs bin/generated_code bin/cache
|
||||||
|
|
||||||
# Check that we are running on a sensible platform.
|
# Check that we are running on a sensible platform.
|
||||||
uname -o | grep Cygwin > /dev/null
|
uname -o | grep Cygwin > /dev/null
|
||||||
|
|
10
util/build.c
10
util/build.c
|
@ -149,7 +149,7 @@ int CallSystemF(const char *format, ...) {
|
||||||
void BuildAPIDependencies() {
|
void BuildAPIDependencies() {
|
||||||
if (CheckDependencies("API Header")) {
|
if (CheckDependencies("API Header")) {
|
||||||
CallSystem("bin/build_core headers");
|
CallSystem("bin/build_core headers");
|
||||||
ParseDependencies("bin/Dependency Files/api_header.d", "API Header", false);
|
ParseDependencies("bin/dependency_files/api_header.d", "API Header", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
CallSystem("ports/musl/build.sh " TARGET_NAME);
|
CallSystem("ports/musl/build.sh " TARGET_NAME);
|
||||||
|
@ -366,8 +366,8 @@ void BuildUtilities() {
|
||||||
|
|
||||||
#define BUILD_UTILITY(x, y, z) \
|
#define BUILD_UTILITY(x, y, z) \
|
||||||
if (CheckDependencies("Utilities." x)) { \
|
if (CheckDependencies("Utilities." x)) { \
|
||||||
if (!CallSystem("gcc -MMD -MF \"bin/Dependency Files/" x ".d\" " "util/" z x ".c -o bin/" x " -g " WARNING_FLAGS " " y)) { \
|
if (!CallSystem("gcc -MMD -MF \"bin/dependency_files/" x ".d\" " "util/" z x ".c -o bin/" x " -g " WARNING_FLAGS " " y)) { \
|
||||||
ParseDependencies("bin/Dependency Files/" x ".d", "Utilities." x, false); \
|
ParseDependencies("bin/dependency_files/" x ".d", "Utilities." x, false); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1233,9 +1233,9 @@ void DoCommand(const char *l) {
|
||||||
}
|
}
|
||||||
} else if (0 == strcmp(l, "designer2")) {
|
} else if (0 == strcmp(l, "designer2")) {
|
||||||
if (CheckDependencies("Utilities.Designer")) {
|
if (CheckDependencies("Utilities.Designer")) {
|
||||||
if (!CallSystem("g++ -MMD -MF \"bin/Dependency Files/designer2.d\" -D UI_LINUX -O3 "
|
if (!CallSystem("g++ -MMD -MF \"bin/dependency_files/designer2.d\" -D UI_LINUX -O3 "
|
||||||
"util/designer2.cpp -o bin/designer2 -g -lX11 -Wno-unused-parameter " WARNING_FLAGS)) {
|
"util/designer2.cpp -o bin/designer2 -g -lX11 -Wno-unused-parameter " WARNING_FLAGS)) {
|
||||||
ParseDependencies("bin/Dependency Files/designer2.d", "Utilities.Designer", false);
|
ParseDependencies("bin/dependency_files/designer2.d", "Utilities.Designer", false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -567,10 +567,10 @@ void BuildDesktop(Application *application) {
|
||||||
char buffer[4096];
|
char buffer[4096];
|
||||||
|
|
||||||
snprintf(buffer, sizeof(buffer), "arch/%s/api.s", target);
|
snprintf(buffer, sizeof(buffer), "arch/%s/api.s", target);
|
||||||
ExecuteForApp(application, toolchainNasm, buffer, "-MD", "bin/Dependency Files/api1.d", "-o", "bin/Object Files/api1.o", ArgString(commonAssemblyFlags));
|
ExecuteForApp(application, toolchainNasm, buffer, "-MD", "bin/dependency_files/api1.d", "-o", "bin/Object Files/api1.o", ArgString(commonAssemblyFlags));
|
||||||
ExecuteForApp(application, toolchainCXX, "-MD", "-MF", "bin/Dependency Files/api2.d", "-c", "desktop/api.cpp", "-o", "bin/Object Files/api2.o",
|
ExecuteForApp(application, toolchainCXX, "-MD", "-MF", "bin/dependency_files/api2.d", "-c", "desktop/api.cpp", "-o", "bin/Object Files/api2.o",
|
||||||
ArgString(commonCompileFlags), ArgString(desktopProfilingFlags));
|
ArgString(commonCompileFlags), ArgString(desktopProfilingFlags));
|
||||||
ExecuteForApp(application, toolchainCXX, "-MD", "-MF", "bin/Dependency Files/api3.d", "-c", "desktop/posix.cpp", "-o", "bin/Object Files/api3.o",
|
ExecuteForApp(application, toolchainCXX, "-MD", "-MF", "bin/dependency_files/api3.d", "-c", "desktop/posix.cpp", "-o", "bin/Object Files/api3.o",
|
||||||
ArgString(commonCompileFlags));
|
ArgString(commonCompileFlags));
|
||||||
ExecuteForApp(application, toolchainCC, "-o", "bin/Desktop", "bin/Object Files/crti.o", "bin/Object Files/crtbegin.o",
|
ExecuteForApp(application, toolchainCC, "-o", "bin/Desktop", "bin/Object Files/crti.o", "bin/Object Files/crtbegin.o",
|
||||||
"bin/Object Files/api1.o", "bin/Object Files/api2.o", "bin/Object Files/api3.o", "bin/Object Files/crtend.o", "bin/Object Files/crtn.o",
|
"bin/Object Files/api1.o", "bin/Object Files/api2.o", "bin/Object Files/api3.o", "bin/Object Files/crtend.o", "bin/Object Files/crtn.o",
|
||||||
|
@ -650,7 +650,7 @@ void BuildApplication(Application *application) {
|
||||||
|
|
||||||
char objectFile[256], dependencyFile[256];
|
char objectFile[256], dependencyFile[256];
|
||||||
snprintf(objectFile, sizeof(objectFile), "bin/Object Files/%s_%d.o", application->name, (int) i);
|
snprintf(objectFile, sizeof(objectFile), "bin/Object Files/%s_%d.o", application->name, (int) i);
|
||||||
snprintf(dependencyFile, sizeof(dependencyFile), "bin/Dependency Files/%s_%d.d", application->name, (int) i);
|
snprintf(dependencyFile, sizeof(dependencyFile), "bin/dependency_files/%s_%d.d", application->name, (int) i);
|
||||||
objectFilesPosition += sprintf(objectFiles + objectFilesPosition, "\"%s\" ", objectFile);
|
objectFilesPosition += sprintf(objectFiles + objectFilesPosition, "\"%s\" ", objectFile);
|
||||||
|
|
||||||
bool isC = sourceBytes > 2 && source[sourceBytes - 1] == 'c' && source[sourceBytes - 2] == '.';
|
bool isC = sourceBytes > 2 && source[sourceBytes - 1] == 'c' && source[sourceBytes - 2] == '.';
|
||||||
|
@ -793,7 +793,7 @@ void ParseApplicationManifest(const char *manifestPath) {
|
||||||
for (uintptr_t i = 0; i < arrlenu(application.sources); i++) {
|
for (uintptr_t i = 0; i < arrlenu(application.sources); i++) {
|
||||||
DependencyFile dependencyFile = {};
|
DependencyFile dependencyFile = {};
|
||||||
dependencyFile.name = application.name;
|
dependencyFile.name = application.name;
|
||||||
snprintf(dependencyFile.path, sizeof(dependencyFile.path), "bin/Dependency Files/%s_%d.d", application.name, (int) i);
|
snprintf(dependencyFile.path, sizeof(dependencyFile.path), "bin/dependency_files/%s_%d.d", application.name, (int) i);
|
||||||
arrput(application.dependencyFiles, dependencyFile);
|
arrput(application.dependencyFiles, dependencyFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -903,7 +903,7 @@ void OutputSystemConfiguration() {
|
||||||
void BuildModule(Application *application) {
|
void BuildModule(Application *application) {
|
||||||
char output[256], dependencyFile[256];
|
char output[256], dependencyFile[256];
|
||||||
snprintf(output, sizeof(output), "bin/Object Files/%s.ekm", application->name);
|
snprintf(output, sizeof(output), "bin/Object Files/%s.ekm", application->name);
|
||||||
snprintf(dependencyFile, sizeof(dependencyFile), "bin/Dependency Files/%s.d", application->name);
|
snprintf(dependencyFile, sizeof(dependencyFile), "bin/dependency_files/%s.d", application->name);
|
||||||
|
|
||||||
assert(arrlenu(application->sources) == 1);
|
assert(arrlenu(application->sources) == 1);
|
||||||
ExecuteForApp(application, toolchainCXX, "-MD", "-MF", dependencyFile, "-c", application->sources[0], "-o",
|
ExecuteForApp(application, toolchainCXX, "-MD", "-MF", dependencyFile, "-c", application->sources[0], "-o",
|
||||||
|
@ -1021,11 +1021,11 @@ void ParseKernelConfiguration() {
|
||||||
FilePrintFormat(f, "#endif");
|
FilePrintFormat(f, "#endif");
|
||||||
FileClose(f);
|
FileClose(f);
|
||||||
|
|
||||||
f = FileOpen("bin/Dependency Files/system_config.d", 'w');
|
f = FileOpen("bin/dependency_files/system_config.d", 'w');
|
||||||
FilePrintFormat(f, ": kernel/config.ini\n");
|
FilePrintFormat(f, ": kernel/config.ini\n");
|
||||||
FileClose(f);
|
FileClose(f);
|
||||||
ParseDependencies("bin/Dependency Files/system_config.d", "Kernel Config", false);
|
ParseDependencies("bin/dependency_files/system_config.d", "Kernel Config", false);
|
||||||
DeleteFile("bin/Dependency Files/system_config.d");
|
DeleteFile("bin/dependency_files/system_config.d");
|
||||||
}
|
}
|
||||||
|
|
||||||
void LinkKernel() {
|
void LinkKernel() {
|
||||||
|
@ -1082,22 +1082,22 @@ void LinkKernel() {
|
||||||
void BuildKernel(Application *application) {
|
void BuildKernel(Application *application) {
|
||||||
char buffer[4096];
|
char buffer[4096];
|
||||||
snprintf(buffer, sizeof(buffer), "arch/%s/kernel.s", target);
|
snprintf(buffer, sizeof(buffer), "arch/%s/kernel.s", target);
|
||||||
ExecuteForApp(application, toolchainNasm, "-MD", "bin/Dependency Files/kernel2.d", buffer, "-o", "bin/Object Files/kernel_arch.o", ArgString(commonAssemblyFlags));
|
ExecuteForApp(application, toolchainNasm, "-MD", "bin/dependency_files/kernel2.d", buffer, "-o", "bin/Object Files/kernel_arch.o", ArgString(commonAssemblyFlags));
|
||||||
snprintf(buffer, sizeof(buffer), "-DARCH_KERNEL_SOURCE=<arch/%s/kernel.cpp>", target);
|
snprintf(buffer, sizeof(buffer), "-DARCH_KERNEL_SOURCE=<arch/%s/kernel.cpp>", target);
|
||||||
ExecuteForApp(application, toolchainCXX, "-MD", "-MF", "bin/Dependency Files/kernel.d", "-c", "kernel/main.cpp", "-o", "bin/Object Files/kernel.o",
|
ExecuteForApp(application, toolchainCXX, "-MD", "-MF", "bin/dependency_files/kernel.d", "-c", "kernel/main.cpp", "-o", "bin/Object Files/kernel.o",
|
||||||
ArgString(kernelCompileFlags), ArgString(cppCompileFlags), ArgString(commonCompileFlags), buffer);
|
ArgString(kernelCompileFlags), ArgString(cppCompileFlags), ArgString(commonCompileFlags), buffer);
|
||||||
if (application->error) __sync_fetch_and_or(&encounteredErrorsInKernelModules, 1);
|
if (application->error) __sync_fetch_and_or(&encounteredErrorsInKernelModules, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BuildBootloader(Application *application) {
|
void BuildBootloader(Application *application) {
|
||||||
ExecuteForApp(application, toolchainNasm, "-MD", "bin/Dependency Files/boot1.d", "-fbin",
|
ExecuteForApp(application, toolchainNasm, "-MD", "bin/dependency_files/boot1.d", "-fbin",
|
||||||
forEmulator ? "boot/x86/mbr.s" : "boot/x86/mbr-emu.s" , "-obin/mbr");
|
forEmulator ? "boot/x86/mbr.s" : "boot/x86/mbr-emu.s" , "-obin/mbr");
|
||||||
ExecuteForApp(application, toolchainNasm, "-MD", "bin/Dependency Files/boot2.d", "-fbin",
|
ExecuteForApp(application, toolchainNasm, "-MD", "bin/dependency_files/boot2.d", "-fbin",
|
||||||
"boot/x86/esfs-stage1.s", "-obin/stage1");
|
"boot/x86/esfs-stage1.s", "-obin/stage1");
|
||||||
ExecuteForApp(application, toolchainNasm, "-MD", "bin/Dependency Files/boot3.d", "-fbin",
|
ExecuteForApp(application, toolchainNasm, "-MD", "bin/dependency_files/boot3.d", "-fbin",
|
||||||
"boot/x86/loader.s", "-obin/stage2",
|
"boot/x86/loader.s", "-obin/stage2",
|
||||||
"-Pboot/x86/esfs-stage2.s", (forEmulator && !bootUseVBE) ? "" : "-D BOOT_USE_VBE");
|
"-Pboot/x86/esfs-stage2.s", (forEmulator && !bootUseVBE) ? "" : "-D BOOT_USE_VBE");
|
||||||
ExecuteForApp(application, toolchainNasm, "-MD", "bin/Dependency Files/boot4.d", "-fbin",
|
ExecuteForApp(application, toolchainNasm, "-MD", "bin/dependency_files/boot4.d", "-fbin",
|
||||||
"boot/x86/uefi_loader.s", "-obin/uefi_loader");
|
"boot/x86/uefi_loader.s", "-obin/uefi_loader");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1417,7 +1417,7 @@ int main(int argc, char **argv) {
|
||||||
if (driverSource && *driverSource) {
|
if (driverSource && *driverSource) {
|
||||||
DependencyFile dependencyFile = {};
|
DependencyFile dependencyFile = {};
|
||||||
dependencyFile.name = driverName;
|
dependencyFile.name = driverName;
|
||||||
snprintf(dependencyFile.path, sizeof(dependencyFile.path), "bin/Dependency Files/%s.d", driverName);
|
snprintf(dependencyFile.path, sizeof(dependencyFile.path), "bin/dependency_files/%s.d", driverName);
|
||||||
|
|
||||||
Application application = {};
|
Application application = {};
|
||||||
arrput(application.sources, driverSource);
|
arrput(application.sources, driverSource);
|
||||||
|
@ -1474,7 +1474,7 @@ int main(int argc, char **argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
MakeDirectory("bin");
|
MakeDirectory("bin");
|
||||||
MakeDirectory("bin/Dependency Files");
|
MakeDirectory("bin/dependency_files");
|
||||||
MakeDirectory("bin/Object Files");
|
MakeDirectory("bin/Object Files");
|
||||||
MakeDirectory("bin/Stripped Executables");
|
MakeDirectory("bin/Stripped Executables");
|
||||||
MakeDirectory("bin/generated_code");
|
MakeDirectory("bin/generated_code");
|
||||||
|
@ -1541,10 +1541,10 @@ int main(int argc, char **argv) {
|
||||||
Application application = {};
|
Application application = {};
|
||||||
application.name = "Bootloader";
|
application.name = "Bootloader";
|
||||||
application.buildCallback = BuildBootloader;
|
application.buildCallback = BuildBootloader;
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/boot1.d", "Boot1");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/boot1.d", "Boot1");
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/boot2.d", "Boot2");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/boot2.d", "Boot2");
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/boot3.d", "Boot3");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/boot3.d", "Boot3");
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/boot4.d", "Boot4");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/boot4.d", "Boot4");
|
||||||
arrput(applications, application);
|
arrput(applications, application);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1552,9 +1552,9 @@ int main(int argc, char **argv) {
|
||||||
Application application = {};
|
Application application = {};
|
||||||
application.name = "Desktop";
|
application.name = "Desktop";
|
||||||
application.buildCallback = BuildDesktop;
|
application.buildCallback = BuildDesktop;
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/api1.d", "API1");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/api1.d", "API1");
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/api2.d", "API2");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/api2.d", "API2");
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/api3.d", "API3");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/api3.d", "API3");
|
||||||
arrput(applications, application);
|
arrput(applications, application);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1568,8 +1568,8 @@ int main(int argc, char **argv) {
|
||||||
Application application = {};
|
Application application = {};
|
||||||
application.name = "Kernel";
|
application.name = "Kernel";
|
||||||
application.buildCallback = BuildKernel;
|
application.buildCallback = BuildKernel;
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/kernel.d", "Kernel1");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/kernel.d", "Kernel1");
|
||||||
ADD_DEPENDENCY_FILE(application, "bin/Dependency Files/kernel2.d", "Kernel2");
|
ADD_DEPENDENCY_FILE(application, "bin/dependency_files/kernel2.d", "Kernel2");
|
||||||
arrput(applications, application);
|
arrput(applications, application);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#define EsCRTmemcpy memcpy
|
||||||
|
#define EsCRTmemset memset
|
||||||
|
#define EsCRTabs abs
|
||||||
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
|
#include "../shared/stb_image.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
if (argc != 2) {
|
||||||
|
fprintf(stderr, "Usage: %s <path>\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int width, height, channels;
|
||||||
|
uint32_t *data = (uint32_t *) stbi_load(argv[1], &width, &height, &channels, 4);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
fprintf(stderr, "Error: Could not load \"%s\".\n", argv[1]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int rx0 = -1, rx1, ry0, ry1;
|
||||||
|
|
||||||
|
for (int y = 0; y < height; y++) {
|
||||||
|
for (int x0 = 0; x0 < width - 3; x0++) {
|
||||||
|
if ((data[y * width + x0 + 0] & 0xFF) == 0x12
|
||||||
|
&& (data[y * width + x0 + 1] & 0xFF) == 0x34
|
||||||
|
&& (data[y * width + x0 + 2] & 0xFF) == 0x56
|
||||||
|
&& (data[y * width + x0 + 3] & 0xFF) == 0x78) {
|
||||||
|
for (int x1 = x0 + 4; x1 < width - 3; x1++) {
|
||||||
|
if ((data[y * width + x1 + 3] & 0xFF) == 0x12
|
||||||
|
&& (data[y * width + x1 + 2] & 0xFF) == 0x34
|
||||||
|
&& (data[y * width + x1 + 1] & 0xFF) == 0x56
|
||||||
|
&& (data[y * width + x1 + 0] & 0xFF) == 0x78) {
|
||||||
|
rx0 = x0, rx1 = x1 + 4, ry0 = y, ry1 = height;
|
||||||
|
|
||||||
|
// If a bottom marker is not found, assume the log spans the rest of the height of the image.
|
||||||
|
// (Some emulators might round the corners of the display, thus missing off a few pixels.)
|
||||||
|
|
||||||
|
for (int y1 = y + 1; y1 < height; y1++) {
|
||||||
|
if ((data[y1 * width + x1 + 3] & 0xFF) == 0x12
|
||||||
|
&& (data[y1 * width + x1 + 2] & 0xFF) == 0x34
|
||||||
|
&& (data[y1 * width + x1 + 1] & 0xFF) == 0x56
|
||||||
|
&& (data[y1 * width + x1 + 0] & 0xFF) == 0x78) {
|
||||||
|
ry1 = y1 + 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
goto foundMarkers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foundMarkers:;
|
||||||
|
|
||||||
|
if (rx0 == -1) {
|
||||||
|
fprintf(stderr, "Error: Could not find log markers.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t *output = (uint8_t *) malloc((rx1 - rx0) * (ry1 - ry0) * 2);
|
||||||
|
uintptr_t position = 0;
|
||||||
|
|
||||||
|
for (int y = ry0; y < ry1; y++) {
|
||||||
|
for (int x = rx0; x < rx1; x++) {
|
||||||
|
output[position++] = (data[y * width + x] & 0xFF0000) >> 16;
|
||||||
|
output[position++] = (data[y * width + x] & 0xFF00) >> 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("%s\n", output);
|
||||||
|
|
||||||
|
free(data);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -8,7 +8,7 @@ int position;
|
||||||
#define DEST_API_ARRAY "bin/generated_code/api_array.h"
|
#define DEST_API_ARRAY "bin/generated_code/api_array.h"
|
||||||
#define DEST_SYSCALL_ARRAY "bin/generated_code/syscall_array.h"
|
#define DEST_SYSCALL_ARRAY "bin/generated_code/syscall_array.h"
|
||||||
#define DEST_ENUM_STRINGS_ARRAY "bin/generated_code/enum_strings_array.h"
|
#define DEST_ENUM_STRINGS_ARRAY "bin/generated_code/enum_strings_array.h"
|
||||||
#define DEST_DEPENDENCIES "bin/Dependency Files/api_header.d"
|
#define DEST_DEPENDENCIES "bin/dependency_files/api_header.d"
|
||||||
|
|
||||||
typedef struct Token {
|
typedef struct Token {
|
||||||
#define TOKEN_IDENTIFIER (1)
|
#define TOKEN_IDENTIFIER (1)
|
||||||
|
|
Loading…
Reference in New Issue