sp1/amd64+knot: Add kernel knot() function

Signed-off-by: Ian Moffett <ian@mirocom.org>
This commit is contained in:
2026-04-17 10:59:19 -04:00
parent e66c15b914
commit f5afbdb287
3 changed files with 125 additions and 0 deletions
+49
View File
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2026, Mirocom Laboratories
* All rights reserved.
*
* The following sources are CONFIDENTIAL and PROPRIETARY
* property of Mirocom Laboratories. Unauthorized copying,
* use, distribution or modification of this file, in whole
* and in part, is strictly prohibited without the prior written
* consent from Mirocom Laboratories.
*/
.text
.globl knot
knot:
cli // Ensure interrupts are disabled
cld // Ensure the direction flag is clear
//
// On a multi-processor system we really want to ensure that
// only the current processor core gets to fuck and knot the
// kernel. Atomically acquire the MP lock to lockout other cores
// out.
//
mov $1, %rax // Obtain lock
xchg %rax, __mp_lock // Swap it atomically
or %rax, %rax // Are we another processor?
jnz .lockout // Yes, enter lockout
//
// Cumdrunk kernels cannot be trusted, we must update the stack
// to a known address to avoid clobbering memory we don't wanna
// touch. We also want to ensure that any partial memory transactions
// that have not 100% finished to be finished before we enter the main
// panic handler. This might not be fully needed but it is a precaution
// to be taken.
//
lea stack_top(%rip), %rsp
mfence
jmp __knot
.lockout:
hlt
jmp .lockout
.section .data
__mp_lock: .quad 0
.section .bss
stack_base: .skip 4096, 0
stack_top:
+39
View File
@@ -0,0 +1,39 @@
/*
* Copyright (c) 2026, Mirocom Laboratories
* All rights reserved.
*
* The following sources are CONFIDENTIAL and PROPRIETARY
* property of Mirocom Laboratories. Unauthorized copying,
* use, distribution or modification of this file, in whole
* and in part, is strictly prohibited without the prior written
* consent from Mirocom Laboratories.
*/
#include <os/knot.h>
#include <lib/printf.h>
#include <mu/cpu.h>
#include <stdarg.h>
/*
* Even though we can assume that the stack is safe to use upon
* entry of __knot(), we still want to avoid using it for stability
* and security reasons. Globals go here.
*/
static char knotbuf[256];
static va_list ap;
__no_return void
__knot(const char *fmt, ...)
{
va_start(ap, fmt);
vsnprintf(knotbuf, sizeof(knotbuf), fmt, ap);
printf("\033[31;40m*******************************************\n");
printf("ah!~ fuck, i've been knotted~ @.@\n");
printf("knot: %s\n", knotbuf);
for (;;) {
mu_cpu_intoff();
mu_cpu_halt();
}
}
+37
View File
@@ -0,0 +1,37 @@
/*
* Copyright (c) 2026, Mirocom Laboratories
* All rights reserved.
*
* The following sources are CONFIDENTIAL and PROPRIETARY
* property of Mirocom Laboratories. Unauthorized copying,
* use, distribution or modification of this file, in whole
* and in part, is strictly prohibited without the prior written
* consent from Mirocom Laboratories.
*/
#ifndef _OS_KNOT_H_
#define _OS_KNOT_H_ 1
#include <sys/cdefs.h>
#include <stdarg.h>
/*
* This routine knots and fucks the kernel so it doesn't
* go anywhere and is halted. This is used during serious
* errors that may occur.
*
* @fmt: Format specifier
* @<...>: Vargs
*/
__no_return void knot(const char *fmt, ...);
/*
* This routine is the main panic handler and should NOT be
* called directly.
*
* @fmt: Format specifier
* @<...>: Vargs
*/
__no_return void __knot(const char *fmt, ...);
#endif /* !_OS_KNOT_H_ */