refactor: namespace restructure of entire codebase
continuous-integration/drone/push Build is passing
continuous-integration/drone/push Build is passing
Reorganize all source files into a hierarchical namespace structure with dot-separated unit names matching directory paths. Major changes: - src/prog/ -> src/app/ (app.*.pas) - src/fault/ -> src/arch/x86/fault/ (arch.x86.fault.*.pas) - src/isr/ -> src/arch/x86/isr/ (arch.x86.isr.*.pas) - src/include/ -> src/core/ (core.*.pas) + src/arch/x86/ - src/driver/ subtree reorganized with driver.* namespace prefixes - src/driver/storage/con/ -> src/driver/storage/ctl/ (Windows reserved name fix) - src/driver/storage/ split into con(ctl)/fs/vol/ subdirectories - src/driver/net/ flattened from l1-l5 layers to driver.net.*.pas - kernel.pas -> asuro.pas, faults.pas -> arch.x86.faults.pas - stdio.pas/syslog.pas -> io/io.stdio.pas, io/io.syslog.pas - processmanager.pas -> proc/proc.mgr.pas - lmemorymanager.pas -> memory/memory.heap.pas - Build scripts moved to toolchain/ - Added compat/ shims for lmemorymanager and types - Added doc/namespace.md tracking the refactor 197 files changed, 6292 insertions(+), 5526 deletions(-)
This commit is contained in:
+2
-2
@@ -22,8 +22,8 @@ steps:
|
|||||||
commands:
|
commands:
|
||||||
- git fetch --tags
|
- git fetch --tags
|
||||||
- find . -type f -print0 | xargs -0 dos2unix
|
- find . -type f -print0 | xargs -0 dos2unix
|
||||||
- chmod +x /drone/src/*.sh
|
- chmod +x /drone/src/toolchain/*.sh
|
||||||
- /drone/src/compile.sh
|
- /drone/src/toolchain/compile.sh
|
||||||
|
|
||||||
- name: upload-iso-artifact
|
- name: upload-iso-artifact
|
||||||
image: alpine/git
|
image: alpine/git
|
||||||
|
|||||||
+1
-2
@@ -14,10 +14,9 @@ RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSIO
|
|||||||
pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \
|
pushd fpc-$FPC_VERSION.i386-linux && ./install.sh && popd && \
|
||||||
rm -rf fpc-$FPC_VERSION.i386-linux
|
rm -rf fpc-$FPC_VERSION.i386-linux
|
||||||
|
|
||||||
COPY compile.sh /compile.sh
|
|
||||||
ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver
|
ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver
|
||||||
RUN chmod +x /usr/bin/semver
|
RUN chmod +x /usr/bin/semver
|
||||||
WORKDIR /code
|
WORKDIR /code
|
||||||
RUN find . -type f -print0 | xargs -0 dos2unix
|
RUN find . -type f -print0 | xargs -0 dos2unix
|
||||||
ENTRYPOINT ["/bin/bash", "-c"]
|
ENTRYPOINT ["/bin/bash", "-c"]
|
||||||
CMD ["/compile.sh"]
|
CMD ["find toolchain -name '*.sh' -exec dos2unix {} + 2>/dev/null; find toolchain -name '*.sh' -exec chmod +x {} +; bash toolchain/compile.sh"]
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
{ Compatibility shim: wasuro references the old unit name 'lmemorymanager'.
|
||||||
|
Since wasuro/ cannot be modified, this unit re-exports the public API of
|
||||||
|
memory.heap so that 'uses lmemorymanager' continues to compile. }
|
||||||
|
unit lmemorymanager;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
memory.heap;
|
||||||
|
|
||||||
|
const
|
||||||
|
ALLOC_UNIT = memory.heap.ALLOC_UNIT;
|
||||||
|
DATA_OFFSET = memory.heap.DATA_OFFSET;
|
||||||
|
PAGE_SIZE_LMM = memory.heap.PAGE_SIZE_LMM;
|
||||||
|
TOTAL_UNITS = memory.heap.TOTAL_UNITS;
|
||||||
|
BITMAP_DWORDS = memory.heap.BITMAP_DWORDS;
|
||||||
|
SIZE_PREFIX = memory.heap.SIZE_PREFIX;
|
||||||
|
LARGE_ALLOC_MAGIC = memory.heap.LARGE_ALLOC_MAGIC;
|
||||||
|
|
||||||
|
type
|
||||||
|
PHeapPageHeader = memory.heap.PHeapPageHeader;
|
||||||
|
THeapPageHeader = memory.heap.THeapPageHeader;
|
||||||
|
|
||||||
|
procedure init;
|
||||||
|
function kalloc(size : uint32) : void;
|
||||||
|
function klalloc(size : uint32) : void;
|
||||||
|
procedure klfree(address : uint32);
|
||||||
|
function kpalloc(address : uint32) : void;
|
||||||
|
procedure kfree(area : void);
|
||||||
|
function lmm_total_free : uint32;
|
||||||
|
function lmm_page_count : uint32;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure init;
|
||||||
|
begin
|
||||||
|
memory.heap.init;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function kalloc(size : uint32) : void; inline;
|
||||||
|
begin
|
||||||
|
kalloc := memory.heap.kalloc(size);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function klalloc(size : uint32) : void; inline;
|
||||||
|
begin
|
||||||
|
klalloc := memory.heap.klalloc(size);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure klfree(address : uint32); inline;
|
||||||
|
begin
|
||||||
|
memory.heap.klfree(address);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function kpalloc(address : uint32) : void; inline;
|
||||||
|
begin
|
||||||
|
kpalloc := memory.heap.kpalloc(address);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure kfree(area : void); inline;
|
||||||
|
begin
|
||||||
|
memory.heap.kfree(area);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function lmm_total_free : uint32; inline;
|
||||||
|
begin
|
||||||
|
lmm_total_free := memory.heap.lmm_total_free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function lmm_page_count : uint32; inline;
|
||||||
|
begin
|
||||||
|
lmm_page_count := memory.heap.lmm_page_count;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
unit types;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
echo " "
|
|
||||||
echo "======================="
|
|
||||||
echo " "
|
|
||||||
echo "Compiling Stub..."
|
|
||||||
echo " "
|
|
||||||
nasm -f elf src/stub/stub.asm -o lib/stub.o
|
|
||||||
nasm -f elf src/stub/splash_tga.asm -o lib/splash_tga.o
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -17,12 +17,12 @@
|
|||||||
|
|
||||||
@author(Angus C <angus@actm.uk>)
|
@author(Angus C <angus@actm.uk>)
|
||||||
}
|
}
|
||||||
unit base64_prog;
|
unit app.base64;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
stdio, util, strings, tracer, base64, lmemorymanager;
|
io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, core.enc.base64, memory.heap;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ var
|
|||||||
PSize : uInt32;
|
PSize : uInt32;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
tracer.push_trace('base64_prog.run');
|
debug.tracer.push_trace('base64_prog.run');
|
||||||
if paramCount(Params) > 1 then begin
|
if paramCount(Params) > 1 then begin
|
||||||
encdec := getParam(0, Params);
|
encdec := getParam(0, Params);
|
||||||
if stringEquals(encdec, 'encode') then begin
|
if stringEquals(encdec, 'encode') then begin
|
||||||
@@ -58,23 +58,23 @@ begin
|
|||||||
dec(pinput);
|
dec(pinput);
|
||||||
pinput^ := #0;
|
pinput^ := #0;
|
||||||
result := b64_encode_str(input);
|
result := b64_encode_str(input);
|
||||||
stdio.bufWriteStrLn(stdout_buf, result);
|
io.stdio.bufWriteStrLn(stdout_buf, result);
|
||||||
kfree(void(result));
|
kfree(void(result));
|
||||||
end else if stringEquals(encdec, 'decode') then begin
|
end else if stringEquals(encdec, 'decode') then begin
|
||||||
input := getParam(1, Params);
|
input := getParam(1, Params);
|
||||||
result := b64_decode_str(input);
|
result := b64_decode_str(input);
|
||||||
stdio.bufWriteStrLn(stdout_buf, result);
|
io.stdio.bufWriteStrLn(stdout_buf, result);
|
||||||
kfree(void(result));
|
kfree(void(result));
|
||||||
end else stdio.bufWriteStrLn(stderr_buf, 'Usage: base64 <encode/decode> <text>');
|
end else io.stdio.bufWriteStrLn(stderr_buf, 'Usage: core.enc.base64 <encode/decode> <text>');
|
||||||
end else begin
|
end else begin
|
||||||
stdio.bufWriteStrLn(stderr_buf, 'Usage: base64 <encode/decode> <text>');
|
io.stdio.bufWriteStrLn(stderr_buf, 'Usage: core.enc.base64 <encode/decode> <text>');
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
begin
|
begin
|
||||||
tracer.push_trace('base64_prog.init');
|
debug.tracer.push_trace('base64_prog.init');
|
||||||
stdio.registerCommand('BASE64', @Run, 'Perform Base64 Encode/Decode.');
|
io.stdio.registerCommand('BASE64', @Run, 'Perform Base64 Encode/Decode.');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
@@ -17,12 +17,12 @@
|
|||||||
|
|
||||||
@author(Kieron Morris <kjm@kieronmorris.me>)
|
@author(Kieron Morris <kjm@kieronmorris.me>)
|
||||||
}
|
}
|
||||||
unit dhclient;
|
unit app.dhclient;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
stdio, util, strings, tracer, dhcp;
|
io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, driver.net.dhcp;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
|
||||||
@@ -30,14 +30,14 @@ implementation
|
|||||||
|
|
||||||
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
|
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
|
||||||
begin
|
begin
|
||||||
tracer.push_trace('dhclient.run');
|
debug.tracer.push_trace('dhclient.run');
|
||||||
DHCPDiscover();
|
DHCPDiscover();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
begin
|
begin
|
||||||
tracer.push_trace('dhclient.init');
|
debug.tracer.push_trace('dhclient.init');
|
||||||
stdio.registerCommand('DHClient', @Run, 'Run the DHCP configuration utility.');
|
io.stdio.registerCommand('DHClient', @Run, 'Run the DHCP configuration utility.');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -17,12 +17,12 @@
|
|||||||
|
|
||||||
@author(Kieron Morris <kjm@kieronmorris.me>)
|
@author(Kieron Morris <kjm@kieronmorris.me>)
|
||||||
}
|
}
|
||||||
unit md5sum;
|
unit app.md5sum;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
stdio, util, strings, tracer, md5;
|
io.stdio, core.util, arch.x86.util, core.strings, debug.tracer, core.enc.md5;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
|
||||||
@@ -40,15 +40,15 @@ begin
|
|||||||
wordlen:= stringSize(md5word);
|
wordlen:= stringSize(md5word);
|
||||||
MD5_Hash := MD5Buffer(puint8(md5word), wordlen);
|
MD5_Hash := MD5Buffer(puint8(md5word), wordlen);
|
||||||
for i:=0 to 15 do begin
|
for i:=0 to 15 do begin
|
||||||
stdio.bufWriteHexPair(stdout_buf, MD5_Hash^[i]);
|
io.stdio.bufWriteHexPair(stdout_buf, MD5_Hash^[i]);
|
||||||
end;
|
end;
|
||||||
stdio.bufWriteStrLn(stdout_buf, ' ');
|
io.stdio.bufWriteStrLn(stdout_buf, ' ');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
begin
|
begin
|
||||||
tracer.push_trace('md5sum.init');
|
debug.tracer.push_trace('md5sum.init');
|
||||||
stdio.registerCommand('MD5SUM', @Run, 'Perform MD5SUM on a word.');
|
io.stdio.registerCommand('MD5SUM', @Run, 'Perform MD5SUM on a word.');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
// Copyright 2021 Kieron Morris
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
{
|
||||||
|
Prog->app.meminfo - Print memory statistics (PMM / LMM).
|
||||||
|
|
||||||
|
@author(Kieron Morris <[email protected]>)
|
||||||
|
}
|
||||||
|
unit app.meminfo;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
io.stdio, arch.x86.multiboot, arch.x86.memory.physical, memory.heap, debug.tracer;
|
||||||
|
|
||||||
|
procedure init();
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
|
||||||
|
var
|
||||||
|
pmm_total, pmm_free, pmm_used : uint32;
|
||||||
|
lmm_pages, lmm_free : uint32;
|
||||||
|
begin
|
||||||
|
{ Multiboot memory info }
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, '--- Multiboot ---');
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Lower Memory : ');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, multibootinfo^.mem_lower);
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Upper Memory : ');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, multibootinfo^.mem_upper);
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Total Memory : ');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, ((multibootinfo^.mem_upper + 1000) div 1024) + 1);
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
|
||||||
|
|
||||||
|
{ PMM stats }
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, '--- PMM (4 MB blocks) ---');
|
||||||
|
pmm_total := arch.x86.memory.physical.pmm_total_blocks;
|
||||||
|
pmm_free := arch.x86.memory.physical.pmm_free_blocks;
|
||||||
|
pmm_used := pmm_total - pmm_free;
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Total Blocks : ');
|
||||||
|
io.stdio.bufWriteIntLn(stdout_buf, pmm_total);
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Free Blocks : ');
|
||||||
|
io.stdio.bufWriteIntLn(stdout_buf, pmm_free);
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Used Blocks : ');
|
||||||
|
io.stdio.bufWriteIntLn(stdout_buf, pmm_used);
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Free Physical : ');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, pmm_free * 4);
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
|
||||||
|
|
||||||
|
{ LMM heap stats }
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, '--- LMM (Heap) ---');
|
||||||
|
lmm_pages := memory.heap.lmm_page_count;
|
||||||
|
lmm_free := memory.heap.lmm_total_free;
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Heap Pages : ');
|
||||||
|
io.stdio.bufWriteIntLn(stdout_buf, lmm_pages);
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Heap Size : ');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, lmm_pages * 4);
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, ' MB');
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Heap Free : ');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, lmm_free div 1024);
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, ' KB');
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure init();
|
||||||
|
begin
|
||||||
|
debug.tracer.push_trace('meminfo.init');
|
||||||
|
io.stdio.registerCommand('MEMINFO', @Run, 'Print memory statistics (PMM/LMM).');
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
// Copyright 2021 Kieron Morris
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
{
|
||||||
|
ProgManager - Central initialization for terminal registered, baked-in programs.
|
||||||
|
|
||||||
|
@author(Kieron Morris <[email protected]>)
|
||||||
|
@author(Aaron Hance <[email protected]>)
|
||||||
|
}
|
||||||
|
unit app.mgr;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
debug.tracer, io.stdio, proc.mgr,
|
||||||
|
//progs
|
||||||
|
app.base64, app.md5sum, app.dhclient, app.vbeinfo, app.testcmd, app.ping, app.meminfo, app.setres,
|
||||||
|
//drivers
|
||||||
|
driver.storage.ctl.ram, driver.mgr,
|
||||||
|
//network
|
||||||
|
driver.net.ipv4, driver.net.arp, driver.net.tcp,
|
||||||
|
//dispatch
|
||||||
|
driver.storage.filedispatch,
|
||||||
|
//wasm
|
||||||
|
app.wasm.runner;
|
||||||
|
|
||||||
|
{ Initialize all baked-in programs }
|
||||||
|
procedure init();
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
core.version,
|
||||||
|
//command provider units
|
||||||
|
arch.x86.cpu,
|
||||||
|
app.diskcmd, driver.bus.usb.core, app.diskutil, app.notepad, app.partcmd, app.volcmd;
|
||||||
|
|
||||||
|
procedure init();
|
||||||
|
begin
|
||||||
|
debug.tracer.push_trace('app.mgr.init');
|
||||||
|
|
||||||
|
{ Register commands from provider units }
|
||||||
|
io.stdio.registerCommand('CPU', @arch.x86.cpu.Terminal_Command_CPU, 'CPU Info.');
|
||||||
|
io.stdio.registerCommand('DEV', @driver.mgr.terminal_command_dev, 'Driver Management Interface.');
|
||||||
|
io.stdio.registerCommand('PS', @proc.mgr.terminal_command_ps, 'List running processes.');
|
||||||
|
io.stdio.registerCommand('KILL', @proc.mgr.terminal_command_kill, 'Force-kill a process by PID.');
|
||||||
|
io.stdio.registerCommand('TERMINATE', @proc.mgr.terminal_command_terminate, 'Gracefully terminate a process by PID.');
|
||||||
|
io.stdio.registerCommand('ARP', @driver.net.arp.terminal_command_arp, 'Get ARP Table.');
|
||||||
|
io.stdio.registerCommand('IFCONFIG', @driver.net.ipv4.terminal_command_ifconfig, 'Configure Network Settings.');
|
||||||
|
io.stdio.registerCommand('TCPCONNECT', @driver.net.tcp.terminal_command_tcpconnect, 'Connect to a TCP host and send Hello World.');
|
||||||
|
io.stdio.registerCommand('TCPLISTEN', @driver.net.tcp.terminal_command_tcplisten, 'Listen on a TCP port and log received data.');
|
||||||
|
io.stdio.registerCommand('TCPHTTP', @driver.net.tcp.terminal_command_tcphttp, 'Send HTTP GET to a host IP (port 80 default).');
|
||||||
|
io.stdio.registerCommand('USB', @driver.bus.usb.core.terminal_command_usb, 'driver.bus.usb subsystem information.');
|
||||||
|
|
||||||
|
{ Initialize baked-in programs }
|
||||||
|
app.diskcmd.init();
|
||||||
|
app.partcmd.init();
|
||||||
|
app.volcmd.init();
|
||||||
|
app.diskutil.init();
|
||||||
|
app.notepad.init();
|
||||||
|
app.md5sum.init();
|
||||||
|
app.base64.init();
|
||||||
|
app.dhclient.init();
|
||||||
|
app.vbeinfo.init();
|
||||||
|
app.testcmd.init();
|
||||||
|
app.ping.init();
|
||||||
|
app.meminfo.init();
|
||||||
|
{ File dispatch & WASM integration }
|
||||||
|
driver.storage.ctl.ram.init();
|
||||||
|
driver.storage.filedispatch.init();
|
||||||
|
app.wasm.runner.init();
|
||||||
|
app.setres.init();
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,28 +3,28 @@
|
|||||||
|
|
||||||
Sends 10 ICMP echo requests to a host, printing round-trip time
|
Sends 10 ICMP echo requests to a host, printing round-trip time
|
||||||
for each reply. Sleeps 1 second between pings. Each invocation
|
for each reply. Sleeps 1 second between pings. Each invocation
|
||||||
uses a heap-allocated state record so multiple terminals can ping
|
uses a heap-allocated state record so multiple terminals can app.ping
|
||||||
concurrently without corrupting each other.
|
concurrently without corrupting each other.
|
||||||
|
|
||||||
@author(Kieron Morris <kjm@kieronmorris.me>)
|
@author(Kieron Morris <kjm@kieronmorris.me>)
|
||||||
}
|
}
|
||||||
unit ping;
|
unit app.ping;
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
stdio, tracer;
|
io.stdio, debug.tracer;
|
||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
bios_data_area, nettypes, icmp, netutils, strings,
|
arch.x86.bda, driver.net.types, driver.net.icmp, driver.net.util, core.strings,
|
||||||
processmanager, util, lmemorymanager;
|
proc.mgr, core.util, arch.x86.util, memory.heap;
|
||||||
|
|
||||||
const
|
const
|
||||||
PING_TIMEOUT_MS = 5000; { 5-second timeout per ping }
|
PING_TIMEOUT_MS = 5000; { 5-second timeout per app.ping }
|
||||||
|
|
||||||
type
|
type
|
||||||
TPingResult = (prWaiting, prGotReply, prGotError);
|
TPingResult = (prWaiting, prGotReply, prGotError);
|
||||||
@@ -74,14 +74,14 @@ var
|
|||||||
timeoutTicks : uint32;
|
timeoutTicks : uint32;
|
||||||
begin
|
begin
|
||||||
if ParamCount(Params) < 1 then begin
|
if ParamCount(Params) < 1 then begin
|
||||||
stdio.bufWriteStrLn(stderr_buf, 'Usage: PING <ip>');
|
io.stdio.bufWriteStrLn(stderr_buf, 'Usage: PING <ip>');
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
ip_str := getParam(0, Params);
|
ip_str := getParam(0, Params);
|
||||||
ip := stringToIPv4(ip_str);
|
ip := stringToIPv4(ip_str);
|
||||||
if ip = nil then begin
|
if ip = nil then begin
|
||||||
stdio.bufWriteStrLn(stderr_buf, 'Invalid IP address.');
|
io.stdio.bufWriteStrLn(stderr_buf, 'Invalid IP address.');
|
||||||
exit;
|
exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@@ -93,12 +93,12 @@ begin
|
|||||||
{ Send ICMP echo request }
|
{ Send ICMP echo request }
|
||||||
st^.Result := prWaiting;
|
st^.Result := prWaiting;
|
||||||
st^.SendTime := Counters.c64;
|
st^.SendTime := Counters.c64;
|
||||||
icmp.sendICMPRequest(ip, i, 128, @on_reply, @on_error, void(st));
|
driver.net.icmp.sendICMPRequest(ip, i, 128, @on_reply, @on_error, void(st));
|
||||||
|
|
||||||
{ Spin-yield until callback fires or timeout }
|
{ Spin-yield until callback fires or timeout }
|
||||||
tStart := Counters.c32;
|
tStart := Counters.c32;
|
||||||
while st^.Result = prWaiting do begin
|
while st^.Result = prWaiting do begin
|
||||||
processmanager.proc_yield;
|
proc.mgr.proc_yield;
|
||||||
tNow := Counters.c32;
|
tNow := Counters.c32;
|
||||||
if tNow >= tStart then
|
if tNow >= tStart then
|
||||||
elapsed := tNow - tStart
|
elapsed := tNow - tStart
|
||||||
@@ -113,22 +113,22 @@ begin
|
|||||||
|
|
||||||
{ Display result }
|
{ Display result }
|
||||||
if st^.Result = prGotReply then begin
|
if st^.Result = prGotReply then begin
|
||||||
stdio.bufWriteStr(stdout_buf, 'Ping Reply: ');
|
io.stdio.bufWriteStr(stdout_buf, 'Ping Reply: ');
|
||||||
stdio.bufWriteInt(stdout_buf, st^.ReplyTimeMS);
|
io.stdio.bufWriteInt(stdout_buf, st^.ReplyTimeMS);
|
||||||
stdio.bufWriteStrLn(stdout_buf, 'ms.');
|
io.stdio.bufWriteStrLn(stdout_buf, 'ms.');
|
||||||
end else begin
|
end else begin
|
||||||
stdio.bufWriteStr(stderr_buf, 'Ping Error: ');
|
io.stdio.bufWriteStr(stderr_buf, 'Ping Error: ');
|
||||||
case st^.ErrorReason of
|
case st^.ErrorReason of
|
||||||
aecFailedToResolveHost: stdio.bufWriteStrLn(stderr_buf, 'Failed to resolve host.');
|
aecFailedToResolveHost: io.stdio.bufWriteStrLn(stderr_buf, 'Failed to resolve host.');
|
||||||
aecNoRouteToHost: stdio.bufWriteStrLn(stderr_buf, 'No route to host.');
|
aecNoRouteToHost: io.stdio.bufWriteStrLn(stderr_buf, 'No route to host.');
|
||||||
aecTimeout: stdio.bufWriteStrLn(stderr_buf, 'Timeout expired.');
|
aecTimeout: io.stdio.bufWriteStrLn(stderr_buf, 'Timeout expired.');
|
||||||
aecTTLExpired: stdio.bufWriteStrLn(stderr_buf, 'TTL Expired.');
|
aecTTLExpired: io.stdio.bufWriteStrLn(stderr_buf, 'TTL Expired.');
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ Sleep 1 second between pings (except after last) }
|
{ Sleep 1 second between pings (except after last) }
|
||||||
if i < 9 then
|
if i < 9 then
|
||||||
processmanager.proc_sleep_ms(1000);
|
proc.mgr.proc_sleep_ms(1000);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ Clean up }
|
{ Clean up }
|
||||||
@@ -138,8 +138,8 @@ end;
|
|||||||
|
|
||||||
procedure init();
|
procedure init();
|
||||||
begin
|
begin
|
||||||
tracer.push_trace('ping.init');
|
debug.tracer.push_trace('ping.init');
|
||||||
stdio.registerCommand('PING', @run, 'Ping a host.');
|
io.stdio.registerCommand('PING', @run, 'Ping a host.');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
Prog->app.setres - Set display resolution via GPU driver framework.
|
||||||
|
|
||||||
|
Usage: SETRES <width> <height>
|
||||||
|
Example: SETRES 1024 768
|
||||||
|
|
||||||
|
Uses the GPU driver framework to switch display modes. Tries BGA first,
|
||||||
|
then falls back to VBE/VESA.
|
||||||
|
|
||||||
|
@author(Kieron Morris <[email protected]>)
|
||||||
|
}
|
||||||
|
unit app.setres;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
io.stdio, driver.video.gpu, core.util, arch.x86.util, core.strings, debug.tracer, io.syslog;
|
||||||
|
|
||||||
|
procedure init();
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure run(Params : PParamList; stdin_buf, stdout_buf, stderr_buf : POutBuf);
|
||||||
|
var
|
||||||
|
w, h : uint32;
|
||||||
|
wStr, hStr : pchar;
|
||||||
|
info : TGPUModeInfo;
|
||||||
|
|
||||||
|
begin
|
||||||
|
debug.tracer.push_trace('setres.run');
|
||||||
|
|
||||||
|
if paramCount(params) < 2 then begin
|
||||||
|
io.stdio.bufWriteStrLn(stderr_buf, 'Usage: SETRES <width> <height>');
|
||||||
|
io.stdio.bufWriteStrLn(stderr_buf, 'Example: SETRES 1024 768');
|
||||||
|
debug.tracer.pop_trace;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
wStr := getParam(0, params);
|
||||||
|
hStr := getParam(1, params);
|
||||||
|
|
||||||
|
w := stringToInt(wStr);
|
||||||
|
h := stringToInt(hStr);
|
||||||
|
|
||||||
|
if (w = 0) or (h = 0) then begin
|
||||||
|
io.stdio.bufWriteStrLn(stderr_buf, 'Error: Invalid resolution values.');
|
||||||
|
debug.tracer.pop_trace;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Setting resolution to ');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, w);
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'x');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, h);
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, 'x32...');
|
||||||
|
|
||||||
|
{ Step 1: Set display mode via GPU framework (tries BGA first, then VBE) }
|
||||||
|
if not driver.video.gpu.setMode(w, h, 32, info) then begin
|
||||||
|
io.stdio.bufWriteStrLn(stderr_buf, 'Error: Mode switch failed. Mode may not be supported.');
|
||||||
|
debug.tracer.pop_trace;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Mode set via ');
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, driver.video.gpu.activeDriverName());
|
||||||
|
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'Resolution set to ');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, w);
|
||||||
|
io.stdio.bufWriteStr(stdout_buf, 'x');
|
||||||
|
io.stdio.bufWriteInt(stdout_buf, h);
|
||||||
|
io.stdio.bufWriteStrLn(stdout_buf, 'x32 successfully.');
|
||||||
|
|
||||||
|
debug.tracer.pop_trace;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure init();
|
||||||
|
begin
|
||||||
|
debug.tracer.push_trace('setres.init');
|
||||||
|
io.stdio.registerCommand('SETRES', @Run, 'Set display resolution. Usage: SETRES <width> <height>');
|
||||||
|
debug.tracer.pop_trace;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user