Add basic print program
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
old/
|
||||
out/
|
||||
node_modules/
|
||||
*.iso
|
||||
*.img
|
||||
21
LICENSE
21
LICENSE
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 Martin Petr
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
34
README.md
34
README.md
@@ -1,34 +0,0 @@
|
||||
# Lints
|
||||
|
||||
## What the hell is this?
|
||||
|
||||
Lints is an experimental operating system kernel written almost entirely in TypeScript. This is not some in-browser system emulator or WebAssembly hack; Lints actually runs on real hardware (or a hardware emulator like QEMU) by leveraging a JavaScript engine with a small C kernel (just some basic memory management needed by the JS engine) and JS-to-C bindings for purposes like writting data to pointers, etc.
|
||||
|
||||
## Why?
|
||||
|
||||
- I can.
|
||||
- I want to be able to say that I did it.
|
||||
- I am not sane and don't have a life.
|
||||
- TypeScript haters.
|
||||
- "Anything that can be done in JavaScript will eventually be done in JavaScript." - Jeff Atwood
|
||||
|
||||
## How to run it?
|
||||
|
||||
Please don't.
|
||||
|
||||
If you really want to, make sure you have Docker installed, then run:
|
||||
|
||||
```bash
|
||||
./scripts/run-kernel.sh
|
||||
```
|
||||
|
||||
## If you are an employer looking at this...
|
||||
|
||||
I would appreciate if you messaged me and gave me some well-paid job. Also...
|
||||
Please don't judge me based on this project. I swear I can write normal code too.
|
||||
|
||||
## License
|
||||
|
||||
MIT License. See LICENSE file for details.
|
||||
|
||||
TL;DR: Do whatever you want with it, but don't blame me if it blows up in your face. Also I'd appreciate that you give me credit if you use any of my code, ideas or whatever - I mean why would someone even want to be associated with this project (or steal it), right?
|
||||
17
bun.lock
Normal file
17
bun.lock
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"lockfileVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"sailet": "^0.1.1",
|
||||
},
|
||||
},
|
||||
},
|
||||
"packages": {
|
||||
"chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
||||
|
||||
"sailet": ["sailet@0.1.1", "", { "dependencies": { "chalk": "^5.6.2" }, "peerDependencies": { "typescript": "^5" }, "bin": { "sailet": "dist/cli/index.js", "st": "dist/cli/index.js" } }, "sha512-zKcCvANgxqB2YY/XbLtgLomHJvOvcYHDg0qpZ831XxORUm45oVFNWeBItaZzxFGZDfoXNXr6VqzDuRIoukMXaA=="],
|
||||
|
||||
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
#ifndef COMPAT_MATH_H
|
||||
#define COMPAT_MATH_H
|
||||
|
||||
#define HUGE_VAL (__builtin_huge_val())
|
||||
#define NAN (__builtin_nan(""))
|
||||
#define INFINITY (__builtin_inf())
|
||||
|
||||
double fabs(double x);
|
||||
double floor(double x);
|
||||
double ceil(double x);
|
||||
double fmod(double x, double y);
|
||||
double pow(double x, double y);
|
||||
double sqrt(double x);
|
||||
double sin(double x);
|
||||
double cos(double x);
|
||||
double tan(double x);
|
||||
double asin(double x);
|
||||
double acos(double x);
|
||||
double atan(double x);
|
||||
double atan2(double y, double x);
|
||||
double exp(double x);
|
||||
double log(double x);
|
||||
double log10(double x);
|
||||
double cbrt(double x);
|
||||
double log2(double x);
|
||||
double trunc(double x);
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,9 +0,0 @@
|
||||
#ifndef COMPAT_SETJMP_H
|
||||
#define COMPAT_SETJMP_H
|
||||
|
||||
typedef void *jmp_buf[5];
|
||||
|
||||
#define setjmp(env) __builtin_setjmp(env)
|
||||
#define longjmp(env, val) __builtin_longjmp(env, val)
|
||||
|
||||
#endif
|
||||
@@ -1,14 +0,0 @@
|
||||
#ifndef COMPAT_STDARG_H
|
||||
#define COMPAT_STDARG_H
|
||||
|
||||
#ifndef MDE_CPU_X64
|
||||
#define MDE_CPU_X64
|
||||
#endif
|
||||
#include <Base.h>
|
||||
#include_next <stdarg.h>
|
||||
|
||||
#ifndef va_copy
|
||||
#define va_copy(dest, src) VA_COPY(dest, src)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,31 +0,0 @@
|
||||
#ifndef COMPAT_STDINT_H
|
||||
#define COMPAT_STDINT_H
|
||||
|
||||
#ifndef MDE_CPU_X64
|
||||
#define MDE_CPU_X64
|
||||
#endif
|
||||
#include <Base.h>
|
||||
#include_next <stdint.h>
|
||||
|
||||
typedef int8_t int_least8_t;
|
||||
typedef uint8_t uint_least8_t;
|
||||
typedef int16_t int_least16_t;
|
||||
typedef uint16_t uint_least16_t;
|
||||
typedef int32_t int_least32_t;
|
||||
typedef uint32_t uint_least32_t;
|
||||
typedef int64_t int_least64_t;
|
||||
typedef uint64_t uint_least64_t;
|
||||
|
||||
typedef int8_t int_fast8_t;
|
||||
typedef uint8_t uint_fast8_t;
|
||||
typedef int16_t int_fast16_t;
|
||||
typedef uint16_t uint_fast16_t;
|
||||
typedef int32_t int_fast32_t;
|
||||
typedef uint32_t uint_fast32_t;
|
||||
typedef int64_t int_fast64_t;
|
||||
typedef uint64_t uint_fast64_t;
|
||||
|
||||
typedef int64_t intmax_t;
|
||||
typedef uint64_t uintmax_t;
|
||||
|
||||
#endif
|
||||
@@ -1,14 +0,0 @@
|
||||
#ifndef COMPAT_STDIO_H
|
||||
#define COMPAT_STDIO_H
|
||||
|
||||
#ifndef MDE_CPU_X64
|
||||
#define MDE_CPU_X64
|
||||
#endif
|
||||
#include <Base.h>
|
||||
#include_next <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
|
||||
int snprintf(char *str, size_t size, const char *format, ...);
|
||||
|
||||
#endif
|
||||
@@ -1,13 +0,0 @@
|
||||
#ifndef COMPAT_TIME_H
|
||||
#define COMPAT_TIME_H
|
||||
|
||||
#ifndef MDE_CPU_X64
|
||||
#define MDE_CPU_X64
|
||||
#endif
|
||||
#include <Base.h>
|
||||
#include_next <time.h>
|
||||
|
||||
double difftime(time_t time1, time_t time0);
|
||||
|
||||
|
||||
#endif
|
||||
@@ -1,12 +0,0 @@
|
||||
/* Dummy windows.h for Duktape compatibility in EFI */
|
||||
#ifndef WINDOWS_H
|
||||
#define WINDOWS_H
|
||||
|
||||
#ifndef MDE_CPU_X64
|
||||
#define MDE_CPU_X64
|
||||
#endif
|
||||
|
||||
#include <Uefi.h>
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,996 +0,0 @@
|
||||
{
|
||||
"type": "duk_source_meta",
|
||||
"comment": "Metadata for prepared Duktape sources and configuration",
|
||||
"git_commit": "b5d069a96ba0989c444dad8e6f002a0a057b4df0",
|
||||
"git_branch": "master",
|
||||
"git_describe": "v2.5.0-393-gb5d069a9",
|
||||
"duk_version": 29999,
|
||||
"duk_version_string": "2.99.99",
|
||||
"line_map": [
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 159
|
||||
},
|
||||
{
|
||||
"original_file": "duk_internal.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 164
|
||||
},
|
||||
{
|
||||
"original_file": "duk_dblunion.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 201
|
||||
},
|
||||
{
|
||||
"original_file": "duk_fltunion.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 621
|
||||
},
|
||||
{
|
||||
"original_file": "duk_replacements.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 661
|
||||
},
|
||||
{
|
||||
"original_file": "duk_jmpbuf.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 691
|
||||
},
|
||||
{
|
||||
"original_file": "duk_exception.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 716
|
||||
},
|
||||
{
|
||||
"original_file": "duk_forwdecl.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 748
|
||||
},
|
||||
{
|
||||
"original_file": "duk_tval.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 881
|
||||
},
|
||||
{
|
||||
"original_file": "duk_builtins.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 1582
|
||||
},
|
||||
{
|
||||
"original_file": "duk_internal.h",
|
||||
"original_line": 45,
|
||||
"combined_line": 3156
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 3158
|
||||
},
|
||||
{
|
||||
"original_file": "duk_strings.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 3954
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_bytecode.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 4130
|
||||
},
|
||||
{
|
||||
"original_file": "duk_lexer.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 4604
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_compiler.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 5040
|
||||
},
|
||||
{
|
||||
"original_file": "duk_regexp.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 5273
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heaphdr.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 5362
|
||||
},
|
||||
{
|
||||
"original_file": "duk_refcount.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 5848
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_internal.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 6897
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hstring.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 7337
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 7536
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hcompfunc.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 8163
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hnatfunc.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 8423
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hboundfunc.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 8468
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hbufobj.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 8511
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hthread.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 8657
|
||||
},
|
||||
{
|
||||
"original_file": "duk_harray.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 9075
|
||||
},
|
||||
{
|
||||
"original_file": "duk_henv.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 9187
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hbuffer.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 9243
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hproxy.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 9591
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 9623
|
||||
},
|
||||
{
|
||||
"original_file": "duk_debugger.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 10385
|
||||
},
|
||||
{
|
||||
"original_file": "duk_debug.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 10537
|
||||
},
|
||||
{
|
||||
"original_file": "duk_error.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 10734
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11456
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_ids_noa.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11640
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 185,
|
||||
"combined_line": 11643
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_ids_noabmp.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11645
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 187,
|
||||
"combined_line": 11648
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_ids_m_let_noa.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11652
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 191,
|
||||
"combined_line": 11655
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_ids_m_let_noabmp.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11657
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 193,
|
||||
"combined_line": 11660
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_idp_m_ids_noa.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11664
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 197,
|
||||
"combined_line": 11667
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_idp_m_ids_noabmp.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11669
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 199,
|
||||
"combined_line": 11672
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_caseconv.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11675
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 202,
|
||||
"combined_line": 11679
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_re_canon_lookup.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11682
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 205,
|
||||
"combined_line": 11685
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_re_canon_bitmap.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11689
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode.h",
|
||||
"original_line": 209,
|
||||
"combined_line": 11695
|
||||
},
|
||||
{
|
||||
"original_file": "duk_json.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11783
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11852
|
||||
},
|
||||
{
|
||||
"original_file": "duk_numconv.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 11999
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_protos.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 12107
|
||||
},
|
||||
{
|
||||
"original_file": "duk_selftest.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 12185
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop.h",
|
||||
"original_line": 1,
|
||||
"combined_line": 12201
|
||||
},
|
||||
{
|
||||
"original_file": "duk_internal.h",
|
||||
"original_line": 77,
|
||||
"combined_line": 12298
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 6,
|
||||
"combined_line": 12300
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_ids_noa.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 12317
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 23,
|
||||
"combined_line": 12369
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_ids_noabmp.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 12373
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 27,
|
||||
"combined_line": 12403
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_ids_m_let_noa.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 12409
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 33,
|
||||
"combined_line": 12413
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_ids_m_let_noabmp.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 12417
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 37,
|
||||
"combined_line": 12421
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_idp_m_ids_noa.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 12427
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 43,
|
||||
"combined_line": 12457
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_idp_m_ids_noabmp.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 12461
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 47,
|
||||
"combined_line": 12480
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_caseconv.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 12490
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 57,
|
||||
"combined_line": 12595
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_re_canon_lookup.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 12598
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 60,
|
||||
"combined_line": 18426
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_re_canon_bitmap.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 18430
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_tables.c",
|
||||
"original_line": 64,
|
||||
"combined_line": 18446
|
||||
},
|
||||
{
|
||||
"original_file": "duk_replacements.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 18447
|
||||
},
|
||||
{
|
||||
"original_file": "duk_debug_macros.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 18529
|
||||
},
|
||||
{
|
||||
"original_file": "duk_builtins.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 18621
|
||||
},
|
||||
{
|
||||
"original_file": "duk_error_macros.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 23804
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_support.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 24000
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_memrw.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 25219
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_misc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 25367
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_class.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 25532
|
||||
},
|
||||
{
|
||||
"original_file": "duk_alloc_default.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 25661
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_buffer.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 25693
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_bytecode.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 25766
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_call.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 26546
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_codec.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 27072
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_compile.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 28010
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_debug.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 28185
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_heap.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 28446
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_inspect.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 28655
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_memory.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 28958
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_object.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 29038
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_random.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 30159
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_readable.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 30169
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_stack.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 30525
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_string.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 37426
|
||||
},
|
||||
{
|
||||
"original_file": "duk_api_time.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 37817
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_array.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 37927
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_boolean.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 39581
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_buffer.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 39650
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_cbor.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 42576
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_date.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 44504
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_date_unix.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 46402
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_date_windows.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 46750
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_duktape.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 46945
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_encoding.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 47095
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_error.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 47646
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_function.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 48046
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_global.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 48500
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_json.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 49221
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_math.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 52561
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_number.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 53052
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_object.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 53316
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_performance.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 54033
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_pointer.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 54064
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_promise.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 54138
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_proxy.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 54182
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_reflect.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 54233
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_regexp.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 54321
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_string.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 54549
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_symbol.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 56036
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_thread.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 56208
|
||||
},
|
||||
{
|
||||
"original_file": "duk_bi_thrower.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 56532
|
||||
},
|
||||
{
|
||||
"original_file": "duk_debug_fixedbuffer.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 56541
|
||||
},
|
||||
{
|
||||
"original_file": "duk_debug_vsnprintf.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 56610
|
||||
},
|
||||
{
|
||||
"original_file": "duk_debugger.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 57855
|
||||
},
|
||||
{
|
||||
"original_file": "duk_error_augment.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 60927
|
||||
},
|
||||
{
|
||||
"original_file": "duk_error_longjmp.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 61528
|
||||
},
|
||||
{
|
||||
"original_file": "duk_error_misc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 61635
|
||||
},
|
||||
{
|
||||
"original_file": "duk_error_throw.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 61813
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hbuffer_alloc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 61972
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hbuffer_assert.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 62106
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hbuffer_ops.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 62119
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hbufobj_misc.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 62197
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_alloc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 62319
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_finalize.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 63595
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_hashstring.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 64044
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_markandsweep.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 64165
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_memory.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 65771
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_misc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 66205
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_refcount.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 66392
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_stringcache.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 67364
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heap_stringtable.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 67865
|
||||
},
|
||||
{
|
||||
"original_file": "duk_heaphdr_assert.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 69108
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_alloc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 69199
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_array.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 69479
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_assert.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 69758
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_lookup.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 69998
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_misc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 70556
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_pc2line.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 71019
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_props.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 71265
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_proxy.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 71721
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hobject_resize.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 71885
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hstring_assert.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 73228
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hstring_misc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 73250
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hthread_alloc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 73479
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hthread_builtins.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 73538
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hthread_misc.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 74438
|
||||
},
|
||||
{
|
||||
"original_file": "duk_hthread_stacks.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 74535
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_arith.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 74898
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_call.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 75039
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_compiler.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 77862
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_executor.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 86010
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_ops.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 91409
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_prop.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 92848
|
||||
},
|
||||
{
|
||||
"original_file": "duk_js_var.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 93095
|
||||
},
|
||||
{
|
||||
"original_file": "duk_lexer.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 94829
|
||||
},
|
||||
{
|
||||
"original_file": "duk_numconv.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 97281
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_defown.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 99623
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_delete.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 101144
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_enum.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 102280
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_get.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 102538
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_getown.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 104476
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_has.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 105079
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_ownpropkeys.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 105712
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_set.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 106347
|
||||
},
|
||||
{
|
||||
"original_file": "duk_prop_util.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 109579
|
||||
},
|
||||
{
|
||||
"original_file": "duk_regexp_compiler.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 109893
|
||||
},
|
||||
{
|
||||
"original_file": "duk_regexp_executor.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 111194
|
||||
},
|
||||
{
|
||||
"original_file": "duk_selftest.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 112187
|
||||
},
|
||||
{
|
||||
"original_file": "duk_tval.c",
|
||||
"original_line": 2,
|
||||
"combined_line": 112934
|
||||
},
|
||||
{
|
||||
"original_file": "duk_unicode_wtf8.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 113085
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_bitdecoder.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 114166
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_bitencoder.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 114330
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_bufwriter.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 114373
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_cast.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 114659
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_double.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 114831
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_hashbytes.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 115174
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_memory.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 115236
|
||||
},
|
||||
{
|
||||
"original_file": "duk_util_tinyrandom.c",
|
||||
"original_line": 1,
|
||||
"combined_line": 115272
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,392 +0,0 @@
|
||||
#include <Uefi.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
|
||||
// EDK2 CRT Support Header
|
||||
#include <CrtLibSupport.h>
|
||||
|
||||
// Global variables required by CrtLibSupport.h
|
||||
int errno = 0;
|
||||
FILE *stderr = NULL;
|
||||
|
||||
// Better malloc/free with size tracking
|
||||
typedef struct {
|
||||
size_t size;
|
||||
char data[];
|
||||
} AllocHeader;
|
||||
|
||||
void *my_malloc(size_t size) {
|
||||
AllocHeader *hdr;
|
||||
if (gBS->AllocatePool(EfiLoaderData, size + sizeof(AllocHeader), (void**)&hdr) != EFI_SUCCESS) {
|
||||
return NULL;
|
||||
}
|
||||
hdr->size = size;
|
||||
return hdr->data;
|
||||
}
|
||||
|
||||
void my_free(void *ptr) {
|
||||
if (ptr) {
|
||||
AllocHeader *hdr = (AllocHeader*)((char*)ptr - sizeof(AllocHeader));
|
||||
gBS->FreePool(hdr);
|
||||
}
|
||||
}
|
||||
|
||||
void *my_realloc(void *ptr, size_t size) {
|
||||
if (!ptr) return my_malloc(size);
|
||||
if (size == 0) {
|
||||
my_free(ptr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
AllocHeader *old_hdr = (AllocHeader*)((char*)ptr - sizeof(AllocHeader));
|
||||
size_t old_size = old_hdr->size;
|
||||
|
||||
void *new_ptr = my_malloc(size);
|
||||
if (!new_ptr) return NULL;
|
||||
|
||||
CopyMem(new_ptr, ptr, old_size < size ? old_size : size);
|
||||
my_free(ptr);
|
||||
return new_ptr;
|
||||
}
|
||||
|
||||
// Redirect standard malloc/free/realloc to our versions
|
||||
#undef malloc
|
||||
#undef free
|
||||
#undef realloc
|
||||
|
||||
void *malloc(size_t size) { return my_malloc(size); }
|
||||
void free(void *ptr) { my_free(ptr); }
|
||||
void *realloc(void *ptr, size_t size) { return my_realloc(ptr, size); }
|
||||
|
||||
void *calloc(size_t nmemb, size_t size) {
|
||||
size_t total = nmemb * size;
|
||||
void *ptr = malloc(total);
|
||||
if (ptr) {
|
||||
SetMem(ptr, total, 0);
|
||||
}
|
||||
return ptr;
|
||||
}
|
||||
|
||||
// IO
|
||||
int printf(const char *format, ...) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vsnprintf(char *str, size_t size, const char *format, va_list ap) {
|
||||
return (int)AsciiVSPrint(str, size, format, ap);
|
||||
}
|
||||
|
||||
int snprintf(char *str, size_t size, const char *format, ...) {
|
||||
VA_LIST Marker;
|
||||
VA_START(Marker, format);
|
||||
UINTN Return = AsciiVSPrint(str, size, format, Marker);
|
||||
VA_END(Marker);
|
||||
return (int)Return;
|
||||
}
|
||||
|
||||
// sprintf is a macro in CrtLibSupport.h, so we don't define it.
|
||||
|
||||
|
||||
// Math functions
|
||||
// Duktape needs math functions for proper numeric conversions and bitwise operations.
|
||||
// EDK2 doesn't provide a standard math library, so we implement basic versions here.
|
||||
|
||||
double fabs(double x) {
|
||||
return x < 0.0 ? -x : x;
|
||||
}
|
||||
|
||||
double floor(double x) {
|
||||
if (x >= 0.0) {
|
||||
return (double)(INT64)x;
|
||||
} else {
|
||||
INT64 i = (INT64)x;
|
||||
return (double)((x == (double)i) ? i : i - 1);
|
||||
}
|
||||
}
|
||||
|
||||
double ceil(double x) {
|
||||
if (x >= 0.0) {
|
||||
INT64 i = (INT64)x;
|
||||
return (double)((x == (double)i) ? i : i + 1);
|
||||
} else {
|
||||
return (double)(INT64)x;
|
||||
}
|
||||
}
|
||||
|
||||
double trunc(double x) {
|
||||
return (double)(INT64)x;
|
||||
}
|
||||
|
||||
double fmod(double x, double y) {
|
||||
if (y == 0.0) return 0.0;
|
||||
INT64 quotient = (INT64)(x / y);
|
||||
return x - quotient * y;
|
||||
}
|
||||
|
||||
// Newton-Raphson square root implementation
|
||||
double sqrt(double x) {
|
||||
if (x < 0.0) return 0.0; // Return 0 for negative (should be NaN)
|
||||
if (x == 0.0) return 0.0;
|
||||
|
||||
double guess = x;
|
||||
double epsilon = 0.00001;
|
||||
|
||||
// Newton-Raphson: x_new = (x_old + n/x_old) / 2
|
||||
for (int i = 0; i < 50; i++) {
|
||||
double next = (guess + x / guess) / 2.0;
|
||||
if (fabs(next - guess) < epsilon) break;
|
||||
guess = next;
|
||||
}
|
||||
|
||||
return guess;
|
||||
}
|
||||
|
||||
// Power function using binary exponentiation for integer exponents
|
||||
double pow(double base, double exponent) {
|
||||
// Handle special cases
|
||||
if (exponent == 0.0) return 1.0;
|
||||
if (base == 0.0) return 0.0;
|
||||
if (base == 1.0) return 1.0;
|
||||
if (exponent == 1.0) return base;
|
||||
|
||||
// Check if exponent is an integer
|
||||
INT64 exp_int = (INT64)exponent;
|
||||
if ((double)exp_int == exponent) {
|
||||
// Integer exponent - use binary exponentiation
|
||||
double result = 1.0;
|
||||
double current = base;
|
||||
UINT64 n = (exp_int < 0) ? -exp_int : exp_int;
|
||||
|
||||
while (n > 0) {
|
||||
if (n & 1) result *= current;
|
||||
current *= current;
|
||||
n >>= 1;
|
||||
}
|
||||
|
||||
return (exp_int < 0) ? (1.0 / result) : result;
|
||||
}
|
||||
|
||||
// For non-integer exponents, return 0 (would need exp/log)
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
// Trigonometric functions - stubs (not needed for bitwise ops)
|
||||
double sin(double x) { return 0.0; }
|
||||
double cos(double x) { return 0.0; }
|
||||
double tan(double x) { return 0.0; }
|
||||
double asin(double x) { return 0.0; }
|
||||
double acos(double x) { return 0.0; }
|
||||
double atan(double x) { return 0.0; }
|
||||
double atan2(double y, double x) { return 0.0; }
|
||||
double exp(double x) { return 0.0; }
|
||||
double log(double x) { return 0.0; }
|
||||
double log10(double x) { return 0.0; }
|
||||
double cbrt(double x) { return 0.0; }
|
||||
double log2(double x) { return 0.0; }
|
||||
|
||||
// Other
|
||||
void abort(void) {
|
||||
// CpuDeadLoop();
|
||||
while(1);
|
||||
}
|
||||
|
||||
void exit(int status) {
|
||||
// CpuDeadLoop();
|
||||
while(1);
|
||||
}
|
||||
|
||||
// Global gBS
|
||||
EFI_BOOT_SERVICES *gBS = NULL;
|
||||
int _fltused = 0;
|
||||
|
||||
// Stack probe (needed for MSVC ABI)
|
||||
void __chkstk(void) { return; }
|
||||
|
||||
// Memory functions
|
||||
#undef memset
|
||||
#undef memcpy
|
||||
#undef memcmp
|
||||
|
||||
void *memset(void *s, int c, size_t n) {
|
||||
unsigned char *p = s;
|
||||
while (n--) {
|
||||
*p++ = (unsigned char)c;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
void *memcpy(void *dest, const void *src, size_t n) {
|
||||
char *d = dest;
|
||||
const char *s = src;
|
||||
while (n--) {
|
||||
*d++ = *s++;
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
int memcmp(const void *s1, const void *s2, size_t n) {
|
||||
const unsigned char *p1 = s1, *p2 = s2;
|
||||
while (n--) {
|
||||
if (*p1 != *p2) {
|
||||
return *p1 - *p2;
|
||||
}
|
||||
p1++;
|
||||
p2++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *SetMem(void *Buffer, UINTN Length, UINT8 Value) {
|
||||
return memset(Buffer, Value, Length);
|
||||
}
|
||||
|
||||
void *CopyMem(void *Destination, const void *Source, UINTN Length) {
|
||||
return memcpy(Destination, Source, Length);
|
||||
}
|
||||
|
||||
INTN CompareMem(const void *Destination, const void *Source, UINTN Length) {
|
||||
return (INTN)memcmp(Destination, Source, Length);
|
||||
}
|
||||
|
||||
// String functions
|
||||
UINTN AsciiStrnLenS(const CHAR8 *String, UINTN MaxSize) {
|
||||
UINTN len = 0;
|
||||
while (len < MaxSize && String[len] != 0) {
|
||||
len++;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
INTN AsciiStrnCmp(const CHAR8 *FirstString, const CHAR8 *SecondString, UINTN Length) {
|
||||
if (Length == 0) return 0;
|
||||
while (Length > 0 && *FirstString && *SecondString) {
|
||||
if (*FirstString != *SecondString) break;
|
||||
FirstString++;
|
||||
SecondString++;
|
||||
Length--;
|
||||
}
|
||||
if (Length == 0) return 0;
|
||||
return *FirstString - *SecondString;
|
||||
}
|
||||
|
||||
int strcmp(const char *s1, const char *s2) {
|
||||
while (*s1 && (*s1 == *s2)) {
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
return *(const unsigned char *)s1 - *(const unsigned char *)s2;
|
||||
}
|
||||
|
||||
// Print functions
|
||||
// Minimal vsnprintf implementation
|
||||
#include <stdarg.h>
|
||||
static void simple_append(char **str, size_t *size, char c) {
|
||||
if (*size > 1) {
|
||||
**str = c;
|
||||
(*str)++;
|
||||
(*size)--;
|
||||
}
|
||||
}
|
||||
|
||||
static void simple_append_str(char **str, size_t *size, const char *s) {
|
||||
while (*s) {
|
||||
simple_append(str, size, *s++);
|
||||
}
|
||||
}
|
||||
|
||||
static void simple_append_hex(char **str, size_t *size, UINT64 num) {
|
||||
char buf[17];
|
||||
const char *digits = "0123456789ABCDEF";
|
||||
int i = 0;
|
||||
if (num == 0) {
|
||||
simple_append(str, size, '0');
|
||||
return;
|
||||
}
|
||||
while (num > 0) {
|
||||
buf[i++] = digits[num % 16];
|
||||
num /= 16;
|
||||
}
|
||||
while (i > 0) {
|
||||
simple_append(str, size, buf[--i]);
|
||||
}
|
||||
}
|
||||
|
||||
static void simple_append_dec(char **str, size_t *size, INT64 num) {
|
||||
char buf[21];
|
||||
int i = 0;
|
||||
int neg = 0;
|
||||
if (num < 0) {
|
||||
neg = 1;
|
||||
num = -num;
|
||||
}
|
||||
if (num == 0) {
|
||||
simple_append(str, size, '0');
|
||||
return;
|
||||
}
|
||||
while (num > 0) {
|
||||
buf[i++] = (num % 10) + '0';
|
||||
num /= 10;
|
||||
}
|
||||
if (neg) simple_append(str, size, '-');
|
||||
while (i > 0) {
|
||||
simple_append(str, size, buf[--i]);
|
||||
}
|
||||
}
|
||||
|
||||
UINTN AsciiVSPrint(CHAR8 *StartOfBuffer, UINTN BufferSize, CONST CHAR8 *FormatString, VA_LIST Marker) {
|
||||
char *str = StartOfBuffer;
|
||||
size_t size = BufferSize;
|
||||
const char *fmt = FormatString;
|
||||
|
||||
while (*fmt) {
|
||||
if (*fmt == '%') {
|
||||
fmt++;
|
||||
if (*fmt == 's') {
|
||||
char *s = VA_ARG(Marker, char*);
|
||||
simple_append_str(&str, &size, s ? s : "(null)");
|
||||
} else if (*fmt == 'd') {
|
||||
int d = VA_ARG(Marker, int);
|
||||
simple_append_dec(&str, &size, d);
|
||||
} else if (*fmt == 'x' || *fmt == 'X') {
|
||||
unsigned int x = VA_ARG(Marker, unsigned int);
|
||||
simple_append_hex(&str, &size, x);
|
||||
} else if (*fmt == 'p') {
|
||||
void *p = VA_ARG(Marker, void*);
|
||||
simple_append_hex(&str, &size, (UINT64)p);
|
||||
} else if (*fmt == '%') {
|
||||
simple_append(&str, &size, '%');
|
||||
} else {
|
||||
simple_append(&str, &size, '%');
|
||||
simple_append(&str, &size, *fmt);
|
||||
}
|
||||
} else {
|
||||
simple_append(&str, &size, *fmt);
|
||||
}
|
||||
fmt++;
|
||||
}
|
||||
*str = 0;
|
||||
return (UINTN)(str - StartOfBuffer);
|
||||
}
|
||||
|
||||
UINTN AsciiSPrint(CHAR8 *StartOfBuffer, UINTN BufferSize, CONST CHAR8 *FormatString, ...) {
|
||||
VA_LIST Marker;
|
||||
VA_START(Marker, FormatString);
|
||||
UINTN ret = AsciiVSPrint(StartOfBuffer, BufferSize, FormatString, Marker);
|
||||
VA_END(Marker);
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Time functions
|
||||
struct tm *gmtime(const time_t *timep) { return NULL; }
|
||||
time_t mktime(struct tm *tm) { return 0; }
|
||||
int sscanf(const char *str, const char *format, ...) { return 0; }
|
||||
|
||||
time_t time(time_t *tloc) { return 0; }
|
||||
double difftime(time_t time1, time_t time0) { return (double)(time1 - time0); }
|
||||
|
||||
|
||||
// Needed for CrtLibSupport headers to work?
|
||||
// They use VA_LIST etc which are in Base.h
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "efi.h"
|
||||
#include "main.h"
|
||||
|
||||
extern EFI_BOOT_SERVICES *gBS;
|
||||
|
||||
EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
|
||||
gBS = SystemTable->BootServices;
|
||||
|
||||
// Initialize standard library (if needed)
|
||||
// ...
|
||||
return kernel_main(SystemTable);
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
#ifndef EFI_H
|
||||
#define EFI_H
|
||||
|
||||
#ifndef MDE_CPU_X64
|
||||
#define MDE_CPU_X64
|
||||
#endif
|
||||
|
||||
#include <Uefi.h>
|
||||
|
||||
// Map legacy names if needed, or update main.c
|
||||
typedef EFI_SYSTEM_TABLE EfiSystemTable;
|
||||
|
||||
#endif
|
||||
147
core/src/main.c
147
core/src/main.c
@@ -1,147 +0,0 @@
|
||||
#include "main.h"
|
||||
#include "efi.h"
|
||||
#include "efi.h"
|
||||
#include <Protocol/CpuIo2.h>
|
||||
#include <Protocol/PciRootBridgeIo.h>
|
||||
#include "duktape.h"
|
||||
#include "embedded_js.h"
|
||||
|
||||
duk_context *ctx;
|
||||
EFI_SYSTEM_TABLE* systemTable;
|
||||
|
||||
void halt() {
|
||||
for (;;) {}
|
||||
}
|
||||
|
||||
void ascii_to_utf16(const char *ascii, CHAR16 *utf16) {
|
||||
while (*ascii) {
|
||||
*utf16++ = (CHAR16)*ascii++;
|
||||
}
|
||||
*utf16 = 0;
|
||||
}
|
||||
|
||||
duk_ret_t native_systable_conout_output_string(duk_context *ctx) {
|
||||
CHAR16 buffer[256];
|
||||
ascii_to_utf16(duk_safe_to_string(ctx, 0), buffer);
|
||||
systemTable->ConOut->OutputString(systemTable->ConOut, buffer);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
duk_ret_t native_systable_conout_clear_screen(duk_context *ctx) {
|
||||
systemTable->ConOut->ClearScreen(systemTable->ConOut);
|
||||
return 0;
|
||||
}
|
||||
|
||||
duk_ret_t native_systable_conout_set_attribute(duk_context *ctx) {
|
||||
systemTable->ConOut->SetAttribute(systemTable->ConOut, duk_to_uint(ctx, 0));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
duk_ret_t native_systable_io_dword_in(duk_context *ctx) {
|
||||
EFI_CPU_IO2_PROTOCOL* cpuIo;
|
||||
EFI_GUID cpuIoGuid = EFI_CPU_IO2_PROTOCOL_GUID;
|
||||
systemTable->BootServices->LocateProtocol(&cpuIoGuid, NULL, (void**)&cpuIo);
|
||||
|
||||
UINT32 data;
|
||||
cpuIo->Io.Read(cpuIo, EfiCpuIoWidthUint32, duk_to_uint(ctx, 0), 1, &data);
|
||||
duk_push_uint(ctx, data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
duk_ret_t native_systable_io_dword_out(duk_context *ctx) {
|
||||
EFI_CPU_IO2_PROTOCOL* cpuIo;
|
||||
EFI_GUID cpuIoGuid = EFI_CPU_IO2_PROTOCOL_GUID;
|
||||
systemTable->BootServices->LocateProtocol(&cpuIoGuid, NULL, (void**)&cpuIo);
|
||||
|
||||
UINT32 data = duk_to_uint(ctx, 1);
|
||||
cpuIo->Io.Write(cpuIo, EfiCpuIoWidthUint32, duk_to_uint(ctx, 0), 1, &data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
duk_ret_t native_systable_pci_read_config(duk_context *ctx) {
|
||||
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL* pci;
|
||||
EFI_GUID pciGuid = EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID;
|
||||
systemTable->BootServices->LocateProtocol(&pciGuid, NULL, (void**)&pci);
|
||||
|
||||
UINT64 bus = duk_to_uint(ctx, 0);
|
||||
UINT64 device = duk_to_uint(ctx, 1);
|
||||
UINT64 func = duk_to_uint(ctx, 2);
|
||||
UINT64 offset = duk_to_uint(ctx, 3);
|
||||
UINT64 address = (bus << 24) | (device << 16) | (func << 8) | (offset & 0xff);
|
||||
UINT32 data = 0;
|
||||
|
||||
pci->Pci.Read(pci, EfiPciWidthUint32, address, 1, &data);
|
||||
|
||||
duk_push_uint(ctx, data);
|
||||
return 1;
|
||||
}
|
||||
|
||||
duk_ret_t native_systable_pci_write_config(duk_context *ctx) {
|
||||
EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL* pci;
|
||||
EFI_GUID pciGuid = EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_GUID;
|
||||
systemTable->BootServices->LocateProtocol(&pciGuid, NULL, (void**)&pci);
|
||||
|
||||
UINT64 bus = duk_to_uint(ctx, 0);
|
||||
UINT64 device = duk_to_uint(ctx, 1);
|
||||
UINT64 func = duk_to_uint(ctx, 2);
|
||||
UINT64 offset = duk_to_uint(ctx, 3);
|
||||
UINT64 address = (bus << 24) | (device << 16) | (func << 8) | (offset & 0xff);
|
||||
UINT32 data = duk_to_uint(ctx, 4);
|
||||
|
||||
pci->Pci.Write(pci, EfiPciWidthUint32, address, 1, &data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kernel_main(EFI_SYSTEM_TABLE *st) {
|
||||
systemTable = st;
|
||||
systemTable->ConOut->ClearScreen(systemTable->ConOut);
|
||||
systemTable->ConOut->OutputString(systemTable->ConOut, L"START\r\n");
|
||||
|
||||
ctx = duk_create_heap_default();
|
||||
|
||||
duk_push_c_function(ctx, native_systable_conout_output_string, 1);
|
||||
duk_put_global_string(ctx, "$___native_systable_conout_outputString");
|
||||
|
||||
duk_push_c_function(ctx, native_systable_conout_clear_screen, 0);
|
||||
duk_put_global_string(ctx, "$___native_systable_conout_clearScreen");
|
||||
|
||||
duk_push_c_function(ctx, native_systable_conout_set_attribute, 1);
|
||||
duk_put_global_string(ctx, "$___native_systable_conout_setAttribute");
|
||||
|
||||
duk_push_c_function(ctx, native_systable_io_dword_in, 1);
|
||||
duk_put_global_string(ctx, "$___native_systable_io_dword_in");
|
||||
|
||||
duk_push_c_function(ctx, native_systable_io_dword_out, 2);
|
||||
duk_put_global_string(ctx, "$___native_systable_io_dword_out");
|
||||
|
||||
duk_push_c_function(ctx, native_systable_pci_read_config, 4);
|
||||
duk_put_global_string(ctx, "$___native_systable_pci_read_config");
|
||||
|
||||
duk_push_c_function(ctx, native_systable_pci_write_config, 5);
|
||||
duk_put_global_string(ctx, "$___native_systable_pci_write_config");
|
||||
|
||||
systemTable->ConOut->OutputString(systemTable->ConOut, L"RUN\r\n");
|
||||
|
||||
duk_push_string(ctx, EMBEDDED_JS);
|
||||
duk_int_t returnCode = duk_peval(ctx);
|
||||
|
||||
/*if (returnCode != 0)
|
||||
{
|
||||
duk_safe_to_stacktrace(ctx, -1);
|
||||
|
||||
CHAR16 buffer[256];
|
||||
ascii_to_utf16(duk_safe_to_string(ctx, -1), buffer);
|
||||
systemTable->ConOut->OutputString(systemTable->ConOut, buffer);
|
||||
}
|
||||
|
||||
duk_pop(ctx);*/
|
||||
|
||||
systemTable->ConOut->OutputString(systemTable->ConOut, L"!!! KERNEL EXITED UNEXPECTEDLY !!!\r\n");
|
||||
|
||||
halt();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
#include "efi.h"
|
||||
|
||||
#ifndef MAIN_H
|
||||
#define MAIN_H
|
||||
|
||||
int kernel_main(EFI_SYSTEM_TABLE* systemTable);
|
||||
|
||||
#endif
|
||||
1
edk2
1
edk2
Submodule edk2 deleted from aacfbe667e
15
os/README.md
15
os/README.md
@@ -1,15 +0,0 @@
|
||||
# os
|
||||
|
||||
To install dependencies:
|
||||
|
||||
```bash
|
||||
bun install
|
||||
```
|
||||
|
||||
To run:
|
||||
|
||||
```bash
|
||||
bun run index.ts
|
||||
```
|
||||
|
||||
This project was created using `bun init` in bun v1.2.20. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime.
|
||||
@@ -1,12 +0,0 @@
|
||||
import { kmain } from "./kernel";
|
||||
import { kpanic } from "./kernel/panic";
|
||||
|
||||
try {
|
||||
const res = kmain();
|
||||
|
||||
if (res != 0) {
|
||||
kpanic("Kernel returned non-zero exit code");
|
||||
}
|
||||
} catch (e) {
|
||||
kpanic(e instanceof Error ? e.message : String(e));
|
||||
}
|
||||
@@ -1,126 +0,0 @@
|
||||
import { Logger } from "../../../libs/logger";
|
||||
import { Path } from "../../../libs/path";
|
||||
import { sysfs, sysfs_mkdir, sysfs_writeFile } from "../../filesystem/sysfs";
|
||||
|
||||
export function kdriver_dev_pci_init() {
|
||||
sysfs_mkdir("/pci");
|
||||
}
|
||||
|
||||
export function kdriver_dev_pci_detectDevices() {
|
||||
Logger.log("[PCI] Scanning...");
|
||||
|
||||
for (let bus = 0; bus < 256; bus++) {
|
||||
for (let device = 0; device < 32; device++) {
|
||||
kdriver_dev_pci_checkDevice(bus, device, 0);
|
||||
|
||||
const headerType = kdriver_dev_pci_getHeaderType(bus, device, 0);
|
||||
if ((headerType & 0x80) !== 0) {
|
||||
for (let func = 1; func < 8; func++) {
|
||||
kdriver_dev_pci_checkDevice(bus, device, func);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function kdriver_dev_pci_checkDevice(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number
|
||||
) {
|
||||
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 0);
|
||||
|
||||
if (data === 0 || data === -1) return;
|
||||
|
||||
const vendorId = data & 0xffff;
|
||||
const deviceId = data >>> 16;
|
||||
|
||||
if (vendorId === 0 || vendorId === 0xffff) return;
|
||||
|
||||
const classCode = kdriver_dev_pci_getClassCode(bus, device, func);
|
||||
const subclass = kdriver_dev_pci_getSubclass(bus, device, func);
|
||||
|
||||
const filename = bus + ":" + device + ":" + func;
|
||||
|
||||
Logger.log(
|
||||
"[PCI] Found device pci:" +
|
||||
filename +
|
||||
" (vendor:" +
|
||||
vendorId.toString(16) +
|
||||
", device:" +
|
||||
deviceId.toString(16) +
|
||||
", class:" +
|
||||
classCode.toString(16) +
|
||||
", subclass:" +
|
||||
subclass.toString(16) +
|
||||
")"
|
||||
);
|
||||
|
||||
const dirname = Path.join("/pci", filename);
|
||||
|
||||
sysfs_mkdir(dirname);
|
||||
sysfs_writeFile(Path.join(dirname, "vendor"), "Intel");
|
||||
/*sysfs_writeFile(Path.join(dirname, "vendor"), vendorId.toString(16));
|
||||
sysfs_writeFile(Path.join(dirname, "device"), deviceId.toString(16));
|
||||
sysfs_writeFile(Path.join(dirname, "class"), classCode.toString(16));
|
||||
sysfs_writeFile(Path.join(dirname, "subclass"), subclass.toString(16));*/
|
||||
}
|
||||
|
||||
export function kdriver_dev_pci_getDeviceId(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number
|
||||
) {
|
||||
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 0);
|
||||
|
||||
return data >>> 16;
|
||||
}
|
||||
|
||||
export function kdriver_dev_pci_getVendorId(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number
|
||||
) {
|
||||
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 0);
|
||||
|
||||
return data & 0xffff;
|
||||
}
|
||||
|
||||
export function kdriver_dev_pci_getClassCode(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number
|
||||
) {
|
||||
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 8);
|
||||
|
||||
return (data >> 24) & 0xff;
|
||||
}
|
||||
|
||||
export function kdriver_dev_pci_getSubclass(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number
|
||||
) {
|
||||
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 8);
|
||||
|
||||
return (data >> 16) & 0xff;
|
||||
}
|
||||
|
||||
export function kdriver_dev_pci_getHeaderType(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number
|
||||
) {
|
||||
const data = kdriver_dev_pci_readConfigDword(bus, device, func, 12);
|
||||
|
||||
return (data >> 16) & 0xff;
|
||||
}
|
||||
|
||||
export function kdriver_dev_pci_readConfigDword(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number,
|
||||
offset: number
|
||||
) {
|
||||
return $___native_systable_pci_read_config(bus, device, func, offset);
|
||||
}
|
||||
@@ -1,106 +0,0 @@
|
||||
import { Logger } from "../../libs/logger";
|
||||
import { Path } from "../../libs/path";
|
||||
import {
|
||||
FilesystemType,
|
||||
type Filesystem,
|
||||
type FilesystemEntity,
|
||||
} from "../../types/kernel/filesystem";
|
||||
|
||||
const sysfs_data: FilesystemEntity[] = [];
|
||||
|
||||
export function sysfs(): Filesystem {
|
||||
return {
|
||||
type: FilesystemType.SYSFS,
|
||||
mkdir: sysfs_mkdir,
|
||||
ls: sysfs_ls,
|
||||
writeFile(path, content) {
|
||||
throw new Error("Cannot write to sysfs");
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export function sysfs_root(): FilesystemEntity {
|
||||
/*return {
|
||||
name: "$root",
|
||||
path: "/",
|
||||
size: 0,
|
||||
isDirectory: true,
|
||||
contents: null,
|
||||
};*/
|
||||
}
|
||||
|
||||
export function sysfs_get(path: string): FilesystemEntity | null {
|
||||
if (path == "" || path == "/") return sysfs_root();
|
||||
|
||||
for (let i = 0; i < sysfs_data.length; i++) {
|
||||
Logger.log(sysfs_data[i]);
|
||||
|
||||
if (sysfs_data[i]!.path === path) {
|
||||
return sysfs_data[i]!;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
export function sysfs_mkdir(path: string) {
|
||||
if (sysfs_get(path)) return;
|
||||
|
||||
const parent = sysfs_get(Path.dirname(path));
|
||||
if (!parent || !parent.isDirectory) return;
|
||||
|
||||
Logger.log(path);
|
||||
|
||||
/*sysfs_data.push({
|
||||
name: Path.filename(path),
|
||||
path: path,
|
||||
size: 0,
|
||||
isDirectory: true,
|
||||
contents: 0,
|
||||
});*/
|
||||
}
|
||||
|
||||
export function sysfs_ls(path: string): FilesystemEntity[] | null {
|
||||
/*const entity = sysfs_get(path);
|
||||
if (!entity || !entity.isDirectory) return null;
|
||||
|
||||
const result: FilesystemEntity[] = [];
|
||||
const prefix = path + "/";
|
||||
|
||||
for (let i = 0; i < globalThis.sysfs_data.length; i++) {
|
||||
const itemPath = globalThis.sysfs_data[i]!.path;
|
||||
|
||||
// Only include direct children (no additional slashes after the prefix)
|
||||
if (
|
||||
itemPath.startsWith(prefix) &&
|
||||
!itemPath.substring(prefix.length).includes("/")
|
||||
) {
|
||||
result.push(globalThis.sysfs_data[i]!);
|
||||
}
|
||||
}
|
||||
|
||||
return result;*/
|
||||
}
|
||||
|
||||
export function sysfs_createFile(path: string, content: string) {
|
||||
if (sysfs_get(path)) return;
|
||||
|
||||
/*const parent = sysfs_getParent(path);
|
||||
if (!parent || !parent.isDirectory) return;
|
||||
|
||||
globalThis.sysfs_data.push({
|
||||
name: Path.filename(path),
|
||||
path: path,
|
||||
size: content.length,
|
||||
isDirectory: false,
|
||||
contents: content,
|
||||
});*/
|
||||
}
|
||||
|
||||
export function sysfs_writeFile(path: string, content: string) {
|
||||
const entity = sysfs_get(path);
|
||||
/*if (!entity) return sysfs_createFile(path, content);
|
||||
if (entity.isDirectory) return;
|
||||
|
||||
entity.contents = content;*/
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
import { Logger } from "../libs/logger";
|
||||
import { kdriver_dev_pci_detectDevices } from "./drivers/dev/pci.kdriver";
|
||||
import { sysfs_ls } from "./filesystem/sysfs";
|
||||
import {
|
||||
kmod_console_clearScreen,
|
||||
kmod_console_outputString,
|
||||
} from "./modules/console/console.kmod";
|
||||
import { kmod_drivers_init } from "./modules/drivers.kmod";
|
||||
|
||||
export function kmain() {
|
||||
kmod_console_clearScreen();
|
||||
|
||||
Logger.log("[Kernel] Starting kernel...");
|
||||
|
||||
kmod_drivers_init();
|
||||
|
||||
kdriver_dev_pci_detectDevices();
|
||||
|
||||
/*const files = sysfs_ls("/");
|
||||
|
||||
files!.forEach(function (file) {
|
||||
Logger.log(file.name);
|
||||
});*/
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
export function kmod_console_clearScreen() {
|
||||
$___native_systable_conout_clearScreen();
|
||||
}
|
||||
|
||||
export function kmod_console_setAttribute(attribute: number) {
|
||||
$___native_systable_conout_setAttribute(attribute);
|
||||
}
|
||||
|
||||
export function kmod_console_outputString(string: string) {
|
||||
$___native_systable_conout_outputString(string);
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
import { Logger } from "../../libs/logger";
|
||||
import { kdriver_dev_pci_init } from "../drivers/dev/pci.kdriver";
|
||||
|
||||
const drivers = [kdriver_dev_pci_init];
|
||||
|
||||
export function kmod_drivers_init() {
|
||||
Logger.log("[Kernel] Initializing drivers...");
|
||||
|
||||
for (let i = 0; i < drivers.length; i++) {
|
||||
drivers[i]!();
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
import {
|
||||
kmod_console_clearScreen,
|
||||
kmod_console_outputString,
|
||||
kmod_console_setAttribute,
|
||||
} from "./modules/console/console.kmod";
|
||||
|
||||
export function kpanic(message: string) {
|
||||
kmod_console_clearScreen();
|
||||
kmod_console_setAttribute(0x0c);
|
||||
kmod_console_outputString("Kernel panic: \\r\\n");
|
||||
kmod_console_outputString(message);
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
export function dwordin(port: number): number {
|
||||
return $___native_systable_io_dwordin(port);
|
||||
}
|
||||
|
||||
export function dwordout(port: number, value: number) {
|
||||
$___native_systable_io_dwordout(port, value);
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
import { kmod_console_outputString } from "../kernel/modules/console/console.kmod";
|
||||
|
||||
export const Logger = {
|
||||
log: function (message: string) {
|
||||
kmod_console_outputString(message + "\\r\\n");
|
||||
},
|
||||
};
|
||||
@@ -1,12 +0,0 @@
|
||||
export const Path = {
|
||||
join(p1: string, p2: string): string {
|
||||
if (p1.endsWith("/")) return p1 + p2;
|
||||
else return p1 + "/" + p2;
|
||||
},
|
||||
filename(path: string): string {
|
||||
return path.split("/").pop()!;
|
||||
},
|
||||
dirname(path: string): string {
|
||||
return path.split("/").slice(0, -1).join("/");
|
||||
},
|
||||
};
|
||||
26
os/src/types/global_c_bindings.d.ts
vendored
26
os/src/types/global_c_bindings.d.ts
vendored
@@ -1,26 +0,0 @@
|
||||
declare function $___native_systable_conout_outputString(string: string): void;
|
||||
declare function $___native_systable_conout_clearScreen(): void;
|
||||
declare function $___native_systable_conout_setAttribute(
|
||||
attribute: number
|
||||
): void;
|
||||
|
||||
declare function $___native_systable_io_dwordin(port: number): number;
|
||||
declare function $___native_systable_io_dwordout(
|
||||
port: number,
|
||||
value: number
|
||||
): void;
|
||||
|
||||
declare function $___native_systable_pci_read_config(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number,
|
||||
offset: number
|
||||
): number;
|
||||
|
||||
declare function $___native_systable_pci_write_config(
|
||||
bus: number,
|
||||
device: number,
|
||||
func: number,
|
||||
offset: number,
|
||||
value: number
|
||||
): void;
|
||||
@@ -1,18 +0,0 @@
|
||||
export enum FilesystemType {
|
||||
SYSFS,
|
||||
}
|
||||
|
||||
export interface Filesystem {
|
||||
type: FilesystemType;
|
||||
mkdir(path: string): void;
|
||||
ls(path: string): FilesystemEntity[] | null;
|
||||
writeFile(path: string, content: string): void;
|
||||
}
|
||||
|
||||
export type FilesystemEntity = {
|
||||
name: string;
|
||||
path: string;
|
||||
size: number;
|
||||
isDirectory: boolean;
|
||||
contents: string | number | number[] | null;
|
||||
};
|
||||
5
package.json
Normal file
5
package.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"sailet": "^0.1.1"
|
||||
}
|
||||
}
|
||||
13
sailet.config.ts
Normal file
13
sailet.config.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
// sailet.config.ts
|
||||
|
||||
import { script, step, cmd, $ } from "sailet";
|
||||
|
||||
script("build", () => [
|
||||
step("Build core", () => [cmd($`./src/scripts/build_core.sh`)]),
|
||||
step("Build ISO", () => [cmd($`./src/scripts/build_iso.sh`)]),
|
||||
]);
|
||||
|
||||
script("vbox", () => [
|
||||
step("Build", () => [cmd($`st run build`)]),
|
||||
step("Run", () => [cmd($`./src/scripts/run_vbox.sh`)]),
|
||||
]);
|
||||
@@ -1,11 +0,0 @@
|
||||
mkdir -p out
|
||||
mkdir -p out/core
|
||||
mkdir -p out/img/EFI/BOOT
|
||||
mkdir -p out/lib
|
||||
|
||||
clang -target x86_64-pc-win32-coff -fno-stack-protector -fshort-wchar -mno-red-zone -Iedk2/MdePkg/Include -Iedk2/MdePkg/Include/X64 -c core/src/efi.c -o out/core/efi.o
|
||||
clang -target x86_64-pc-win32-coff -fno-stack-protector -fshort-wchar -mno-red-zone -Icore/compat -Icore/lib/duktape/src -Iedk2/MdePkg/Include -Iedk2/MdePkg/Include/X64 -Iedk2/CryptoPkg/Library/Include -Iout -c core/src/main.c -o out/core/main.o
|
||||
clang -target x86_64-pc-win32-coff -fno-stack-protector -fshort-wchar -mno-red-zone -DDUK_F_GENERIC -U_WIN32 -UWIN32 -U_WIN64 -UWIN64 -Icore/compat -Iedk2/MdePkg/Include -Iedk2/MdePkg/Include/X64 -Iedk2/CryptoPkg/Library/Include -c core/lib/duktape/src/duktape.c -o out/lib/duktape.o
|
||||
clang -target x86_64-pc-win32-coff -fno-stack-protector -fshort-wchar -mno-red-zone -Icore/compat -Iedk2/MdePkg/Include -Iedk2/MdePkg/Include/X64 -Iedk2/CryptoPkg/Library/Include -c core/src/compat.c -o out/core/compat.o
|
||||
|
||||
lld-link -filealign:16 -subsystem:efi_application -nodefaultlib -dll -entry:efi_main out/core/main.o out/core/efi.o out/lib/duktape.o out/core/compat.o -out:out/img/EFI/BOOT/BOOTX64.EFI
|
||||
@@ -1,7 +0,0 @@
|
||||
# Build TypeScript to JavaScript
|
||||
cd os
|
||||
echo "Compiling TypeScript to JavaScript..."
|
||||
bun build --outdir ../out/os --target node --bundle src/index.ts
|
||||
cd ..
|
||||
|
||||
./scripts/process_js.js
|
||||
@@ -1,20 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
const fs = require("fs");
|
||||
|
||||
const script = fs.readFileSync("out/os/index.js", "utf-8");
|
||||
const processed = script
|
||||
.replaceAll("let ", "var ")
|
||||
.replaceAll("const ", "var ")
|
||||
.replaceAll("\n`", "\\n`")
|
||||
.replaceAll("`", "'");
|
||||
|
||||
fs.writeFileSync(
|
||||
"out/embedded_js.h",
|
||||
`
|
||||
#ifndef EMBEDDED_JS_H
|
||||
#define EMBEDDED_JS_H
|
||||
const char *EMBEDDED_JS = "${processed
|
||||
.replaceAll('"', '\\"')
|
||||
.replaceAll("\n", "\\n")}";
|
||||
#endif`
|
||||
);
|
||||
@@ -1 +0,0 @@
|
||||
./scripts/build_ts.sh && ./scripts/build_c.sh && ./scripts/out_to_iso.sh && ./scripts/run_vbox.sh
|
||||
@@ -1,22 +0,0 @@
|
||||
#!/bin/bash
|
||||
VM_NAME="LintsEFI"
|
||||
ISO_PATH="$(pwd)/out/lints.iso"
|
||||
|
||||
# Check if VM exists
|
||||
if VBoxManage list vms | grep -q "\"$VM_NAME\""; then
|
||||
echo "VM '$VM_NAME' already exists."
|
||||
else
|
||||
echo "Creating VM '$VM_NAME'..."
|
||||
VBoxManage createvm --name "$VM_NAME" --ostype "Other_64" --register
|
||||
VBoxManage modifyvm "$VM_NAME" --memory 128 --firmware efi --graphicscontroller vmsvga
|
||||
VBoxManage storagectl "$VM_NAME" --name "IDE Controller" --add ide
|
||||
fi
|
||||
|
||||
# Attach ISO (force unmount first just in case)
|
||||
echo "Attaching ISO..."
|
||||
VBoxManage storageattach "$VM_NAME" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium emptydrive --forceunmount
|
||||
VBoxManage storageattach "$VM_NAME" --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium "$ISO_PATH"
|
||||
|
||||
# Start VM
|
||||
echo "Starting VM..."
|
||||
VBoxManage startvm "$VM_NAME"
|
||||
9
src/core/compat/assert.h
Normal file
9
src/core/compat/assert.h
Normal file
@@ -0,0 +1,9 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
#define assert(x) ((void)0)
|
||||
#define NDEBUG 1
|
||||
0
src/core/compat/ctype.h
Normal file
0
src/core/compat/ctype.h
Normal file
0
src/core/compat/fenv.h
Normal file
0
src/core/compat/fenv.h
Normal file
27
src/core/compat/inttypes.h
Normal file
27
src/core/compat/inttypes.h
Normal file
@@ -0,0 +1,27 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#ifndef _INTTYPES_H
|
||||
#define _INTTYPES_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define PRId64 "lld"
|
||||
#define PRIu64 "llu"
|
||||
#define PRIx64 "llx"
|
||||
#define PRIX64 "llX"
|
||||
|
||||
#define PRId32 "d"
|
||||
#define PRIu32 "u"
|
||||
#define PRIx32 "x"
|
||||
#define PRIX32 "X"
|
||||
|
||||
#define PRIdPTR "ld"
|
||||
#define PRIuPTR "lu"
|
||||
#define PRIxPTR "lx"
|
||||
#define PRIXPTR "lX"
|
||||
|
||||
#endif
|
||||
195
src/core/compat/main.c
Normal file
195
src/core/compat/main.c
Normal file
@@ -0,0 +1,195 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include "stdio.h"
|
||||
#include "quickjs.h"
|
||||
|
||||
#define NULL ((void*)0)
|
||||
|
||||
// EFI definitions
|
||||
typedef uint64_t EFI_STATUS;
|
||||
typedef void* EFI_HANDLE;
|
||||
#define EFI_SUCCESS 0
|
||||
|
||||
typedef struct {
|
||||
uint64_t signature;
|
||||
uint32_t revision;
|
||||
uint32_t headerSize;
|
||||
uint32_t crc32;
|
||||
uint32_t reserved;
|
||||
} EFI_TABLE_HEADER;
|
||||
|
||||
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
|
||||
typedef EFI_STATUS (*EFI_TEXT_STRING)(
|
||||
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
|
||||
uint16_t *String
|
||||
);
|
||||
|
||||
typedef EFI_STATUS (*EFI_TEXT_CLEAR_SCREEN)(
|
||||
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This
|
||||
);
|
||||
|
||||
typedef struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
|
||||
void *reset;
|
||||
EFI_TEXT_STRING OutputString;
|
||||
void *testString;
|
||||
void *queryMode;
|
||||
void *setMode;
|
||||
void *setAttribute;
|
||||
EFI_TEXT_CLEAR_SCREEN ClearScreen;
|
||||
void *setCursorPosition;
|
||||
void *enableCursor;
|
||||
void *mode;
|
||||
} EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
|
||||
|
||||
typedef struct EFI_SYSTEM_TABLE {
|
||||
EFI_TABLE_HEADER hdr;
|
||||
uint16_t *firmwareVendor;
|
||||
uint32_t firmwareRevision;
|
||||
void *consoleInHandle;
|
||||
void *conIn;
|
||||
void *consoleOutHandle;
|
||||
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
|
||||
void *standardErrorHandle;
|
||||
void *stdErr;
|
||||
void *runtimeServices;
|
||||
void *bootServices;
|
||||
uint64_t numberOfTableEntries;
|
||||
void *configurationTable;
|
||||
} EFI_SYSTEM_TABLE;
|
||||
|
||||
static EFI_SYSTEM_TABLE *gST = NULL;
|
||||
|
||||
static void Print(uint16_t *str) {
|
||||
if (gST && gST->ConOut)
|
||||
gST->ConOut->OutputString(gST->ConOut, str);
|
||||
}
|
||||
|
||||
static uint16_t *AsciiToUnicode(const char *ascii) {
|
||||
static uint16_t buffer[1024];
|
||||
int i;
|
||||
for (i = 0; ascii[i] && i < 1023; i++) {
|
||||
buffer[i] = (uint16_t)ascii[i];
|
||||
}
|
||||
buffer[i] = 0;
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// stdio implementation
|
||||
int printf(const char *format, ...) {
|
||||
char buf[1024];
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
int ret = vsnprintf(buf, sizeof(buf), format, ap);
|
||||
va_end(ap);
|
||||
Print(AsciiToUnicode(buf));
|
||||
return ret;
|
||||
}
|
||||
|
||||
int fprintf(FILE *stream, const char *format, ...) {
|
||||
if (stream != stdout && stream != stderr) return 0;
|
||||
char buf[1024];
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
int ret = vsnprintf(buf, sizeof(buf), format, ap);
|
||||
va_end(ap);
|
||||
Print(AsciiToUnicode(buf));
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {
|
||||
if (stream != stdout && stream != stderr) return 0;
|
||||
const char *p = ptr;
|
||||
size_t total = size * nmemb;
|
||||
char buf[1025];
|
||||
size_t i = 0;
|
||||
while (i < total) {
|
||||
size_t chunk = total - i;
|
||||
if (chunk > 1024) chunk = 1024;
|
||||
memcpy(buf, p + i, chunk);
|
||||
buf[chunk] = 0;
|
||||
Print(AsciiToUnicode(buf));
|
||||
i += chunk;
|
||||
}
|
||||
return nmemb;
|
||||
}
|
||||
|
||||
int fputc(int c, FILE *stream) {
|
||||
if (stream != stdout && stream != stderr) return c;
|
||||
char buf[2] = { (char)c, 0 };
|
||||
Print(AsciiToUnicode(buf));
|
||||
return c;
|
||||
}
|
||||
|
||||
int putchar(int c) {
|
||||
return fputc(c, stdout);
|
||||
}
|
||||
|
||||
EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
|
||||
(void)ImageHandle;
|
||||
|
||||
gST = SystemTable;
|
||||
gST->ConOut->ClearScreen(gST->ConOut);
|
||||
|
||||
Print(L"UEFI QuickJS\r\n");
|
||||
Print(L"============\r\n\r\n");
|
||||
|
||||
JSRuntime *rt = JS_NewRuntime();
|
||||
if (!rt) {
|
||||
Print(L"Failed to create runtime\r\n");
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
JSContext *ctx = JS_NewContext(rt);
|
||||
if (!ctx) {
|
||||
Print(L"Failed to create context\r\n");
|
||||
JS_FreeRuntime(rt);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
Print(L"QuickJS initialized!\r\n\r\n");
|
||||
|
||||
// Test Classes
|
||||
const char *code =
|
||||
"class Test { "
|
||||
" constructor(val) { this.val = val; } "
|
||||
" getVal() { return this.val; } "
|
||||
"} "
|
||||
"let t = new Test(42); "
|
||||
"t.getVal();";
|
||||
|
||||
Print(L"Evaluating code...\r\n");
|
||||
|
||||
JSValue val = JS_Eval(ctx, code, strlen(code), "<input>", JS_EVAL_TYPE_GLOBAL);
|
||||
|
||||
if (JS_IsException(val)) {
|
||||
JSValue ex = JS_GetException(ctx);
|
||||
const char *str = JS_ToCString(ctx, ex);
|
||||
if (str) {
|
||||
printf("Exception: %s\n", str);
|
||||
JS_FreeCString(ctx, str);
|
||||
} else {
|
||||
printf("Exception: [unknown]\n");
|
||||
}
|
||||
JS_FreeValue(ctx, ex);
|
||||
} else {
|
||||
const char *str = JS_ToCString(ctx, val);
|
||||
if (str) {
|
||||
printf("Result: %s\n", str);
|
||||
JS_FreeCString(ctx, str);
|
||||
} else {
|
||||
printf("Result: [unknown]\n");
|
||||
}
|
||||
JS_FreeValue(ctx, val);
|
||||
}
|
||||
|
||||
JS_FreeContext(ctx);
|
||||
JS_FreeRuntime(rt);
|
||||
|
||||
Print(L"\r\nSuccess!\r\n");
|
||||
Print(L"\r\nPress Ctrl+C...\r\n");
|
||||
for(;;);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
51
src/core/compat/math.h
Normal file
51
src/core/compat/math.h
Normal file
@@ -0,0 +1,51 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#ifndef _MATH_H
|
||||
#define _MATH_H
|
||||
|
||||
#define NAN (__builtin_nan(""))
|
||||
#define INFINITY (__builtin_inf())
|
||||
#define signbit(x) __builtin_signbit(x)
|
||||
|
||||
double floor(double x);
|
||||
double ceil(double x);
|
||||
double fabs(double x);
|
||||
double modf(double x, double *iptr);
|
||||
double fmod(double x, double y);
|
||||
double sqrt(double x);
|
||||
double pow(double x, double y);
|
||||
double log(double x);
|
||||
double exp(double x);
|
||||
double sin(double x);
|
||||
double cos(double x);
|
||||
double tan(double x);
|
||||
int isnan(double x);
|
||||
int isinf(double x);
|
||||
int isfinite(double x);
|
||||
double trunc(double x);
|
||||
double fmin(double x, double y);
|
||||
double fmax(double x, double y);
|
||||
double hypot(double x, double y);
|
||||
double acos(double x);
|
||||
double asin(double x);
|
||||
double atan(double x);
|
||||
double atan2(double y, double x);
|
||||
double cbrt(double x);
|
||||
double cosh(double x);
|
||||
double expm1(double x);
|
||||
double log1p(double x);
|
||||
double log2(double x);
|
||||
double log10(double x);
|
||||
double sinh(double x);
|
||||
double tanh(double x);
|
||||
double asinh(double x);
|
||||
double acosh(double x);
|
||||
double atanh(double x);
|
||||
double round(double x);
|
||||
long int lrint(double x);
|
||||
|
||||
#endif
|
||||
664
src/core/compat/minilibc.c
Normal file
664
src/core/compat/minilibc.c
Normal file
@@ -0,0 +1,664 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
extern int printf(const char *format, ...);
|
||||
|
||||
// Basic libc stub implementations for Elk
|
||||
|
||||
// String functions
|
||||
void *memset(void *s, int c, size_t n) {
|
||||
unsigned char *p = s;
|
||||
while (n--) *p++ = (unsigned char)c;
|
||||
return s;
|
||||
}
|
||||
|
||||
void *memcpy(void *dest, const void *src, size_t n) {
|
||||
unsigned char *d = dest;
|
||||
const unsigned char *s = src;
|
||||
while (n--) *d++ = *s++;
|
||||
return dest;
|
||||
}
|
||||
|
||||
void *memmove(void *dest, const void *src, size_t n) {
|
||||
unsigned char *d = dest;
|
||||
const unsigned char *s = src;
|
||||
if (d < s) {
|
||||
while (n--) *d++ = *s++;
|
||||
} else {
|
||||
d += n;
|
||||
s += n;
|
||||
while (n--) *--d = *--s;
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
int memcmp(const void *s1, const void *s2, size_t n) {
|
||||
const unsigned char *p1 = s1, *p2 = s2;
|
||||
while (n--) {
|
||||
if (*p1 != *p2) return *p1 - *p2;
|
||||
p1++;
|
||||
p2++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t strlen(const char *s) {
|
||||
size_t len = 0;
|
||||
while (s[len]) len++;
|
||||
return len;
|
||||
}
|
||||
|
||||
int strcmp(const char *s1, const char *s2) {
|
||||
while (*s1 && (*s1 == *s2)) {
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
return *(unsigned char *)s1 - *(unsigned char *)s2;
|
||||
}
|
||||
|
||||
int strncmp(const char *s1, const char *s2, size_t n) {
|
||||
while (n && *s1 && (*s1 == *s2)) {
|
||||
s1++;
|
||||
s2++;
|
||||
n--;
|
||||
}
|
||||
if (n == 0) return 0;
|
||||
return *(unsigned char *)s1 - *(unsigned char *)s2;
|
||||
}
|
||||
|
||||
char *strcpy(char *dest, const char *src) {
|
||||
char *d = dest;
|
||||
while ((*d++ = *src++));
|
||||
return dest;
|
||||
}
|
||||
|
||||
char *strncpy(char *dest, const char *src, size_t n) {
|
||||
size_t i;
|
||||
for (i = 0; i < n && src[i]; i++)
|
||||
dest[i] = src[i];
|
||||
for (; i < n; i++)
|
||||
dest[i] = '\0';
|
||||
return dest;
|
||||
}
|
||||
|
||||
// Math functions - basic implementations
|
||||
double floor(double x) {
|
||||
if (x >= 0) {
|
||||
return (double)(int64_t)x;
|
||||
} else {
|
||||
int64_t i = (int64_t)x;
|
||||
return (i == x) ? x : (double)(i - 1);
|
||||
}
|
||||
}
|
||||
|
||||
double ceil(double x) {
|
||||
if (x >= 0) {
|
||||
int64_t i = (int64_t)x;
|
||||
return (i == x) ? x : (double)(i + 1);
|
||||
} else {
|
||||
return (double)(int64_t)x;
|
||||
}
|
||||
}
|
||||
|
||||
double fabs(double x) {
|
||||
return x < 0 ? -x : x;
|
||||
}
|
||||
|
||||
double modf(double x, double *iptr) {
|
||||
*iptr = (double)(int64_t)x;
|
||||
return x - *iptr;
|
||||
}
|
||||
|
||||
double fmod(double x, double y) {
|
||||
if (y == 0.0) return 0.0;
|
||||
return x - floor(x / y) * y;
|
||||
}
|
||||
|
||||
// Simple sqrt using Newton's method
|
||||
double sqrt(double x) {
|
||||
if (x < 0) return 0.0;
|
||||
if (x == 0) return 0.0;
|
||||
|
||||
double guess = x / 2.0;
|
||||
double prev;
|
||||
int iterations = 10;
|
||||
|
||||
while (iterations--) {
|
||||
prev = guess;
|
||||
guess = (guess + x / guess) / 2.0;
|
||||
if (fabs(guess - prev) < 0.0001) break;
|
||||
}
|
||||
return guess;
|
||||
}
|
||||
|
||||
double pow(double x, double y) {
|
||||
// Very basic pow - only handles integer exponents
|
||||
if (y == 0.0) return 1.0;
|
||||
if (y < 0.0) return 1.0 / pow(x, -y);
|
||||
|
||||
double result = 1.0;
|
||||
int64_t exp = (int64_t)y;
|
||||
while (exp--) result *= x;
|
||||
return result;
|
||||
}
|
||||
|
||||
double log(double x) {
|
||||
// Simplified log (not accurate, just enough for Elk)
|
||||
if (x <= 0) return 0.0;
|
||||
return 0.0; // Stub
|
||||
}
|
||||
|
||||
double exp(double x) {
|
||||
// Simplified exp
|
||||
(void)x;
|
||||
return 1.0; // Stub
|
||||
}
|
||||
|
||||
double sin(double x) {
|
||||
(void)x;
|
||||
return 0.0; // Stub
|
||||
}
|
||||
|
||||
double cos(double x) {
|
||||
(void)x;
|
||||
return 1.0; // Stub
|
||||
}
|
||||
|
||||
double tan(double x) {
|
||||
(void)x;
|
||||
return 0.0; // Stub
|
||||
}
|
||||
|
||||
int isnan(double x) {
|
||||
return x != x;
|
||||
}
|
||||
|
||||
int isinf(double x) {
|
||||
return x == __builtin_inf() || x == -__builtin_inf();
|
||||
}
|
||||
|
||||
int isfinite(double x) {
|
||||
return !isnan(x) && !isinf(x);
|
||||
}
|
||||
|
||||
// Stdlib functions
|
||||
double strtod(const char *str, char **endptr) {
|
||||
double result = 0.0;
|
||||
double sign = 1.0;
|
||||
double scale = 0.1;
|
||||
int decimal = 0;
|
||||
|
||||
while (*str == ' ' || *str == '\t') str++;
|
||||
|
||||
if (*str == '-') {
|
||||
sign = -1.0;
|
||||
str++;
|
||||
} else if (*str == '+') {
|
||||
str++;
|
||||
}
|
||||
|
||||
while (*str) {
|
||||
if (*str >= '0' && *str <= '9') {
|
||||
if (decimal) {
|
||||
result += (*str - '0') * scale;
|
||||
scale *= 0.1;
|
||||
} else {
|
||||
result = result * 10.0 + (*str - '0');
|
||||
}
|
||||
} else if (*str == '.' && !decimal) {
|
||||
decimal = 1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
str++;
|
||||
}
|
||||
|
||||
if (endptr) *endptr = (char *)str;
|
||||
return result * sign;
|
||||
}
|
||||
|
||||
long strtol(const char *str, char **endptr, int base) {
|
||||
long result = 0;
|
||||
int sign = 1;
|
||||
|
||||
while (*str == ' ') str++;
|
||||
|
||||
if (*str == '-') {
|
||||
sign = -1;
|
||||
str++;
|
||||
}
|
||||
|
||||
while (*str >= '0' && *str <= '9') {
|
||||
result = result * base + (*str - '0');
|
||||
str++;
|
||||
}
|
||||
|
||||
if (endptr) *endptr = (char *)str;
|
||||
return result * sign;
|
||||
}
|
||||
|
||||
#define HEAP_SIZE (8 * 1024 * 1024)
|
||||
static unsigned char heap[HEAP_SIZE];
|
||||
static size_t heap_pos = 0;
|
||||
|
||||
void *malloc(size_t size) {
|
||||
size = (size + 7) & ~7;
|
||||
size_t total = size + 8;
|
||||
if (heap_pos + total > HEAP_SIZE) {
|
||||
printf("malloc failed: OOM\n");
|
||||
return (void*)0;
|
||||
}
|
||||
*(size_t*)&heap[heap_pos] = size;
|
||||
void *ptr = &heap[heap_pos + 8];
|
||||
heap_pos += total;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void free(void *ptr) {
|
||||
(void)ptr;
|
||||
}
|
||||
|
||||
void *realloc(void *ptr, size_t size) {
|
||||
if (!ptr) return malloc(size);
|
||||
size_t *p_size = (size_t*)((char*)ptr - 8);
|
||||
size_t old_size = *p_size;
|
||||
if (size <= old_size) return ptr;
|
||||
|
||||
void *new_ptr = malloc(size);
|
||||
if (!new_ptr) return (void*)0;
|
||||
memcpy(new_ptr, ptr, old_size);
|
||||
return new_ptr;
|
||||
}
|
||||
|
||||
void *calloc(size_t nmemb, size_t size) {
|
||||
size_t total = nmemb * size;
|
||||
void *ptr = malloc(total);
|
||||
if (ptr) memset(ptr, 0, total);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void abort(void) {
|
||||
printf("ABORT called!\n");
|
||||
while(1);
|
||||
}
|
||||
|
||||
// stdio functions
|
||||
int vsnprintf(char *str, size_t size, const char *format, __builtin_va_list ap) {
|
||||
size_t i = 0;
|
||||
const char *p = format;
|
||||
|
||||
while (*p && i < size - 1) {
|
||||
if (*p != '%') {
|
||||
str[i++] = *p++;
|
||||
continue;
|
||||
}
|
||||
|
||||
p++; // Skip '%'
|
||||
|
||||
// Parse flags, width, precision, length modifiers
|
||||
int precision = -1;
|
||||
|
||||
// Flags (ignored for now)
|
||||
while (*p == '-' || *p == '+' || *p == ' ' || *p == '#' || *p == '0') p++;
|
||||
|
||||
// Width
|
||||
if (*p == '*') {
|
||||
__builtin_va_arg(ap, int); // Consume width
|
||||
p++;
|
||||
} else {
|
||||
while (*p >= '0' && *p <= '9') p++;
|
||||
}
|
||||
|
||||
// Precision
|
||||
if (*p == '.') {
|
||||
p++;
|
||||
if (*p == '*') {
|
||||
precision = __builtin_va_arg(ap, int);
|
||||
p++;
|
||||
} else {
|
||||
int val = 0;
|
||||
while (*p >= '0' && *p <= '9') {
|
||||
val = val * 10 + (*p - '0');
|
||||
p++;
|
||||
}
|
||||
precision = val;
|
||||
}
|
||||
}
|
||||
|
||||
// Length modifiers (ignored)
|
||||
while (*p == 'h' || *p == 'l' || *p == 'L' || *p == 'z' || *p == 't') p++;
|
||||
|
||||
if (*p == 'd' || *p == 'i') {
|
||||
int val = __builtin_va_arg(ap, int);
|
||||
char buf[32];
|
||||
int pos = 0;
|
||||
int neg = 0;
|
||||
if (val < 0) { neg = 1; val = -val; }
|
||||
if (val == 0) buf[pos++] = '0';
|
||||
while (val) {
|
||||
buf[pos++] = '0' + (val % 10);
|
||||
val /= 10;
|
||||
}
|
||||
if (neg) buf[pos++] = '-';
|
||||
while (pos > 0 && i < size - 1) str[i++] = buf[--pos];
|
||||
} else if (*p == 'u') {
|
||||
unsigned int val = __builtin_va_arg(ap, unsigned int);
|
||||
char buf[32];
|
||||
int pos = 0;
|
||||
if (val == 0) buf[pos++] = '0';
|
||||
while (val) {
|
||||
buf[pos++] = '0' + (val % 10);
|
||||
val /= 10;
|
||||
}
|
||||
while (pos > 0 && i < size - 1) str[i++] = buf[--pos];
|
||||
} else if (*p == 's') {
|
||||
const char *s = __builtin_va_arg(ap, const char *);
|
||||
if (!s) s = "(null)";
|
||||
|
||||
size_t len = 0;
|
||||
const char *tmp = s;
|
||||
while (*tmp++) len++;
|
||||
|
||||
if (precision >= 0 && len > (size_t)precision) len = (size_t)precision;
|
||||
|
||||
size_t k = 0;
|
||||
while (k < len && i < size - 1) str[i++] = s[k++];
|
||||
} else if (*p == 'c') {
|
||||
char c = (char)__builtin_va_arg(ap, int);
|
||||
if (i < size - 1) str[i++] = c;
|
||||
} else if (*p == 'g' || *p == 'f') {
|
||||
// Basic double support
|
||||
double val = __builtin_va_arg(ap, double);
|
||||
int ival = (int)val;
|
||||
|
||||
// Print integer part
|
||||
char buf[32];
|
||||
int pos = 0;
|
||||
int neg = 0;
|
||||
if (val < 0) { neg = 1; val = -val; ival = -ival; }
|
||||
|
||||
if (ival == 0) buf[pos++] = '0';
|
||||
int temp = ival;
|
||||
while (temp) {
|
||||
buf[pos++] = '0' + (temp % 10);
|
||||
temp /= 10;
|
||||
}
|
||||
if (neg) buf[pos++] = '-';
|
||||
while (pos > 0 && i < size - 1) str[i++] = buf[--pos];
|
||||
|
||||
// Simple decimal part (up to 4 digits)
|
||||
val -= (int)val;
|
||||
if (val > 0.0001) {
|
||||
if (i < size - 1) str[i++] = '.';
|
||||
for (int k=0; k<4 && val > 0.0001 && i < size-1; k++) {
|
||||
val *= 10;
|
||||
int digit = (int)val;
|
||||
str[i++] = '0' + digit;
|
||||
val -= digit;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (i < size - 1) str[i++] = *p;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
|
||||
str[i] = '\0';
|
||||
return i;
|
||||
}
|
||||
|
||||
int snprintf(char *str, size_t size, const char *format, ...) {
|
||||
__builtin_va_list ap;
|
||||
__builtin_va_start(ap, format);
|
||||
int ret = vsnprintf(str, size, format, ap);
|
||||
__builtin_va_end(ap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Compiler intrinsics for Windows target
|
||||
void __chkstk(void) {
|
||||
// Stack checking - not needed for UEFI
|
||||
}
|
||||
|
||||
int _fltused = 0; // Floating point used marker
|
||||
|
||||
char *strchr(const char *s, int c) {
|
||||
while (*s != (char)c) {
|
||||
if (!*s++) {
|
||||
return (void*)0;
|
||||
}
|
||||
}
|
||||
return (char *)s;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
double trunc(double x) {
|
||||
return (x > 0) ? floor(x) : ceil(x);
|
||||
}
|
||||
|
||||
double fmin(double x, double y) {
|
||||
return (x < y) ? x : y;
|
||||
}
|
||||
|
||||
double fmax(double x, double y) {
|
||||
return (x > y) ? x : y;
|
||||
}
|
||||
|
||||
double hypot(double x, double y) {
|
||||
return sqrt(x*x + y*y);
|
||||
}
|
||||
|
||||
double acos(double x) { (void)x; return 0.0; }
|
||||
double asin(double x) { (void)x; return 0.0; }
|
||||
double atan(double x) { (void)x; return 0.0; }
|
||||
double atan2(double y, double x) { (void)y; (void)x; return 0.0; }
|
||||
double cbrt(double x) { (void)x; return 0.0; }
|
||||
double cosh(double x) { (void)x; return 0.0; }
|
||||
double expm1(double x) { (void)x; return 0.0; }
|
||||
double log1p(double x) { (void)x; return 0.0; }
|
||||
double log2(double x) { (void)x; return 0.0; }
|
||||
double log10(double x) { (void)x; return 0.0; }
|
||||
double sinh(double x) { (void)x; return 0.0; }
|
||||
double tanh(double x) { (void)x; return 0.0; }
|
||||
double asinh(double x) { (void)x; return 0.0; }
|
||||
double acosh(double x) { (void)x; return 0.0; }
|
||||
double atanh(double x) { (void)x; return 0.0; }
|
||||
|
||||
double round(double x) {
|
||||
return (x >= 0.0) ? floor(x + 0.5) : ceil(x - 0.5);
|
||||
}
|
||||
|
||||
long int lrint(double x) {
|
||||
return (long int)round(x);
|
||||
}
|
||||
|
||||
|
||||
|
||||
size_t _msize(void *ptr) {
|
||||
if (!ptr) return 0;
|
||||
return *(size_t*)((char*)ptr - 8);
|
||||
}
|
||||
|
||||
int fesetround(int round) { (void)round; return 0; }
|
||||
int fegetround(void) { return 0; }
|
||||
|
||||
int errno = 0;
|
||||
|
||||
#include "time.h"
|
||||
#include "sys/time.h"
|
||||
|
||||
time_t time(time_t *t) {
|
||||
if (t) *t = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct tm tm_buf;
|
||||
|
||||
struct tm *gmtime(const time_t *timep) {
|
||||
(void)timep;
|
||||
// Stub: return 1970-01-01
|
||||
tm_buf.tm_year = 70;
|
||||
tm_buf.tm_mon = 0;
|
||||
tm_buf.tm_mday = 1;
|
||||
return &tm_buf;
|
||||
}
|
||||
|
||||
struct tm *localtime(const time_t *timep) {
|
||||
return gmtime(timep);
|
||||
}
|
||||
|
||||
time_t mktime(struct tm *tm) {
|
||||
(void)tm;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int gettimeofday(struct timeval *tv, struct timezone *tz) {
|
||||
if (tv) {
|
||||
tv->tv_sec = 0;
|
||||
tv->tv_usec = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *memchr(const void *s, int c, size_t n) {
|
||||
const unsigned char *p = s;
|
||||
while (n--) {
|
||||
if (*p == (unsigned char)c) return (void *)p;
|
||||
p++;
|
||||
}
|
||||
return (void*)0;
|
||||
}
|
||||
|
||||
char *strcat(char *dest, const char *src) {
|
||||
char *d = dest;
|
||||
while (*d) d++;
|
||||
while ((*d++ = *src++));
|
||||
return dest;
|
||||
}
|
||||
|
||||
char *strncat(char *dest, const char *src, size_t n) {
|
||||
char *d = dest;
|
||||
while (*d) d++;
|
||||
while (n-- && *src) *d++ = *src++;
|
||||
*d = 0;
|
||||
return dest;
|
||||
}
|
||||
|
||||
char *strstr(const char *haystack, const char *needle) {
|
||||
size_t len = strlen(needle);
|
||||
if (len == 0) return (char *)haystack;
|
||||
while (*haystack) {
|
||||
if (!memcmp(haystack, needle, len)) return (char *)haystack;
|
||||
haystack++;
|
||||
}
|
||||
return (void*)0;
|
||||
}
|
||||
|
||||
char *strdup(const char *s) {
|
||||
size_t len = strlen(s) + 1;
|
||||
char *new = malloc(len);
|
||||
if (new) memcpy(new, s, len);
|
||||
return new;
|
||||
}
|
||||
|
||||
char *strrchr(const char *s, int c) {
|
||||
const char *found = (void*)0;
|
||||
while (*s) {
|
||||
if (*s == (char)c) found = s;
|
||||
s++;
|
||||
}
|
||||
if (*s == (char)c) found = s;
|
||||
return (char *)found;
|
||||
}
|
||||
|
||||
|
||||
int abs(int j) {
|
||||
return (j < 0) ? -j : j;
|
||||
}
|
||||
|
||||
int isdigit(int c) {
|
||||
return (c >= '0' && c <= '9');
|
||||
}
|
||||
|
||||
int isspace(int c) {
|
||||
return (c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r');
|
||||
}
|
||||
|
||||
int isupper(int c) {
|
||||
return (c >= 'A' && c <= 'Z');
|
||||
}
|
||||
|
||||
int islower(int c) {
|
||||
return (c >= 'a' && c <= 'z');
|
||||
}
|
||||
|
||||
int isalpha(int c) {
|
||||
return isupper(c) || islower(c);
|
||||
}
|
||||
|
||||
int isalnum(int c) {
|
||||
return isalpha(c) || isdigit(c);
|
||||
}
|
||||
|
||||
int tolower(int c) {
|
||||
return isupper(c) ? c + 32 : c;
|
||||
}
|
||||
|
||||
int toupper(int c) {
|
||||
return islower(c) ? c - 32 : c;
|
||||
}
|
||||
|
||||
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) {
|
||||
// Simple bubble sort for now
|
||||
if (nmemb < 2 || size == 0) return;
|
||||
char *b = (char *)base;
|
||||
|
||||
// Byte-by-byte swap to avoid malloc
|
||||
for (size_t i = 0; i < nmemb - 1; i++) {
|
||||
for (size_t j = 0; j < nmemb - i - 1; j++) {
|
||||
if (compar(b + j * size, b + (j + 1) * size) > 0) {
|
||||
char *p1 = b + j * size;
|
||||
char *p2 = b + (j + 1) * size;
|
||||
for (size_t k = 0; k < size; k++) {
|
||||
char t = p1[k];
|
||||
p1[k] = p2[k];
|
||||
p2[k] = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include "setjmp.h"
|
||||
|
||||
int setjmp(jmp_buf env) {
|
||||
(void)env;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void longjmp(jmp_buf env, int val) {
|
||||
(void)env; (void)val;
|
||||
printf("longjmp called!\n");
|
||||
abort();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
18
src/core/compat/setjmp.h
Normal file
18
src/core/compat/setjmp.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#ifndef _SETJMP_H
|
||||
#define _SETJMP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
// x86_64 jmp_buf: rbx, rbp, r12, r13, r14, r15, rsp, rip
|
||||
typedef uint64_t jmp_buf[8];
|
||||
|
||||
int setjmp(jmp_buf env);
|
||||
void longjmp(jmp_buf env, int val);
|
||||
|
||||
#endif
|
||||
12
src/core/compat/stdarg.h
Normal file
12
src/core/compat/stdarg.h
Normal file
@@ -0,0 +1,12 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
|
||||
typedef __builtin_va_list va_list;
|
||||
#define va_start(ap, last) __builtin_va_start(ap, last)
|
||||
#define va_end(ap) __builtin_va_end(ap)
|
||||
#define va_arg(ap, type) __builtin_va_arg(ap, type)
|
||||
23
src/core/compat/stdio.h
Normal file
23
src/core/compat/stdio.h
Normal file
@@ -0,0 +1,23 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
|
||||
typedef struct FILE FILE;
|
||||
|
||||
#define stdout ((FILE*)1)
|
||||
#define stderr ((FILE*)2)
|
||||
#define stdin ((FILE*)0)
|
||||
|
||||
int printf(const char *format, ...);
|
||||
int fprintf(FILE *stream, const char *format, ...);
|
||||
int snprintf(char *str, size_t size, const char *format, ...);
|
||||
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
|
||||
int fputc(int c, FILE *stream);
|
||||
int putchar(int c);
|
||||
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
|
||||
20
src/core/compat/stdlib.h
Normal file
20
src/core/compat/stdlib.h
Normal file
@@ -0,0 +1,20 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#pragma once
|
||||
#include <stddef.h>
|
||||
|
||||
void *malloc(size_t size);
|
||||
void free(void *ptr);
|
||||
void *realloc(void *ptr, size_t size);
|
||||
void *calloc(size_t nmemb, size_t size);
|
||||
double strtod(const char *str, char **endptr);
|
||||
long strtol(const char *str, char **endptr, int base);
|
||||
void abort(void);
|
||||
#define alloca __builtin_alloca
|
||||
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
|
||||
int abs(int j);
|
||||
size_t _msize(void *ptr);
|
||||
29
src/core/compat/string.h
Normal file
29
src/core/compat/string.h
Normal file
@@ -0,0 +1,29 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#ifndef _STRING_H
|
||||
#define _STRING_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
void *memset(void *s, int c, size_t n);
|
||||
void *memcpy(void *dest, const void *src, size_t n);
|
||||
void *memmove(void *dest, const void *src, size_t n);
|
||||
int memcmp(const void *s1, const void *s2, size_t n);
|
||||
size_t strlen(const char *s);
|
||||
int strcmp(const char *s1, const char *s2);
|
||||
int strncmp(const char *s1, const char *s2, size_t n);
|
||||
char *strcpy(char *dest, const char *src);
|
||||
char *strncpy(char *dest, const char *src, size_t n);
|
||||
char *strcat(char *dest, const char *src);
|
||||
char *strncat(char *dest, const char *src, size_t n);
|
||||
char *strchr(const char *s, int c);
|
||||
char *strrchr(const char *s, int c);
|
||||
char *strstr(const char *haystack, const char *needle);
|
||||
char *strdup(const char *s);
|
||||
void *memchr(const void *s, int c, size_t n);
|
||||
|
||||
#endif
|
||||
24
src/core/compat/sys/time.h
Normal file
24
src/core/compat/sys/time.h
Normal file
@@ -0,0 +1,24 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#ifndef _SYS_TIME_H
|
||||
#define _SYS_TIME_H
|
||||
|
||||
#include "time.h"
|
||||
|
||||
struct timeval {
|
||||
long tv_sec;
|
||||
long tv_usec;
|
||||
};
|
||||
|
||||
struct timezone {
|
||||
int tz_minuteswest;
|
||||
int tz_dsttime;
|
||||
};
|
||||
|
||||
int gettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
|
||||
#endif
|
||||
31
src/core/compat/time.h
Normal file
31
src/core/compat/time.h
Normal file
@@ -0,0 +1,31 @@
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
#ifndef _TIME_H
|
||||
#define _TIME_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef long time_t;
|
||||
|
||||
struct tm {
|
||||
int tm_sec;
|
||||
int tm_min;
|
||||
int tm_hour;
|
||||
int tm_mday;
|
||||
int tm_mon;
|
||||
int tm_year;
|
||||
int tm_wday;
|
||||
int tm_yday;
|
||||
int tm_isdst;
|
||||
};
|
||||
|
||||
time_t time(time_t *t);
|
||||
struct tm *gmtime(const time_t *timep);
|
||||
struct tm *localtime(const time_t *timep);
|
||||
time_t mktime(struct tm *tm);
|
||||
|
||||
#endif
|
||||
56
src/core/efi.h
Normal file
56
src/core/efi.h
Normal file
@@ -0,0 +1,56 @@
|
||||
#ifndef EFI_H
|
||||
#define EFI_H
|
||||
#define NULL ((void*)0)
|
||||
|
||||
// EFI definitions
|
||||
typedef uint64_t EFI_STATUS;
|
||||
typedef void* EFI_HANDLE;
|
||||
#define EFI_SUCCESS 0
|
||||
|
||||
typedef struct {
|
||||
uint64_t signature;
|
||||
uint32_t revision;
|
||||
uint32_t headerSize;
|
||||
uint32_t crc32;
|
||||
uint32_t reserved;
|
||||
} EFI_TABLE_HEADER;
|
||||
|
||||
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
|
||||
typedef EFI_STATUS (*EFI_TEXT_STRING)(
|
||||
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,
|
||||
uint16_t *String
|
||||
);
|
||||
|
||||
typedef EFI_STATUS (*EFI_TEXT_CLEAR_SCREEN)(
|
||||
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This
|
||||
);
|
||||
|
||||
typedef struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
|
||||
void *reset;
|
||||
EFI_TEXT_STRING OutputString;
|
||||
void *testString;
|
||||
void *queryMode;
|
||||
void *setMode;
|
||||
void *setAttribute;
|
||||
EFI_TEXT_CLEAR_SCREEN ClearScreen;
|
||||
void *setCursorPosition;
|
||||
void *enableCursor;
|
||||
void *mode;
|
||||
} EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
|
||||
|
||||
typedef struct EFI_SYSTEM_TABLE {
|
||||
EFI_TABLE_HEADER hdr;
|
||||
uint16_t *firmwareVendor;
|
||||
uint32_t firmwareRevision;
|
||||
void *consoleInHandle;
|
||||
void *conIn;
|
||||
void *consoleOutHandle;
|
||||
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut;
|
||||
void *standardErrorHandle;
|
||||
void *stdErr;
|
||||
void *runtimeServices;
|
||||
void *bootServices;
|
||||
uint64_t numberOfTableEntries;
|
||||
void *configurationTable;
|
||||
} EFI_SYSTEM_TABLE;
|
||||
#endif
|
||||
163
src/core/main.c
Normal file
163
src/core/main.c
Normal file
@@ -0,0 +1,163 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include "stdio.h"
|
||||
#include "quickjs.h"
|
||||
#include "efi.h"
|
||||
#include "util.h"
|
||||
|
||||
static EFI_SYSTEM_TABLE *gST = NULL;
|
||||
|
||||
void print(uint16_t *str) {
|
||||
if (gST && gST->ConOut)
|
||||
gST->ConOut->OutputString(gST->ConOut, str);
|
||||
}
|
||||
|
||||
int printf(const char *format, ...) {
|
||||
char buf[1024];
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
int ret = vsnprintf(buf, sizeof(buf), format, ap);
|
||||
va_end(ap);
|
||||
|
||||
print(AsciiToUnicode(buf));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int fprintf(FILE *stream, const char *format, ...) {
|
||||
if (stream != stdout && stream != stderr) return 0;
|
||||
|
||||
char buf[1024];
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
int ret = vsnprintf(buf, sizeof(buf), format, ap);
|
||||
va_end(ap);
|
||||
|
||||
print(AsciiToUnicode(buf));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {
|
||||
if (stream != stdout && stream != stderr) return 0;
|
||||
|
||||
const char *p = ptr;
|
||||
size_t total = size * nmemb;
|
||||
char buf[1025];
|
||||
size_t i = 0;
|
||||
|
||||
while (i < total) {
|
||||
size_t chunk = total - i;
|
||||
if (chunk > 1024) chunk = 1024;
|
||||
|
||||
memcpy(buf, p + i, chunk);
|
||||
buf[chunk] = 0;
|
||||
|
||||
print(AsciiToUnicode(buf));
|
||||
i += chunk;
|
||||
}
|
||||
|
||||
return nmemb;
|
||||
}
|
||||
|
||||
int fputc(int c, FILE *stream) {
|
||||
if (stream != stdout && stream != stderr) return c;
|
||||
char buf[2] = { (char)c, 0 };
|
||||
|
||||
print(AsciiToUnicode(buf));
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
int putchar(int c) {
|
||||
return fputc(c, stdout);
|
||||
}
|
||||
|
||||
// ------------------------------- Kernel C TS bindings -------------------------------
|
||||
JSValue jsKCPrintln(JSContext *ctx, JSValueConst jsThis, int argc, JSValueConst *argv) {
|
||||
if (argc < 1) return JS_ThrowSyntaxError(ctx, "Missing argument");
|
||||
|
||||
const char *str = JS_ToCString(ctx, argv[0]);
|
||||
if (!str) return JS_EXCEPTION;
|
||||
|
||||
print(AsciiToUnicode(str));
|
||||
print(L"\r\n");
|
||||
|
||||
JS_FreeCString(ctx, str);
|
||||
|
||||
return JS_UNDEFINED;
|
||||
}
|
||||
|
||||
void initKC(JSContext *ctx) {
|
||||
JSValue global = JS_GetGlobalObject(ctx);
|
||||
JSValue kc = JS_NewObject(ctx);
|
||||
|
||||
JS_SetPropertyStr(ctx, global, "kc", kc);
|
||||
|
||||
JS_SetPropertyStr(ctx, kc, "println", JS_NewCFunction(ctx, jsKCPrintln, "println", 1));
|
||||
|
||||
JS_FreeValue(ctx, global);
|
||||
}
|
||||
|
||||
// ------------------------------------- EFI main -------------------------------------
|
||||
EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
|
||||
(void)ImageHandle;
|
||||
|
||||
gST = SystemTable;
|
||||
gST->ConOut->ClearScreen(gST->ConOut);
|
||||
|
||||
print(L"Booting LintsOS...\r\n");
|
||||
|
||||
JSRuntime *rt = JS_NewRuntime();
|
||||
if (!rt) {
|
||||
print(L"!!! Kernel panic: Failed to create runtime !!!\r\n");
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
JSContext *ctx = JS_NewContext(rt);
|
||||
if (!ctx) {
|
||||
print(L"!!! Kernel panic: Failed to create context !!!\r\n");
|
||||
JS_FreeRuntime(rt);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
initKC(ctx);
|
||||
|
||||
const char *code =
|
||||
"kc.println(\"Hello from Kernel C!\")";
|
||||
|
||||
JSValue val = JS_Eval(ctx, code, strlen(code), "<input>", JS_EVAL_TYPE_GLOBAL);
|
||||
|
||||
if (JS_IsException(val)) {
|
||||
JSValue ex = JS_GetException(ctx);
|
||||
const char *str = JS_ToCString(ctx, ex);
|
||||
|
||||
if (str) {
|
||||
printf("!!! Kernel panic: %s !!!\n", str);
|
||||
JS_FreeCString(ctx, str);
|
||||
} else {
|
||||
printf("!!! Kernel panic: [unknown] !!!\n");
|
||||
}
|
||||
JS_FreeValue(ctx, ex);
|
||||
} else {
|
||||
const char *str = JS_ToCString(ctx, val);
|
||||
if (str) {
|
||||
printf("!!! Kernel panic: %s !!!\n", str);
|
||||
JS_FreeCString(ctx, str);
|
||||
} else {
|
||||
printf("!!! Kernel panic: [unknown] !!!\n");
|
||||
}
|
||||
JS_FreeValue(ctx, val);
|
||||
}
|
||||
|
||||
JS_FreeContext(ctx);
|
||||
JS_FreeRuntime(rt);
|
||||
|
||||
for(;;);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
32
src/core/util.c
Normal file
32
src/core/util.c
Normal file
@@ -0,0 +1,32 @@
|
||||
#include "util.h"
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include "stdio.h"
|
||||
#include "quickjs.h"
|
||||
#include "efi.h"
|
||||
|
||||
|
||||
void halt() {
|
||||
for(;;);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------
|
||||
//
|
||||
// !!! AI GENERATE SLOP, PLEASE FIX !!!
|
||||
//
|
||||
//---------------------------------------------------------------
|
||||
|
||||
uint16_t *AsciiToUnicode(const char *ascii) {
|
||||
static uint16_t buffer[1024];
|
||||
|
||||
int i;
|
||||
for (i = 0; ascii[i] && i < 1023; i++) {
|
||||
buffer[i] = (uint16_t)ascii[i];
|
||||
}
|
||||
|
||||
buffer[i] = 0;
|
||||
|
||||
return buffer;
|
||||
}
|
||||
13
src/core/util.h
Normal file
13
src/core/util.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdarg.h>
|
||||
#include "stdio.h"
|
||||
|
||||
#ifndef UTIL_H
|
||||
#define UTIL_H
|
||||
|
||||
void halt();
|
||||
uint16_t *AsciiToUnicode(const char *ascii);
|
||||
|
||||
#endif
|
||||
BIN
src/lib/builtins.lib
Normal file
BIN
src/lib/builtins.lib
Normal file
Binary file not shown.
1
src/lib/quickjs
Submodule
1
src/lib/quickjs
Submodule
Submodule src/lib/quickjs added at 177e1b32a4
151
src/scripts/build_core.sh
Executable file
151
src/scripts/build_core.sh
Executable file
@@ -0,0 +1,151 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
rm -rf out
|
||||
|
||||
mkdir -p out
|
||||
mkdir -p out/core
|
||||
mkdir -p out/lib
|
||||
mkdir -p out/lib/quickjs
|
||||
mkdir -p out/img
|
||||
mkdir -p out/img/EFI/BOOT
|
||||
|
||||
# Compile minilibc
|
||||
clang -target x86_64-pc-win32-coff \
|
||||
-ffreestanding \
|
||||
-fno-stack-protector \
|
||||
-fshort-wchar \
|
||||
-mno-red-zone \
|
||||
-Isrc/core/compat \
|
||||
-D_GNU_SOURCE \
|
||||
-DUEFI \
|
||||
-O2 \
|
||||
-c src/core/compat/minilibc.c -o out/core/minilibc.o
|
||||
|
||||
# Compile QuickJS
|
||||
clang -target x86_64-pc-win32-coff \
|
||||
-ffreestanding \
|
||||
-fno-stack-protector \
|
||||
-fshort-wchar \
|
||||
-mno-red-zone \
|
||||
-Isrc/core/compat \
|
||||
-Isrc/lib/quickjs \
|
||||
-D_GNU_SOURCE \
|
||||
-DUEFI \
|
||||
-DCONFIG_VERSION=\"2021-03-27\" \
|
||||
-DJS_LIMB_BITS=32 \
|
||||
-DNDEBUG \
|
||||
-O2 \
|
||||
-c src/lib/quickjs/cutils.c -o out/lib/quickjs/cutils.o
|
||||
|
||||
clang -target x86_64-pc-win32-coff \
|
||||
-ffreestanding \
|
||||
-fno-stack-protector \
|
||||
-fshort-wchar \
|
||||
-mno-red-zone \
|
||||
-Isrc/core/compat \
|
||||
-Isrc/lib/quickjs \
|
||||
-D_GNU_SOURCE \
|
||||
-DUEFI \
|
||||
-DCONFIG_VERSION=\"2021-03-27\" \
|
||||
-DJS_LIMB_BITS=32 \
|
||||
-DNDEBUG \
|
||||
-O2 \
|
||||
-c src/lib/quickjs/libunicode.c -o out/lib/quickjs/libunicode.o
|
||||
|
||||
clang -target x86_64-pc-win32-coff \
|
||||
-ffreestanding \
|
||||
-fno-stack-protector \
|
||||
-fshort-wchar \
|
||||
-mno-red-zone \
|
||||
-Isrc/core/compat \
|
||||
-Isrc/lib/quickjs \
|
||||
-D_GNU_SOURCE \
|
||||
-DUEFI \
|
||||
-DCONFIG_VERSION=\"2021-03-27\" \
|
||||
-DJS_LIMB_BITS=32 \
|
||||
-DNDEBUG \
|
||||
-O2 \
|
||||
-c src/lib/quickjs/libregexp.c -o out/lib/quickjs/libregexp.o
|
||||
|
||||
clang -target x86_64-pc-win32-coff \
|
||||
-ffreestanding \
|
||||
-fno-stack-protector \
|
||||
-fshort-wchar \
|
||||
-mno-red-zone \
|
||||
-Isrc/core/compat \
|
||||
-Isrc/lib/quickjs \
|
||||
-D_GNU_SOURCE \
|
||||
-DUEFI \
|
||||
-DCONFIG_VERSION=\"2021-03-27\" \
|
||||
-DJS_LIMB_BITS=32 \
|
||||
-DNDEBUG \
|
||||
-O2 \
|
||||
-c src/lib/quickjs/dtoa.c -o out/lib/quickjs/dtoa.o
|
||||
|
||||
clang -target x86_64-pc-win32-coff \
|
||||
-ffreestanding \
|
||||
-fno-stack-protector \
|
||||
-fshort-wchar \
|
||||
-mno-red-zone \
|
||||
-Isrc/core/compat \
|
||||
-Isrc/lib/quickjs \
|
||||
-D_GNU_SOURCE \
|
||||
-DUEFI \
|
||||
-DCONFIG_VERSION=\"2021-03-27\" \
|
||||
-DJS_LIMB_BITS=32 \
|
||||
-DNDEBUG \
|
||||
-O2 \
|
||||
-c src/lib/quickjs/quickjs.c -o out/lib/quickjs/quickjs.o
|
||||
|
||||
# Compile util.c
|
||||
clang -target x86_64-pc-win32-coff \
|
||||
-ffreestanding \
|
||||
-fno-stack-protector \
|
||||
-fshort-wchar \
|
||||
-mno-red-zone \
|
||||
-Isrc/core/compat \
|
||||
-Isrc/lib/quickjs \
|
||||
-D_GNU_SOURCE \
|
||||
-DUEFI \
|
||||
-DCONFIG_VERSION=\"2021-03-27\" \
|
||||
-DJS_LIMB_BITS=32 \
|
||||
-DNDEBUG \
|
||||
-O2 \
|
||||
-c src/core/util.c -o out/core/util.o
|
||||
|
||||
# Compile main application
|
||||
clang -target x86_64-pc-win32-coff \
|
||||
-ffreestanding \
|
||||
-fno-stack-protector \
|
||||
-fshort-wchar \
|
||||
-mno-red-zone \
|
||||
-Isrc/core/compat \
|
||||
-Isrc/lib/quickjs \
|
||||
-D_GNU_SOURCE \
|
||||
-DUEFI \
|
||||
-DCONFIG_VERSION=\"2021-03-27\" \
|
||||
-DJS_LIMB_BITS=32 \
|
||||
-DNDEBUG \
|
||||
-O2 \
|
||||
-c src/core/main.c -o out/core/main.o
|
||||
|
||||
# Link
|
||||
lld-link \
|
||||
-filealign:16 \
|
||||
-subsystem:efi_application \
|
||||
-nodefaultlib \
|
||||
-dll \
|
||||
-entry:efi_main \
|
||||
out/core/main.o \
|
||||
out/core/util.o \
|
||||
out/core/minilibc.o \
|
||||
out/lib/quickjs/cutils.o \
|
||||
out/lib/quickjs/libunicode.o \
|
||||
out/lib/quickjs/libregexp.o \
|
||||
out/lib/quickjs/dtoa.o \
|
||||
out/lib/quickjs/quickjs.o \
|
||||
-out:out/img/EFI/BOOT/bootx64.efi
|
||||
|
||||
echo "Built efi app: out/img/EFI/BOOT/bootx64.efi"
|
||||
|
||||
@@ -7,13 +7,7 @@ mmd -i out/fat.img ::/EFI
|
||||
mmd -i out/fat.img ::/EFI/BOOT
|
||||
|
||||
# Copy the EFI application
|
||||
mcopy -i out/fat.img out/img/EFI/BOOT/BOOTX64.EFI ::/EFI/BOOT
|
||||
|
||||
# Verify content
|
||||
echo "Verifying FAT image content:"
|
||||
mdir -i out/fat.img -/ ::
|
||||
mcopy -i out/fat.img out/img/EFI/BOOT/bootx64.efi ::/EFI/BOOT
|
||||
|
||||
# Create the ISO
|
||||
# -e specifies the boot image (the FAT image)
|
||||
# -no-emul-boot is required for UEFI
|
||||
xorriso -as mkisofs -R -f -e /fat.img -no-emul-boot -volid LintsEFI -o out/lints.iso out/img out/fat.img
|
||||
49
src/scripts/run_vbox.sh
Executable file
49
src/scripts/run_vbox.sh
Executable file
@@ -0,0 +1,49 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e # Exit on error
|
||||
|
||||
VM_NAME="LintsOS"
|
||||
DISK_IMG="${1:-out/fat.img}"
|
||||
|
||||
# Remove existing VM if it exists
|
||||
if VBoxManage list vms | grep -q "\"${VM_NAME}\""; then
|
||||
VBoxManage unregistervm ${VM_NAME} --delete 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Remove old VDI if it exists
|
||||
if [ -f "uefi-disk.vdi" ]; then
|
||||
rm -f uefi-disk.vdi
|
||||
fi
|
||||
|
||||
VBoxManage createvm --name "${VM_NAME}" --ostype "Other_64" --register
|
||||
|
||||
VBoxManage modifyvm "${VM_NAME}" \
|
||||
--memory 512 \
|
||||
--vram 16 \
|
||||
--cpus 1 \
|
||||
--firmware efi \
|
||||
--boot1 disk \
|
||||
--boot2 none \
|
||||
--boot3 none \
|
||||
--boot4 none \
|
||||
--graphicscontroller vmsvga \
|
||||
--mouse usbtablet
|
||||
|
||||
VBoxManage storagectl "${VM_NAME}" \
|
||||
--name "SATA Controller" \
|
||||
--add sata \
|
||||
--controller IntelAhci \
|
||||
--portcount 1 \
|
||||
--bootable on
|
||||
|
||||
VBoxManage convertfromraw ${DISK_IMG} out/test-disk.vdi --format VDI
|
||||
|
||||
VBoxManage storageattach "${VM_NAME}" \
|
||||
--storagectl "SATA Controller" \
|
||||
--port 0 \
|
||||
--device 0 \
|
||||
--type hdd \
|
||||
--medium out/test-disk.vdi
|
||||
|
||||
# Start the VM
|
||||
VBoxManage startvm "${VM_NAME}"
|
||||
0
os/.gitignore → src/system/.gitignore
vendored
0
os/.gitignore → src/system/.gitignore
vendored
@@ -2,7 +2,7 @@
|
||||
"lockfileVersion": 1,
|
||||
"workspaces": {
|
||||
"": {
|
||||
"name": "os",
|
||||
"name": "lints-system",
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest",
|
||||
},
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "os",
|
||||
"name": "lints-system",
|
||||
"module": "src/index.ts",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"typescript": "^5"
|
||||
}
|
||||
},
|
||||
"private": true
|
||||
}
|
||||
1
src/system/src/index.ts
Normal file
1
src/system/src/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
kc.println("Hello via Bun!");
|
||||
3
src/system/src/types/kc.d.ts
vendored
Normal file
3
src/system/src/types/kc.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
declare namespace kc {
|
||||
function println(msg: string): void;
|
||||
}
|
||||
Reference in New Issue
Block a user