From 6a90b2ec19b254f6487e4512762759b3400afb2b Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Thu, 25 Jun 2026 03:13:57 -0500 Subject: [PATCH] crt0Gsos: honor Loader DP + DP-aware __jsl_indir --- demos/rsrcProbe.apl | Bin 45032 -> 45039 bytes runtime/src/crt0Gsos.s | 30 +++++++++++++++++---- runtime/src/libgcc.s | 57 ++++++++++++++++++++++++++++----------- scripts/smokeTest.sh | 60 ++++++++++++++++++++++++++++++++++++++++- 4 files changed, 125 insertions(+), 22 deletions(-) diff --git a/demos/rsrcProbe.apl b/demos/rsrcProbe.apl index 427b3552c25a4913beffbb36737c58db5343356c..1648aeca902307bef3c1dca875b31a16d7013b9d 100644 GIT binary patch delta 5545 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 F`5zNpA9?@) delta 5564 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/dev/null 2>&1; then + log "check: crt0Gsos indirect-dispatch under real GS/OS Loader" + cGin="$(mktemp --suffix=.c)" + oGin="$(mktemp --suffix=.o)" + binGin="$(mktemp --suffix=.bin)" + mapGin="$(mktemp --suffix=.map)" + relGin="$(mktemp --suffix=.reloc)" + omfGin="$(mktemp --suffix=.omf)" + cat > "$cGin" <<'EOF' +typedef int (*FnT)(int); +static int twice(int x) { return x * 2; } +static int neg(int x) { return -x; } +volatile int gI = 0; +int main(void) { + FnT tab[2] = { twice, neg }; + int r = tab[gI](7) + tab[1](3); + *(volatile unsigned char *)0x70 = (unsigned char)r; + return 0; +} +EOF + "$CLANG" --target=w65816 -I"$PROJECT_ROOT/runtime/include" -O2 \ + -ffunction-sections -c "$cGin" -o "$oGin" + "$PROJECT_ROOT/tools/link816" -o "$binGin" --text-base 0x1000 \ + --bss-base 0xA000 --map "$mapGin" --reloc-out "$relGin" \ + "$PROJECT_ROOT/runtime/crt0Gsos.o" "$oGin" \ + "$PROJECT_ROOT/runtime/libc.o" "$PROJECT_ROOT/runtime/snprintf.o" \ + "$PROJECT_ROOT/runtime/extras.o" \ + "$PROJECT_ROOT/runtime/softFloat.o" "$PROJECT_ROOT/runtime/softDouble.o" \ + "$PROJECT_ROOT/runtime/iigsGsos.o" \ + "$PROJECT_ROOT/runtime/iigsToolbox.o" "$PROJECT_ROOT/runtime/iigsToolboxExtra.o" \ + "$PROJECT_ROOT/runtime/libgcc.o" >/dev/null 2>&1 \ + || die "crt0Gsos indirect: link failed" + "$PROJECT_ROOT/tools/omfEmit" --input "$binGin" --map "$mapGin" \ + --base 0x1000 --entry __start --output "$omfGin" \ + --name INDIR --expressload --relocs "$relGin" >/dev/null 2>&1 + if ! bash "$PROJECT_ROOT/scripts/runViaFinder.sh" "$omfGin" \ + --check 0x70=0x0b >/dev/null 2>&1; then + bash "$PROJECT_ROOT/scripts/runViaFinder.sh" "$omfGin" \ + --check 0x70=0x0b 2>&1 | tail -5 >&2 + die "crt0Gsos indirect: marker != 0x0B (DP scribble?)" + fi + rm -f "$cGin" "$oGin" "$binGin" "$mapGin" "$relGin" "$omfGin" +fi + # Stack-size end-to-end: omfEmit --stack-size must actually propagate a # larger DP/Stack chunk to the GS/OS Loader. Background: prior to the # 2026-06-02 fix, the ~Direct DP/Stack segment was appended to the OMF @@ -6595,12 +6650,15 @@ if [ "${SMOKE_SKIP_STACKSIZE:-0}" != "1" ] \ // store its high byte at $71 so the harness can verify Loader honored // --stack-size. $70 = 0x99 marker = program ran. int main(void) { + // sta long $00:0071 — force bank-0 absolute (not DP form). crt0Gsos + // now honors the Loader-allocated DP rather than forcing DP=0, so a + // bare `sta $71` would land at (LoaderDP+$71) and miss bank-0:$71. __asm__ volatile ( "rep #0x30\n" "tsc\n" "xba\n" "sep #0x20\n" - "sta 0x71\n" + ".byte 0x8f, 0x71, 0x00, 0x00\n" "rep #0x20\n" ); *(volatile unsigned char *)0x70 = 0x99;