add display subsystem and vmwaresvga driver, support absolute mouse and qemu tablet, map pci mmio to private virtual aperture, better smp panic handling, remove legacy io publish/match, add sys query display info and display command to native shell
This commit is contained in:
1 parent
e41bf6e2c0
commit
6260de0085
38 files changed
+4011
-467
No files matched your search
@@ -115,6 +115,18 @@ static void ScreenBlit(int x, int y, int w, int h, const uint32_t* pixels) {
|
||||
|
||||
static void ScreenGetSize(int* w, int* h) { *w = gWidth; *h = gHeight; }
|
||||
|
||||
static KSTATUS ScreenGetFramebuffer(HAL_FRAMEBUFFER_INFO* outInfo) {
|
||||
if (!outInfo || !gFb || gWidth <= 0 || gHeight <= 0 || gStride <= 0)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
|
||||
outInfo->Base = (uintptr_t)gFb;
|
||||
outInfo->Width = (uint32_t)gWidth;
|
||||
outInfo->Height = (uint32_t)gHeight;
|
||||
outInfo->Stride = (uint32_t)gStride;
|
||||
outInfo->Format = 1; // X8R8G8B8
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void ScreenScroll(int lines) {
|
||||
if (lines <= 0)
|
||||
return;
|
||||
@@ -327,6 +339,7 @@ void HalScreenInitialize(void* (*AllocatePool)(size_t size), uintptr_t fb, int w
|
||||
out->PutPixel = ScreenPutPixel;
|
||||
out->Blit = ScreenBlit;
|
||||
out->GetSize = ScreenGetSize;
|
||||
out->GetFramebuffer = ScreenGetFramebuffer;
|
||||
out->Scroll = ScreenScroll;
|
||||
out->PutChar = ScreenPutChar;
|
||||
out->PrintChar = ScreenPrintChar;
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
// display_cursor.h - shared default software cursor image
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define DISPLAY_DEFAULT_CURSOR_W 16
|
||||
#define DISPLAY_DEFAULT_CURSOR_H 25
|
||||
|
||||
static const uint32_t gDisplayDefaultCursorArgb[DISPLAY_DEFAULT_CURSOR_H][DISPLAY_DEFAULT_CURSOR_W] = {
|
||||
{ 0x7F575757, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFAFAFA, 0x855D5D5D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFEFEFE, 0xFFFFFFFF, 0x865E5E5E, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFDFDFD, 0xFFFDFDFD, 0xFFFFFFFF, 0x8A626262, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x8D656565, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x8E666666, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x91696969, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x946C6C6C, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x956D6D6D, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x99717171, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x9B737373, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0x9D757575, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFFFFFFF, 0xA0787878, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFDFDFD, 0xFFFDFDFD, 0xFFFCFCFC, 0xFFF9F9F9, 0xFFFFFFFF, 0xA1797979, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFEFEFE, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xAE868686, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFFFFFF, 0xFDD5D5D5, 0xF4CCCCCC, 0xF4CCCCCC, 0xF4CCCCCC, 0xF3CBCBCB, 0xF1C9C9C9, 0xFAD2D2D2, 0x7E565656 },
|
||||
{ 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFEFEFE, 0xFFFCFCFC, 0xFFEFEFEF, 0xFFFCFCFC, 0xFFFFFFFF, 0x9A727272, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x7F575757, 0x8F676767, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFE0E0E0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFEFEFE, 0xFFFDFDFD, 0xFFFFFFFF, 0x90686868, 0x00000000, 0x00000000, 0xFFEBEBEB, 0xFFFFFFFF, 0xFFFFFFFF, 0x81595959, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFDFDFD, 0xFFFFFFFF, 0x8C646464, 0x00000000, 0x00000000, 0x00000000, 0xB78F8F8F, 0xFFFFFFFF, 0xFFFEFEFE, 0xECC4C4C4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0xFFFFFFFF, 0x90686868, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x50282828, 0xFFF9F9F9, 0xFFFFFFFF, 0xFFFFFFFF, 0x623A3A3A, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0x865E5E5E, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xD8B0B0B0, 0xFFFFFFFF, 0xFFFFFFFF, 0xCDA5A5A5, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x6C444444, 0xFFFFFFFF, 0xFFFCFCFC, 0xFFF4F4F4, 0x4D252525, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xF2CACACA, 0xFFFFFFFF, 0xFFFFFFFF, 0x99717171, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
{ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x8E666666, 0xEFC7C7C7, 0x7D555555, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 },
|
||||
};
|
||||
@@ -11,6 +11,7 @@
|
||||
#define KE_DEBUG_FILE_LOG 0x00000004u
|
||||
|
||||
void KeInitDebug(void (*PrintPtr)(char, uint32_t, uint32_t), uint32_t flags);
|
||||
void KeSetDebugConsoleWriter(void (*PrintPtr)(char, uint32_t, uint32_t));
|
||||
uint32_t KeGetDebugFlags(void);
|
||||
__declspec(dllexport) void DbgPrint(const char* fmt, ...);
|
||||
__declspec(dllexport) void KePrintConsole(const char* buf, size_t len);
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
#pragma once
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <ntlite/status.h>
|
||||
#include <ntlite/ddi/hal_api.h>
|
||||
|
||||
#ifndef DISPLAY_API
|
||||
#ifdef KE_DISPLAY_BUILD
|
||||
#define DISPLAY_API __declspec(dllexport)
|
||||
#else
|
||||
#define DISPLAY_API __declspec(dllimport)
|
||||
#endif
|
||||
#endif
|
||||
#include <ntlite/ddi/display.h>
|
||||
|
||||
|
||||
typedef struct KE_CONSOLE_INFO {
|
||||
uint32_t Columns;
|
||||
uint32_t Rows;
|
||||
uint32_t CursorX;
|
||||
uint32_t CursorY;
|
||||
uint16_t Attribute;
|
||||
} KE_CONSOLE_INFO;
|
||||
|
||||
typedef struct KE_DISPLAY_INFO {
|
||||
char PrimaryName[32];
|
||||
DISPLAY_MODE Mode;
|
||||
uint32_t Caps;
|
||||
uint32_t DeviceCount;
|
||||
DISPLAY_STATS ManagerStats;
|
||||
DISPLAY_STATS DeviceStats;
|
||||
} KE_DISPLAY_INFO;
|
||||
|
||||
void KeDisplayInitialize(const HAL_API* hal);
|
||||
|
||||
DISPLAY_API KSTATUS KeDisplayRegisterDevice(DISPLAY_DEVICE* device);
|
||||
DISPLAY_API KSTATUS KeDisplaySetPrimary(DISPLAY_DEVICE* device);
|
||||
DISPLAY_API void KeDisplaySuspendConsole(bool suspend);
|
||||
|
||||
DISPLAY_API KSTATUS KeDisplayGetMode(DISPLAY_MODE* outMode);
|
||||
DISPLAY_API KSTATUS KeDisplayGetSize(int* outWidth, int* outHeight);
|
||||
DISPLAY_API KSTATUS KeDisplayBlit(int x, int y, int w, int h, const uint32_t* pixels);
|
||||
DISPLAY_API KSTATUS KeDisplayFillRect(int x, int y, int w, int h, uint32_t color);
|
||||
DISPLAY_API KSTATUS KeDisplayClear(uint32_t color);
|
||||
DISPLAY_API KSTATUS KeDisplayCopyRect(int dstX, int dstY, int srcX, int srcY, int w, int h);
|
||||
DISPLAY_API KSTATUS KeDisplayScroll(int lines);
|
||||
DISPLAY_API KSTATUS KeDisplayPutChar(char c, int x, int y, uint32_t fg, uint32_t bg);
|
||||
DISPLAY_API KSTATUS KeDisplayPrintChar(char c, uint32_t fg, uint32_t bg);
|
||||
DISPLAY_API KSTATUS KeDisplayGetConsoleInfo(KE_CONSOLE_INFO* outInfo);
|
||||
DISPLAY_API KSTATUS KeDisplaySetConsoleCursor(int col, int row);
|
||||
DISPLAY_API KSTATUS KeDisplayFillConsoleChars(char c, int col, int row, size_t length, size_t* writtenOut);
|
||||
DISPLAY_API KSTATUS KeDisplayFillConsoleAttrs(uint16_t attr, int col, int row, size_t length, size_t* writtenOut);
|
||||
void KeDisplayDebugPrintChar(char c, uint32_t fg, uint32_t bg);
|
||||
DISPLAY_API KSTATUS KeDisplayPresent(const DISPLAY_RECT* rects, size_t rectCount);
|
||||
DISPLAY_API KSTATUS KeDisplaySync(void);
|
||||
DISPLAY_API KSTATUS KeDisplayQueryInfo(KE_DISPLAY_INFO* outInfo);
|
||||
|
||||
DISPLAY_API KSTATUS KeDisplaySetCursorImage(int width, int height, int hotX, int hotY, const uint32_t* argbPixels);
|
||||
DISPLAY_API KSTATUS KeDisplaySetCursorPosition(int x, int y);
|
||||
DISPLAY_API KSTATUS KeDisplayShowCursor(bool show);
|
||||
@@ -10,6 +10,8 @@ void KeInputInitialize(const HAL_API* hal);
|
||||
__declspec(dllexport) KSTATUS KeInputRegisterDevice(const char* name, uint32_t flags, uint32_t* outDeviceId);
|
||||
__declspec(dllexport) void KeInputSubmitKey(const INPUT_KEY_EVENT* event);
|
||||
__declspec(dllexport) void KeInputSubmitMouse(const INPUT_MOUSE_EVENT* event);
|
||||
__declspec(dllexport) void KeInputSubmitMouseAbsolute(const INPUT_MOUSE_ABSOLUTE_EVENT* event);
|
||||
__declspec(dllexport) void KeInputSubmitMouseAbsoluteScaled(uint32_t rawX, uint32_t rawY, uint32_t maxX, uint32_t maxY, int wheel, uint8_t buttons);
|
||||
|
||||
INPUT_KEY KeInputKbPoll(void);
|
||||
bool KeInputIsKeyDown(INPUT_KEY key);
|
||||
|
||||
@@ -36,6 +36,7 @@ typedef enum USER_REGION_TYPE {
|
||||
#define PAGE_PRESENT (1ULL << 0)
|
||||
#define PAGE_WRITE (1ULL << 1)
|
||||
#define PAGE_USER (1ULL << 2)
|
||||
#define PAGE_WRITETHROUGH (1ULL << 3)
|
||||
#define PAGE_NOCACHE (1ULL << 4)
|
||||
#define PAGE_NX (1ULL << 63)
|
||||
|
||||
|
||||
@@ -66,38 +66,42 @@
|
||||
#define SYS_REMOVE_DIR 57
|
||||
#define SYS_SET_CWD 58
|
||||
#define SYS_GET_CWD 59
|
||||
#define SYS_WRITE_CONSOLE 60
|
||||
#define SYS_BLIT_SCREEN 61
|
||||
#define SYS_CLEAR_SCREEN 62
|
||||
#define SYS_GET_SCREEN_SIZE 63
|
||||
#define SYS_PUT_SCREEN_CHAR 64
|
||||
#define SYS_POLL_KEYBOARD 65
|
||||
#define SYS_IS_KEY_DOWN 66
|
||||
#define SYS_READ_KEYBOARD_CHAR 67
|
||||
#define SYS_READ_KEY 68
|
||||
#define SYS_GET_KEY_MODIFIERS 69
|
||||
#define SYS_POLL_MOUSE 70
|
||||
#define SYS_READ_MOUSE 71
|
||||
#define SYS_GET_MOUSE_POS 72
|
||||
#define SYS_GET_TICK 73
|
||||
#define SYS_PRINT_DEBUG 74
|
||||
#define SYS_QUERY_TRAP_FRAME 75
|
||||
#define SYS_CREATE_SOCKET 76
|
||||
#define SYS_BIND_SOCKET 77
|
||||
#define SYS_LISTEN_SOCKET 78
|
||||
#define SYS_ACCEPT_SOCKET 79
|
||||
#define SYS_CONNECT_SOCKET 80
|
||||
#define SYS_SEND_SOCKET 81
|
||||
#define SYS_RECV_SOCKET 82
|
||||
#define SYS_SHUTDOWN_SOCKET 83
|
||||
#define SYS_SEND_TO_SOCKET 84
|
||||
#define SYS_RECV_FROM_SOCKET 85
|
||||
#define SYS_RESOLVE_HOST 86
|
||||
#define SYS_SET_SOCKET_OPTION 87
|
||||
#define SYS_GET_SOCKET_OPTION 88
|
||||
#define SYS_POLL 89
|
||||
#define SYS_GET_MEMORY_STATUS 90
|
||||
#define SYS_QUERY_KERNEL_STATS 91
|
||||
#define SYS_GET_SYSTEM_TIME 92
|
||||
|
||||
#define SYS_MAX 93
|
||||
#define SYS_WRITE_CONSOLE 60
|
||||
#define SYS_GET_CONSOLE_INFO 61
|
||||
#define SYS_SET_CONSOLE_CURSOR 62
|
||||
#define SYS_FILL_CONSOLE_CHARACTER 63
|
||||
#define SYS_FILL_CONSOLE_ATTRIBUTE 64
|
||||
#define SYS_PUT_SCREEN_CHAR 65
|
||||
#define SYS_BLIT_SCREEN 66
|
||||
#define SYS_CLEAR_SCREEN 67
|
||||
#define SYS_GET_SCREEN_SIZE 68
|
||||
#define SYS_QUERY_DISPLAY_INFO 69
|
||||
#define SYS_POLL_KEYBOARD 70
|
||||
#define SYS_IS_KEY_DOWN 71
|
||||
#define SYS_READ_KEYBOARD_CHAR 72
|
||||
#define SYS_READ_KEY 73
|
||||
#define SYS_GET_KEY_MODIFIERS 74
|
||||
#define SYS_POLL_MOUSE 75
|
||||
#define SYS_READ_MOUSE 76
|
||||
#define SYS_GET_MOUSE_POS 77
|
||||
#define SYS_GET_TICK 78
|
||||
#define SYS_PRINT_DEBUG 79
|
||||
#define SYS_QUERY_TRAP_FRAME 80
|
||||
#define SYS_CREATE_SOCKET 81
|
||||
#define SYS_BIND_SOCKET 82
|
||||
#define SYS_LISTEN_SOCKET 83
|
||||
#define SYS_ACCEPT_SOCKET 84
|
||||
#define SYS_CONNECT_SOCKET 85
|
||||
#define SYS_SEND_SOCKET 86
|
||||
#define SYS_RECV_SOCKET 87
|
||||
#define SYS_SHUTDOWN_SOCKET 88
|
||||
#define SYS_SEND_TO_SOCKET 89
|
||||
#define SYS_RECV_FROM_SOCKET 90
|
||||
#define SYS_RESOLVE_HOST 91
|
||||
#define SYS_SET_SOCKET_OPTION 92
|
||||
#define SYS_GET_SOCKET_OPTION 93
|
||||
#define SYS_POLL 94
|
||||
#define SYS_GET_MEMORY_STATUS 95
|
||||
#define SYS_QUERY_KERNEL_STATS 96
|
||||
#define SYS_GET_SYSTEM_TIME 97
|
||||
#define SYS_MAX 98
|
||||
@@ -7,8 +7,6 @@
|
||||
#include <kernel/ke_debug.h>
|
||||
#include <kernel/ob_object.h>
|
||||
|
||||
#define MAX_PUBLISHED_DEVICES 64
|
||||
#define MAX_DRIVER_MATCHERS 32
|
||||
#define MAX_DRIVER_OBJECTS 64
|
||||
#define MAX_PDO_OBJECTS 128
|
||||
|
||||
@@ -415,104 +413,6 @@ __declspec(dllexport) KSTATUS IoSendPnpIrpSync(DEVICE_OBJECT* device,
|
||||
return st;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Legacy publish/matcher path
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
typedef struct IO_DRIVER_MATCHER_ENTRY {
|
||||
bool Used;
|
||||
const char* DriverName;
|
||||
IO_BUS_TYPE BusType;
|
||||
IO_DRIVER_MATCH_CALLBACK Match;
|
||||
IO_DRIVER_BIND_CALLBACK Bind;
|
||||
void* Context;
|
||||
} IO_DRIVER_MATCHER_ENTRY;
|
||||
|
||||
static IO_PUBLISHED_DEVICE gPublishedDevices[MAX_PUBLISHED_DEVICES];
|
||||
static uint32_t gPublishedDeviceCount;
|
||||
static IO_DRIVER_MATCHER_ENTRY gDriverMatchers[MAX_DRIVER_MATCHERS];
|
||||
static uint32_t gDriverMatcherCount;
|
||||
|
||||
static bool IoTryBindDevice(IO_PUBLISHED_DEVICE* device,
|
||||
IO_DRIVER_MATCHER_ENTRY* matcher) {
|
||||
if (!device || !matcher || !matcher->Used || device->Bound)
|
||||
return false;
|
||||
if (matcher->BusType != IoBusUnknown && matcher->BusType != device->BusType)
|
||||
return false;
|
||||
if (!matcher->Match || !matcher->Bind)
|
||||
return false;
|
||||
if (!matcher->Match(device, matcher->Context))
|
||||
return false;
|
||||
|
||||
KSTATUS st = matcher->Bind(device, matcher->Context);
|
||||
if (KSUCCESS(st)) {
|
||||
device->Bound = true;
|
||||
device->BoundDriverName = matcher->DriverName;
|
||||
DbgPrint("io: %s device %s bound by %s\n",
|
||||
IoBusTypeName(device->BusType),
|
||||
device->Name ? device->Name : "<unnamed>",
|
||||
matcher->DriverName ? matcher->DriverName : "<unnamed>");
|
||||
return true;
|
||||
}
|
||||
|
||||
DbgPrint("io: %s matcher %s accepted %s but bind failed st=0x%x\n",
|
||||
IoBusTypeName(device->BusType),
|
||||
matcher->DriverName ? matcher->DriverName : "<unnamed>",
|
||||
device->Name ? device->Name : "<unnamed>",
|
||||
st);
|
||||
return false;
|
||||
}
|
||||
|
||||
__declspec(dllexport) KSTATUS IoRegisterDriverMatcher(const char* driverName,
|
||||
IO_BUS_TYPE busType,
|
||||
IO_DRIVER_MATCH_CALLBACK match,
|
||||
IO_DRIVER_BIND_CALLBACK bind,
|
||||
void* context) {
|
||||
if (!driverName || !match || !bind)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
if (gDriverMatcherCount >= MAX_DRIVER_MATCHERS)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
||||
IO_DRIVER_MATCHER_ENTRY* entry = &gDriverMatchers[gDriverMatcherCount++];
|
||||
memset(entry, 0, sizeof(*entry));
|
||||
entry->Used = true;
|
||||
entry->DriverName = driverName;
|
||||
entry->BusType = busType;
|
||||
entry->Match = match;
|
||||
entry->Bind = bind;
|
||||
entry->Context = context;
|
||||
|
||||
DbgPrint("io: registered %s matcher %s\n", IoBusTypeName(busType), driverName);
|
||||
|
||||
for (uint32_t i = 0; i < gPublishedDeviceCount; i++)
|
||||
IoTryBindDevice(&gPublishedDevices[i], entry);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
__declspec(dllexport) KSTATUS IoPublishDevice(const IO_PUBLISHED_DEVICE* device) {
|
||||
if (!device || device->BusType == IoBusUnknown)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
if (gPublishedDeviceCount >= MAX_PUBLISHED_DEVICES)
|
||||
return STATUS_NO_MEMORY;
|
||||
|
||||
IO_PUBLISHED_DEVICE* stored = &gPublishedDevices[gPublishedDeviceCount++];
|
||||
memcpy(stored, device, sizeof(*stored));
|
||||
stored->Bound = false;
|
||||
stored->BoundDriverName = (const char*)0;
|
||||
|
||||
for (uint32_t i = 0; i < gDriverMatcherCount; i++) {
|
||||
if (IoTryBindDevice(stored, &gDriverMatchers[i]))
|
||||
break;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
__declspec(dllexport) uint32_t IoPublishedDeviceCount(void) {
|
||||
return gPublishedDeviceCount;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Disk namespace
|
||||
// -------------------------------------------------------------------------
|
||||
|
||||
+52
-12
@@ -61,6 +61,7 @@ static void KiDebugConsoleWrite(const char* text, size_t len) {
|
||||
}
|
||||
|
||||
static volatile long gPanicInProgress = 0;
|
||||
static volatile uintptr_t gPanicOwnerToken = 0;
|
||||
static volatile long gPanicStoppedCpuCount = 0;
|
||||
|
||||
static _Noreturn void KiPanicSecondaryHalt(void) {
|
||||
@@ -69,10 +70,36 @@ static _Noreturn void KiPanicSecondaryHalt(void) {
|
||||
for (;;) __halt();
|
||||
}
|
||||
|
||||
static uintptr_t KiPanicCurrentToken(void) {
|
||||
THREAD* thread = KeGetCurrentThread();
|
||||
if (thread)
|
||||
return (uintptr_t)thread;
|
||||
KCPU* cpu = KeGetCurrentCpu();
|
||||
if (cpu)
|
||||
return (uintptr_t)cpu;
|
||||
return 1u;
|
||||
}
|
||||
|
||||
static int KiPanicIsActive(void) {
|
||||
return _InterlockedCompareExchange((volatile long*)&gPanicInProgress, 0, 0) != 0;
|
||||
}
|
||||
|
||||
static int KiPanicCurrentCpuOwnsReport(void) {
|
||||
uintptr_t token = KiPanicCurrentToken();
|
||||
return token != 0 && gPanicOwnerToken == token;
|
||||
}
|
||||
|
||||
static void KiBeginFatalReport(void) {
|
||||
_disable();
|
||||
uintptr_t token = KiPanicCurrentToken();
|
||||
if (_InterlockedCompareExchange((volatile long*)&gPanicInProgress, 1, 0) == 0) {
|
||||
gPanicOwnerToken = token;
|
||||
return;
|
||||
}
|
||||
if (gPanicOwnerToken != token)
|
||||
KiPanicSecondaryHalt();
|
||||
}
|
||||
|
||||
// Returning NMI handler used for SMP control IPIs. Panic NMIs stop the
|
||||
// target CPU permanently; TLB shootdown NMIs flush and return. A genuinely
|
||||
// unexpected NMI is not handled here and will fall through to the normal fault
|
||||
@@ -88,7 +115,8 @@ __declspec(dllexport) int KeHandleNmiIpi(void) {
|
||||
}
|
||||
|
||||
void KiKernelPutChar(char c) {
|
||||
PrintChar(c, 0xCCCCCC, 0x012456);
|
||||
if (PrintChar)
|
||||
PrintChar(c, 0xCCCCCC, 0x012456);
|
||||
}
|
||||
|
||||
void KeInitDebug(void (*PrintPtr)(char, uint32_t, uint32_t), uint32_t flags) {
|
||||
@@ -112,6 +140,13 @@ uint32_t KeGetDebugFlags(void) {
|
||||
return gDebugFlags;
|
||||
}
|
||||
|
||||
void KeSetDebugConsoleWriter(void (*PrintPtr)(char, uint32_t, uint32_t)) {
|
||||
if (!PrintPtr)
|
||||
return;
|
||||
PrintChar = PrintPtr;
|
||||
printf_set_putchar(KiKernelPutChar);
|
||||
}
|
||||
|
||||
__declspec(dllexport) void DbgPrint(const char* fmt, ...) {
|
||||
if (!gDebugEnabled || !fmt) return;
|
||||
|
||||
@@ -128,6 +163,14 @@ __declspec(dllexport) void DbgPrint(const char* fmt, ...) {
|
||||
len = sizeof(line) - 1u;
|
||||
}
|
||||
|
||||
if (KiPanicIsActive()) {
|
||||
if (!KiPanicCurrentCpuOwnsReport())
|
||||
KiPanicSecondaryHalt();
|
||||
if (gDebugFlags & KE_DEBUG_CONSOLE)
|
||||
KiDebugConsoleWrite(line, len);
|
||||
return;
|
||||
}
|
||||
|
||||
uintptr_t flags = KeAcquireSpinlock(&gDebugPrintLock);
|
||||
if (!_InterlockedCompareExchange((volatile long*)&gDebugLogFlushing, 0, 0))
|
||||
KiDebugLogAppendLocked(line, len);
|
||||
@@ -187,17 +230,11 @@ __declspec(dllexport) KSTATUS KeFlushDebugLogToFile(SYS_STRING_VIEW path) {
|
||||
|
||||
// KePanic
|
||||
__declspec(dllexport) _Noreturn void KePanic(int code, const char* fmt, ...) {
|
||||
// Silence this CPU first.
|
||||
_disable();
|
||||
KiBeginFatalReport();
|
||||
|
||||
// Only one CPU owns the visible panic report. CPUs that fault while the
|
||||
// system is already panicking immediately join the stopped set.
|
||||
if (_InterlockedCompareExchange((volatile long*)&gPanicInProgress, 1, 0) != 0) {
|
||||
KiPanicSecondaryHalt();
|
||||
}
|
||||
|
||||
// Stop every other CPU as early as possible. This uses an NMI IPI so it
|
||||
// still reaches CPUs with IF cleared inside spinlock/high-IRQL regions.
|
||||
// Stop every other CPU for the final panic banner. Kernel fault dispatch
|
||||
// claims panic ownership before its detailed dump, so this does not steal
|
||||
// ownership from the CPU that found the fatal error.
|
||||
HalApicSendPanicIpi();
|
||||
|
||||
if (PrintChar) {
|
||||
@@ -550,7 +587,8 @@ static void KiDumpFaultFrame(PROCESS* proc, const KFAULT_FRAME* f) {
|
||||
}
|
||||
|
||||
static void KiPrintCrashChar(char c) {
|
||||
PrintChar(c, 0xFFAA00, 0x000000); // amber - distinct from green debug / red panic
|
||||
if (PrintChar)
|
||||
PrintChar(c, 0xFFAA00, 0x000000); // amber - distinct from green debug / red panic
|
||||
}
|
||||
|
||||
static void KiPrintCrashHeader(PROCESS* proc, int vector, uintptr_t rip,
|
||||
@@ -617,6 +655,8 @@ __declspec(dllexport) _Noreturn void KeFaultDispatchFrame(const KFAULT_FRAME* fr
|
||||
}
|
||||
|
||||
if ((frame->Cs & 3) == 0) {
|
||||
KiBeginFatalReport();
|
||||
|
||||
int vector = (int)frame->Vector;
|
||||
const char* name = KiFaultVectorName(vector);
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
+56
-15
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <kernel/ke_input.h>
|
||||
#include <kernel/ke_debug.h>
|
||||
#include <kernel/ke_display.h>
|
||||
|
||||
#define KEY_QUEUE_SIZE 256u
|
||||
#define KEY_QUEUE_MASK (KEY_QUEUE_SIZE - 1u)
|
||||
@@ -200,12 +201,15 @@ void KeInputInitialize(const HAL_API* hal) {
|
||||
gMouseButtons = 0;
|
||||
|
||||
int w = 1920, h = 1080;
|
||||
if (hal && hal->Screen.GetSize) hal->Screen.GetSize(&w, &h);
|
||||
DISPLAY_MODE mode;
|
||||
if (KSUCCESS(KeDisplayGetMode(&mode))) {
|
||||
w = (int)mode.Width;
|
||||
h = (int)mode.Height;
|
||||
}
|
||||
|
||||
KeInputMouseSetBounds(w, h);
|
||||
KeInputMouseSetPosition(w / 2, h / 2);
|
||||
|
||||
if (hal && hal->Screen.DrawCursor)
|
||||
hal->Screen.DrawCursor(gMouseX, gMouseY);
|
||||
KeDisplayShowCursor(true);
|
||||
|
||||
DbgPrint("Input: kernel input core initialized (%dx%d)\n", w, h);
|
||||
}
|
||||
@@ -247,11 +251,7 @@ __declspec(dllexport) void KeInputSubmitKey(const INPUT_KEY_EVENT* event) {
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(dllexport) void KeInputSubmitMouse(const INPUT_MOUSE_EVENT* event) {
|
||||
if (!event) return;
|
||||
|
||||
int nx = gMouseX + event->dx;
|
||||
int ny = gMouseY + event->dy;
|
||||
static void KiInputCommitMousePosition(int nx, int ny, uint8_t buttons) {
|
||||
int bw = gMouseBoundsW;
|
||||
int bh = gMouseBoundsH;
|
||||
|
||||
@@ -262,15 +262,21 @@ __declspec(dllexport) void KeInputSubmitMouse(const INPUT_MOUSE_EVENT* event) {
|
||||
if (nx >= bw) nx = bw - 1;
|
||||
if (ny >= bh) ny = bh - 1;
|
||||
|
||||
if (gInputHal && gInputHal->Screen.EraseCursor)
|
||||
gInputHal->Screen.EraseCursor();
|
||||
|
||||
gMouseX = nx;
|
||||
gMouseY = ny;
|
||||
gMouseButtons = event->buttons;
|
||||
gMouseButtons = buttons;
|
||||
KeDisplaySetCursorPosition(nx, ny);
|
||||
}
|
||||
|
||||
if (gInputHal && gInputHal->Screen.DrawCursor)
|
||||
gInputHal->Screen.DrawCursor(nx, ny);
|
||||
__declspec(dllexport) void KeInputSubmitMouse(const INPUT_MOUSE_EVENT* event) {
|
||||
if (!event) return;
|
||||
|
||||
int oldX = gMouseX;
|
||||
int oldY = gMouseY;
|
||||
int nx = oldX + event->dx;
|
||||
int ny = oldY + event->dy;
|
||||
|
||||
KiInputCommitMousePosition(nx, ny, event->buttons);
|
||||
|
||||
int next = (gMouseTail + 1) & (int)MOUSE_QUEUE_MASK;
|
||||
if (next != gMouseHead) {
|
||||
@@ -279,6 +285,40 @@ __declspec(dllexport) void KeInputSubmitMouse(const INPUT_MOUSE_EVENT* event) {
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(dllexport) void KeInputSubmitMouseAbsolute(const INPUT_MOUSE_ABSOLUTE_EVENT* event) {
|
||||
if (!event) return;
|
||||
|
||||
int oldX = gMouseX;
|
||||
int oldY = gMouseY;
|
||||
KiInputCommitMousePosition(event->x, event->y, event->buttons);
|
||||
|
||||
INPUT_MOUSE_EVENT rel;
|
||||
rel.dx = gMouseX - oldX;
|
||||
rel.dy = gMouseY - oldY;
|
||||
rel.wheel = event->wheel;
|
||||
rel.buttons = event->buttons;
|
||||
|
||||
int next = (gMouseTail + 1) & (int)MOUSE_QUEUE_MASK;
|
||||
if (next != gMouseHead) {
|
||||
gMouseQueue[gMouseTail] = rel;
|
||||
gMouseTail = next;
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(dllexport) void KeInputSubmitMouseAbsoluteScaled(uint32_t rawX, uint32_t rawY, uint32_t maxX, uint32_t maxY, int wheel, uint8_t buttons) {
|
||||
int bw = gMouseBoundsW;
|
||||
int bh = gMouseBoundsH;
|
||||
if (bw < 1) bw = 1;
|
||||
if (bh < 1) bh = 1;
|
||||
|
||||
INPUT_MOUSE_ABSOLUTE_EVENT ev;
|
||||
ev.x = maxX ? (int)(((uint64_t)rawX * (uint64_t)(bw - 1)) / (uint64_t)maxX) : 0;
|
||||
ev.y = maxY ? (int)(((uint64_t)rawY * (uint64_t)(bh - 1)) / (uint64_t)maxY) : 0;
|
||||
ev.wheel = wheel;
|
||||
ev.buttons = buttons;
|
||||
KeInputSubmitMouseAbsolute(&ev);
|
||||
}
|
||||
|
||||
INPUT_KEY KeInputKbPoll(void) {
|
||||
if (gKeyHead == gKeyTail) KiInputServiceRepeat();
|
||||
return (gKeyHead == gKeyTail) ? INPUT_KEY_NONE : gKeyQueue[gKeyHead].key;
|
||||
@@ -341,6 +381,7 @@ void KeInputMouseSetPosition(int x, int y) {
|
||||
if (y >= bh) y = bh - 1;
|
||||
gMouseX = x;
|
||||
gMouseY = y;
|
||||
KeDisplaySetCursorPosition(x, y);
|
||||
}
|
||||
|
||||
void KeInputMouseSetBounds(int w, int h) {
|
||||
|
||||
+157
-62
@@ -61,6 +61,7 @@
|
||||
#include <kernel/net_socket.h>
|
||||
#include <kernel/ke_trap.h>
|
||||
#include <kernel/ke_input.h>
|
||||
#include <kernel/ke_display.h>
|
||||
#include <kernel/ke_time.h>
|
||||
#include <ntlite/syscall.h>
|
||||
|
||||
@@ -1204,12 +1205,12 @@ static uint64_t SyscallGetFileSize(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_BLIT_SCREEN (36) a0=x a1=y a2=w a3=h a4=*pixels
|
||||
// SYS_BLIT_SCREEN (66) a0=x a1=y a2=w a3=h a4=*pixels
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallScreenBlit(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
static uint64_t SyscallBlitScreen(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a5;
|
||||
if (!gHal || !a4) return STATUS_FAILURE;
|
||||
if (!a4) return STATUS_FAILURE;
|
||||
|
||||
int w = (int)a2;
|
||||
int h = (int)a3;
|
||||
@@ -1227,32 +1228,30 @@ static uint64_t SyscallScreenBlit(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
|
||||
KSTATUS s = CopyFromUser(kpixels, (const void*)(uintptr_t)a4, bytes);
|
||||
if (KSUCCESS(s))
|
||||
gHal->Screen.Blit((int)a0, (int)a1, w, h, kpixels);
|
||||
s = KeDisplayBlit((int)a0, (int)a1, w, h, kpixels);
|
||||
|
||||
MmFreePool(kpixels);
|
||||
return s;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_CLEAR_SCREEN (37) a0=color
|
||||
// SYS_CLEAR_SCREEN (67) a0=color
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallScreenClear(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
static uint64_t SyscallClearScreen(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a1; (void)a2; (void)a3; (void)a4; (void)a5;
|
||||
if (!gHal) return STATUS_FAILURE;
|
||||
gHal->Screen.Clear((uint32_t)a0);
|
||||
return STATUS_SUCCESS;
|
||||
return KeDisplayClear((uint32_t)a0);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_GET_SCREEN_SIZE (38) a0=*widthOut a1=*heightOut
|
||||
// SYS_GET_SCREEN_SIZE (68) a0=*widthOut a1=*heightOut
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallScreenGetSize(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
static uint64_t SyscallGetScreenSize(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a2; (void)a3; (void)a4; (void)a5;
|
||||
if (!gHal) return STATUS_FAILURE;
|
||||
int w = 0, h = 0;
|
||||
gHal->Screen.GetSize(&w, &h);
|
||||
KSTATUS gs = KeDisplayGetSize(&w, &h);
|
||||
if (!KSUCCESS(gs)) return gs;
|
||||
if (a0) {
|
||||
KSTATUS s = KiCopyIntToUser(a0, w);
|
||||
if (!KSUCCESS(s)) return s;
|
||||
@@ -1265,19 +1264,89 @@ static uint64_t SyscallScreenGetSize(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_PUT_SCREEN_CHAR (39) a0=c a1=x a2=y a3=fg a4=bg
|
||||
// SYS_PUT_SCREEN_CHAR (65) a0=c a1=x a2=y a3=fg a4=bg
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallScreenPutChar(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
static uint64_t SyscallPutScreenChar(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a5;
|
||||
if (!gHal) return STATUS_FAILURE;
|
||||
gHal->Screen.PutChar((char)a0, (int)a1, (int)a2,
|
||||
(uint32_t)a3, (uint32_t)a4);
|
||||
return STATUS_SUCCESS;
|
||||
return KeDisplayPutChar((char)a0, (int)a1, (int)a2,
|
||||
(uint32_t)a3, (uint32_t)a4);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_POLL_KEYBOARD (64) -> next INPUT_KEY or INPUT_KEY_NONE
|
||||
// SYS_GET_CONSOLE_INFO (61) a0=*SYS_CONSOLE_INFO
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallGetConsoleInfo(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a1; (void)a2; (void)a3; (void)a4; (void)a5;
|
||||
if (!a0) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
KE_CONSOLE_INFO ki;
|
||||
KSTATUS s = KeDisplayGetConsoleInfo(&ki);
|
||||
if (!KSUCCESS(s)) return s;
|
||||
|
||||
SYS_CONSOLE_INFO out;
|
||||
memset(&out, 0, sizeof(out));
|
||||
out.Columns = ki.Columns;
|
||||
out.Rows = ki.Rows;
|
||||
out.CursorX = ki.CursorX;
|
||||
out.CursorY = ki.CursorY;
|
||||
out.Attribute = ki.Attribute;
|
||||
return CopyToUser((void*)(uintptr_t)a0, &out, sizeof(out));
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_SET_CONSOLE_CURSOR (62) a0=column a1=row
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallSetConsoleCursor(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a2; (void)a3; (void)a4; (void)a5;
|
||||
int col = (int)(int32_t)a0;
|
||||
int row = (int)(int32_t)a1;
|
||||
if (col < 0 || row < 0) return STATUS_INVALID_PARAMETER;
|
||||
return KeDisplaySetConsoleCursor(col, row);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_FILL_CONSOLE_CHARACTER (63) a0=char a1=column a2=row a3=count a4=*writtenOut
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallFillConsoleCharacter(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a5;
|
||||
int col = (int)(int32_t)a1;
|
||||
int row = (int)(int32_t)a2;
|
||||
if (col < 0 || row < 0) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
size_t written = 0;
|
||||
KSTATUS s = KeDisplayFillConsoleChars((char)a0, col, row, (size_t)a3, &written);
|
||||
if (a4) {
|
||||
KSTATUS cs = KiCopySizeToUser(a4, written);
|
||||
if (KSUCCESS(s) && !KSUCCESS(cs)) s = cs;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_FILL_CONSOLE_ATTRIBUTE (64) a0=attribute a1=column a2=row a3=count a4=*writtenOut
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallFillConsoleAttribute(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a5;
|
||||
int col = (int)(int32_t)a1;
|
||||
int row = (int)(int32_t)a2;
|
||||
if (col < 0 || row < 0) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
size_t written = 0;
|
||||
KSTATUS s = KeDisplayFillConsoleAttrs((uint16_t)a0, col, row, (size_t)a3, &written);
|
||||
if (a4) {
|
||||
KSTATUS cs = KiCopySizeToUser(a4, written);
|
||||
if (KSUCCESS(s) && !KSUCCESS(cs)) s = cs;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_POLL_KEYBOARD (70) -> next INPUT_KEY or INPUT_KEY_NONE
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallKbPoll(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1286,7 +1355,7 @@ static uint64_t SyscallKbPoll(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_IS_KEY_DOWN (65) a0=INPUT_KEY -> 1 or 0
|
||||
// SYS_IS_KEY_DOWN (71) a0=INPUT_KEY -> 1 or 0
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallKbIsKeyDown(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1295,7 +1364,7 @@ static uint64_t SyscallKbIsKeyDown(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_READ_KEYBOARD_CHAR (66) -> char (blocks, yields while waiting)
|
||||
// SYS_READ_KEYBOARD_CHAR (72) -> char (blocks, yields while waiting)
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallKbReadChar(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1305,7 +1374,7 @@ static uint64_t SyscallKbReadChar(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_READ_KEY (67) -> INPUT_KEY (blocks, yields while waiting)
|
||||
// SYS_READ_KEY (73) -> INPUT_KEY (blocks, yields while waiting)
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallKbReadKey(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1315,7 +1384,7 @@ static uint64_t SyscallKbReadKey(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_GET_KEY_MODIFIERS (68) -> uint32_t INPUT_MOD_* flags
|
||||
// SYS_GET_KEY_MODIFIERS (74) -> uint32_t INPUT_MOD_* flags
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallKbGetModifiers(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1324,7 +1393,7 @@ static uint64_t SyscallKbGetModifiers(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_POLL_MOUSE (69) -> 1 or 0
|
||||
// SYS_POLL_MOUSE (75) -> 1 or 0
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallMousePoll(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1333,7 +1402,7 @@ static uint64_t SyscallMousePoll(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_READ_MOUSE (70) a0=*dx a1=*dy a2=*buttons -> 1 or 0
|
||||
// SYS_READ_MOUSE (76) a0=*dx a1=*dy a2=*buttons -> 1 or 0
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallMouseRead(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1351,7 +1420,7 @@ static uint64_t SyscallMouseRead(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_GET_MOUSE_POS (71) a0=*x a1=*y
|
||||
// SYS_GET_MOUSE_POS (77) a0=*x a1=*y
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallMouseGetPos(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1366,7 +1435,7 @@ static uint64_t SyscallMouseGetPos(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_GET_TICK (48) -> uint64_t microseconds
|
||||
// SYS_GET_TICK (78) -> uint64_t microseconds
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallGetTick(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1389,7 +1458,7 @@ static uint64_t SyscallGetSystemTime(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_PRINT_DEBUG (49) a0=*str
|
||||
// SYS_PRINT_DEBUG (79) a0=*str
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallDebugPrint(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
@@ -1607,7 +1676,7 @@ static uint64_t SyscallGetProcessExitCode(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SYS_WRITE_CONSOLE (53) a0=*buf a1=len
|
||||
// SYS_WRITE_CONSOLE (60) a0=*buf a1=len
|
||||
// Writes user console text in white; distinct from green SYS_PRINT_DEBUG.
|
||||
// ---------------------------------------------------------------------------
|
||||
static uint64_t SyscallWriteConsole(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
@@ -2716,6 +2785,27 @@ static KSTATUS KiReturnKernelStats(uint64_t bufferArg, size_t bufferSize,
|
||||
return CopyToUser((void*)(uintptr_t)bufferArg, src, size);
|
||||
}
|
||||
|
||||
static uint64_t SyscallQueryDisplayInfo(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a1; (void)a2; (void)a3; (void)a4; (void)a5;
|
||||
if (!a0) return STATUS_INVALID_PARAMETER;
|
||||
|
||||
KE_DISPLAY_INFO ki;
|
||||
KSTATUS s = KeDisplayQueryInfo(&ki);
|
||||
if (!KSUCCESS(s)) return s;
|
||||
|
||||
SYS_DISPLAY_INFO out;
|
||||
memset(&out, 0, sizeof(out));
|
||||
memcpy(out.PrimaryName, ki.PrimaryName, sizeof(out.PrimaryName));
|
||||
out.Mode = ki.Mode;
|
||||
out.Caps = ki.Caps;
|
||||
out.DeviceCount = ki.DeviceCount;
|
||||
out.ManagerStats = ki.ManagerStats;
|
||||
out.DeviceStats = ki.DeviceStats;
|
||||
|
||||
return CopyToUser((void*)(uintptr_t)a0, &out, sizeof(out));
|
||||
}
|
||||
|
||||
static uint64_t SyscallQueryKernelStats(uint64_t a0, uint64_t a1, uint64_t a2,
|
||||
uint64_t a3, uint64_t a4, uint64_t a5) {
|
||||
(void)a4; (void)a5;
|
||||
@@ -2856,38 +2946,43 @@ static const SYSCALL_HANDLER gSyscallTable[SYS_MAX] = {
|
||||
/* 58 SYS_SET_CWD */ SyscallSetCwd,
|
||||
/* 59 SYS_GET_CWD */ SyscallGetCwd,
|
||||
/* 60 SYS_WRITE_CONSOLE */ SyscallWriteConsole,
|
||||
/* 61 SYS_BLIT_SCREEN */ SyscallScreenBlit,
|
||||
/* 62 SYS_CLEAR_SCREEN */ SyscallScreenClear,
|
||||
/* 63 SYS_GET_SCREEN_SIZE */ SyscallScreenGetSize,
|
||||
/* 64 SYS_PUT_SCREEN_CHAR */ SyscallScreenPutChar,
|
||||
/* 65 SYS_POLL_KEYBOARD */ SyscallKbPoll,
|
||||
/* 66 SYS_IS_KEY_DOWN */ SyscallKbIsKeyDown,
|
||||
/* 67 SYS_READ_KEYBOARD_CHAR */ SyscallKbReadChar,
|
||||
/* 68 SYS_READ_KEY */ SyscallKbReadKey,
|
||||
/* 69 SYS_GET_KEY_MODIFIERS */ SyscallKbGetModifiers,
|
||||
/* 70 SYS_POLL_MOUSE */ SyscallMousePoll,
|
||||
/* 71 SYS_READ_MOUSE */ SyscallMouseRead,
|
||||
/* 72 SYS_GET_MOUSE_POS */ SyscallMouseGetPos,
|
||||
/* 73 SYS_GET_TICK */ SyscallGetTick,
|
||||
/* 74 SYS_PRINT_DEBUG */ SyscallDebugPrint,
|
||||
/* 75 SYS_QUERY_TRAP_FRAME */ SyscallQueryTrapFrame,
|
||||
/* 76 SYS_CREATE_SOCKET */ SyscallSocket,
|
||||
/* 77 SYS_BIND_SOCKET */ SyscallBind,
|
||||
/* 78 SYS_LISTEN_SOCKET */ SyscallListen,
|
||||
/* 79 SYS_ACCEPT_SOCKET */ SyscallAccept,
|
||||
/* 80 SYS_CONNECT_SOCKET */ SyscallConnect,
|
||||
/* 81 SYS_SEND_SOCKET */ SyscallSend,
|
||||
/* 82 SYS_RECV_SOCKET */ SyscallRecv,
|
||||
/* 83 SYS_SHUTDOWN_SOCKET */ SyscallShutdown,
|
||||
/* 84 SYS_SEND_TO_SOCKET */ SyscallSendTo,
|
||||
/* 85 SYS_RECV_FROM_SOCKET */ SyscallRecvFrom,
|
||||
/* 86 SYS_RESOLVE_HOST */ SyscallResolveHost,
|
||||
/* 87 SYS_SET_SOCKET_OPTION */ SyscallSetSocketOption,
|
||||
/* 88 SYS_GET_SOCKET_OPTION */ SyscallGetSocketOption,
|
||||
/* 89 SYS_POLL */ SyscallPoll,
|
||||
/* 90 SYS_GET_MEMORY_STATUS */ SyscallGetMemoryStatus,
|
||||
/* 91 SYS_QUERY_KERNEL_STATS */ SyscallQueryKernelStats,
|
||||
/* 92 SYS_GET_SYSTEM_TIME */ SyscallGetSystemTime
|
||||
/* 61 SYS_GET_CONSOLE_INFO */ SyscallGetConsoleInfo,
|
||||
/* 62 SYS_SET_CONSOLE_CURSOR */ SyscallSetConsoleCursor,
|
||||
/* 63 SYS_FILL_CONSOLE_CHARACTER */ SyscallFillConsoleCharacter,
|
||||
/* 64 SYS_FILL_CONSOLE_ATTRIBUTE */ SyscallFillConsoleAttribute,
|
||||
/* 65 SYS_PUT_SCREEN_CHAR */ SyscallPutScreenChar,
|
||||
/* 66 SYS_BLIT_SCREEN */ SyscallBlitScreen,
|
||||
/* 67 SYS_CLEAR_SCREEN */ SyscallClearScreen,
|
||||
/* 68 SYS_GET_SCREEN_SIZE */ SyscallGetScreenSize,
|
||||
/* 69 SYS_QUERY_DISPLAY_INFO */ SyscallQueryDisplayInfo,
|
||||
/* 70 SYS_POLL_KEYBOARD */ SyscallKbPoll,
|
||||
/* 71 SYS_IS_KEY_DOWN */ SyscallKbIsKeyDown,
|
||||
/* 72 SYS_READ_KEYBOARD_CHAR */ SyscallKbReadChar,
|
||||
/* 73 SYS_READ_KEY */ SyscallKbReadKey,
|
||||
/* 74 SYS_GET_KEY_MODIFIERS */ SyscallKbGetModifiers,
|
||||
/* 75 SYS_POLL_MOUSE */ SyscallMousePoll,
|
||||
/* 76 SYS_READ_MOUSE */ SyscallMouseRead,
|
||||
/* 77 SYS_GET_MOUSE_POS */ SyscallMouseGetPos,
|
||||
/* 78 SYS_GET_TICK */ SyscallGetTick,
|
||||
/* 79 SYS_PRINT_DEBUG */ SyscallDebugPrint,
|
||||
/* 80 SYS_QUERY_TRAP_FRAME */ SyscallQueryTrapFrame,
|
||||
/* 81 SYS_CREATE_SOCKET */ SyscallSocket,
|
||||
/* 82 SYS_BIND_SOCKET */ SyscallBind,
|
||||
/* 83 SYS_LISTEN_SOCKET */ SyscallListen,
|
||||
/* 84 SYS_ACCEPT_SOCKET */ SyscallAccept,
|
||||
/* 85 SYS_CONNECT_SOCKET */ SyscallConnect,
|
||||
/* 86 SYS_SEND_SOCKET */ SyscallSend,
|
||||
/* 87 SYS_RECV_SOCKET */ SyscallRecv,
|
||||
/* 88 SYS_SHUTDOWN_SOCKET */ SyscallShutdown,
|
||||
/* 89 SYS_SEND_TO_SOCKET */ SyscallSendTo,
|
||||
/* 90 SYS_RECV_FROM_SOCKET */ SyscallRecvFrom,
|
||||
/* 91 SYS_RESOLVE_HOST */ SyscallResolveHost,
|
||||
/* 92 SYS_SET_SOCKET_OPTION */ SyscallSetSocketOption,
|
||||
/* 93 SYS_GET_SOCKET_OPTION */ SyscallGetSocketOption,
|
||||
/* 94 SYS_POLL */ SyscallPoll,
|
||||
/* 95 SYS_GET_MEMORY_STATUS */ SyscallGetMemoryStatus,
|
||||
/* 96 SYS_QUERY_KERNEL_STATS */ SyscallQueryKernelStats,
|
||||
/* 97 SYS_GET_SYSTEM_TIME */ SyscallGetSystemTime
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include <kernel/ke_smp.h>
|
||||
#include <kernel/ke_input.h>
|
||||
#include <kernel/ke_time.h>
|
||||
#include <kernel/ke_display.h>
|
||||
#include <common/ini_parser.h>
|
||||
|
||||
typedef struct {
|
||||
@@ -429,6 +430,8 @@ extern void KernelMain(BOOT_INFO* bootInfo) {
|
||||
|
||||
KeInitDebug(hal->Screen.PrintChar, bootInfo->Debug);
|
||||
KeTimeInitialize(bootInfo, hal);
|
||||
KeDisplayInitialize(hal);
|
||||
KeSetDebugConsoleWriter(KeDisplayDebugPrintChar);
|
||||
|
||||
// CPU startup intentionally lives after HAL initialization but before IRQs
|
||||
// and scheduler startup. HAL owns ACPI/MADT discovery and LAPIC INIT/SIPI;
|
||||
|
||||
@@ -248,11 +248,19 @@ __declspec(dllexport) KSTATUS MmSetPageProtect(uintptr_t virt, size_t size, uint
|
||||
status = STATUS_NOT_FOUND;
|
||||
break;
|
||||
}
|
||||
if (*e3 & PAGE_PS) {
|
||||
status = STATUS_NOT_SUPPORTED;
|
||||
break;
|
||||
}
|
||||
uint64_t* e2 = KiPtePtr(*e3 & PAGE_FRAME_4K_MASK, PDT_IDX(va));
|
||||
if (!(*e2 & PAGE_PRESENT)) {
|
||||
status = STATUS_NOT_FOUND;
|
||||
break;
|
||||
}
|
||||
if (*e2 & PAGE_PS) {
|
||||
status = STATUS_NOT_SUPPORTED;
|
||||
break;
|
||||
}
|
||||
uint64_t* pte = KiPtePtr(*e2 & PAGE_FRAME_4K_MASK, PT_IDX(va));
|
||||
if (!(*pte & PAGE_PRESENT)) {
|
||||
status = STATUS_NOT_FOUND;
|
||||
|
||||
Reference in new issue
Block a user