replace the VHD/diskpart disk image pipeline with a directory-based vvfat root, we'll see when it breaks, fix /O2, add an all_tests, generalize the fat32 driver into a fat 16+32 driver, change policy on volume drivers, collapse KCPU's fields into a single atomic KE_CPU_STATE state machine, move scheduler ticking to per-CPU LAPIC timers, gate verbose SMP topology logging behind selftest diagnostics and add SMP pool-checkpoint validation around AP admission, add checked intrusive list helpers behind a new KE_DEBUG_LIST_CHECKS flag, add ObInitializeObjectHeader/ObTryReferenceObject, add waitable display clock objects and a SYS_OPEN_DISPLAY_CLOCK syscall for vsync-style waits, refactor kernel input into a per-queue KE_INPUT_CONTEXT with its own key/mouse ring buffers and DPC-driven key repeat, add KeInputQueuePeekEvent/ReadEvent/WaitKey and a SYS_QUERY_GLOBAL_INPUT_STATE syscall, split the kernel pool allocator out of mm_virt, new video files!
This commit is contained in:
1 parent
485a6bbfe7
commit
8b254f84f4
74 files changed
+4488
-2503
No files matched your search
@@ -1,6 +1,6 @@
|
||||
// Sequential file-cache pressure test.
|
||||
// Reads a large read-only asset through SysReadFile and checks that the
|
||||
// read-only page cache stays bounded by dropping clean pages.
|
||||
// Reads this test executable through SysReadFile and checks cache behavior when
|
||||
// the image is large enough to apply pressure.
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
@@ -56,47 +56,50 @@ static uint32_t query_cache(SYS_FILE_CACHE_STATS* out) {
|
||||
return SysQueryKernelStats(SYS_KERNEL_STATS_FILE_CACHE, out, sizeof(*out), 0);
|
||||
}
|
||||
|
||||
static uint32_t open_first_large(uint32_t* fileOut, const char** pathOut, uint64_t* sizeOut) {
|
||||
static const char* candidates[] = {
|
||||
"1:/apps/video.bk2",
|
||||
"0:/apps/video.bk2",
|
||||
"/apps/video.bk2",
|
||||
"video.bk2",
|
||||
static char gSelfPath[SYS_PATH_MAX];
|
||||
|
||||
"1:/apps/doom1.wad",
|
||||
"0:/apps/doom1.wad",
|
||||
"/apps/doom1.wad",
|
||||
"doom1.wad",
|
||||
};
|
||||
// Copies a string view into a fixed NUL-terminated buffer.
|
||||
static int copy_view(char* out, size_t outSize, SYS_STRING_VIEW view) {
|
||||
if (!out || outSize == 0 || !view.Data || view.Length + 1 > outSize)
|
||||
return 0;
|
||||
memcpy(out, view.Data, view.Length);
|
||||
out[view.Length] = '\0';
|
||||
return 1;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < sizeof(candidates) / sizeof(candidates[0]); ++i) {
|
||||
uint32_t h = 0;
|
||||
SYS_OPEN_FILE_REQUEST req = SysMakeOpenFileRequest(SysSvFromCstr(candidates[i]),
|
||||
SYS_FILE_ACCESS_READ | SYS_FILE_ACCESS_QUERY,
|
||||
SYS_FILE_OPEN_EXISTING,
|
||||
SYS_FILE_FLAG_NONE,
|
||||
&h);
|
||||
uint32_t s = SysOpenFile(&req);
|
||||
if (s != NTLSTATUS_SUCCESS)
|
||||
continue;
|
||||
// Opens this process image as the cache-pressure input file.
|
||||
static uint32_t open_self_image(uint32_t* fileOut, const char** pathOut, uint64_t* sizeOut) {
|
||||
SYS_PEB* peb = SysGetPeb();
|
||||
if (!peb || peb->Magic != SYS_PEB_MAGIC || peb->Version != SYS_ENV_VERSION)
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
if (!copy_view(gSelfPath, sizeof(gSelfPath), peb->ImagePath))
|
||||
return NTLSTATUS_INVALID_PARAMETER;
|
||||
|
||||
uint64_t size = 0;
|
||||
s = SysGetFileSize(h, &size);
|
||||
if (s != NTLSTATUS_SUCCESS) {
|
||||
SysCloseHandle(h);
|
||||
continue;
|
||||
}
|
||||
if (size >= MIN_PRESSURE_BYTES) {
|
||||
*fileOut = h;
|
||||
*pathOut = candidates[i];
|
||||
*sizeOut = size;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
uint32_t h = 0;
|
||||
SYS_OPEN_FILE_REQUEST req = SysMakeOpenFileRequest(SysSvFromCstr(gSelfPath),
|
||||
SYS_FILE_ACCESS_READ | SYS_FILE_ACCESS_QUERY,
|
||||
SYS_FILE_OPEN_EXISTING,
|
||||
SYS_FILE_FLAG_NONE,
|
||||
&h);
|
||||
uint32_t s = SysOpenFile(&req);
|
||||
if (s != NTLSTATUS_SUCCESS)
|
||||
return s;
|
||||
|
||||
uint64_t size = 0;
|
||||
s = SysGetFileSize(h, &size);
|
||||
if (s != NTLSTATUS_SUCCESS) {
|
||||
SysCloseHandle(h);
|
||||
return s;
|
||||
}
|
||||
if (size == 0) {
|
||||
SysCloseHandle(h);
|
||||
return NTLSTATUS_NOT_FOUND;
|
||||
}
|
||||
|
||||
return NTLSTATUS_NOT_FOUND;
|
||||
*fileOut = h;
|
||||
*pathOut = gSelfPath;
|
||||
*sizeOut = size;
|
||||
return NTLSTATUS_SUCCESS;
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
@@ -110,9 +113,9 @@ int main(void) {
|
||||
uint32_t file = 0;
|
||||
const char* path = 0;
|
||||
uint64_t size = 0;
|
||||
uint32_t s = open_first_large(&file, &path, &size);
|
||||
uint32_t s = open_self_image(&file, &path, &size);
|
||||
if (s != NTLSTATUS_SUCCESS)
|
||||
fail_status("open large asset", s);
|
||||
fail_status("open self image", s);
|
||||
|
||||
print("pcache_pressure: using ");
|
||||
print(path ? path : "<unknown>");
|
||||
@@ -135,8 +138,8 @@ int main(void) {
|
||||
|
||||
SysCloseHandle(file);
|
||||
|
||||
if (total < MIN_PRESSURE_BYTES)
|
||||
fail("asset read was too short to pressure the cache");
|
||||
if (total == 0)
|
||||
fail("self image read returned no bytes");
|
||||
|
||||
if (query_cache(&after) != NTLSTATUS_SUCCESS)
|
||||
fail("final cache stats query failed");
|
||||
@@ -165,12 +168,16 @@ int main(void) {
|
||||
print(" batch-pages+="); print_u64(batchPages);
|
||||
print("\n");
|
||||
|
||||
if (loads < 512)
|
||||
fail("expected at least 512 cache page loads");
|
||||
if (after.ResidentPages > RESIDENT_LIMIT_PAGES)
|
||||
fail("resident page cache exceeded pressure bound");
|
||||
if (loads > RESIDENT_LIMIT_PAGES && drops == 0)
|
||||
fail("cache did not drop clean pages under pressure");
|
||||
if (size >= MIN_PRESSURE_BYTES) {
|
||||
if (loads < 512)
|
||||
fail("expected at least 512 cache page loads");
|
||||
if (after.ResidentPages > RESIDENT_LIMIT_PAGES)
|
||||
fail("resident page cache exceeded pressure bound");
|
||||
if (loads > RESIDENT_LIMIT_PAGES && drops == 0)
|
||||
fail("cache did not drop clean pages under pressure");
|
||||
} else {
|
||||
print("pcache_pressure: self image below pressure size; pressure bounds skipped\n");
|
||||
}
|
||||
|
||||
print("pcache_pressure: PASS\n");
|
||||
exit_now(0);
|
||||
|
||||
Reference in new issue
Block a user