42 lines
1.4 KiB
C
42 lines
1.4 KiB
C
// Environment (GNO shell-variable table) round-trip regression.
|
|
// GNO has no Unix environ[]; the "environment" is the kernel SHELL-
|
|
// VARIABLE table reached via GS/OS Shell calls (SetGS $0146 /
|
|
// ReadVariableGS $014B) dispatched through the same inline $E100A8
|
|
// mechanism as the file calls -- zero new asm. This probe sets a
|
|
// variable, reads it straight back, and asserts the value survives.
|
|
//
|
|
// Deterministic: the variable name/value are literals, no pids or
|
|
// addresses, so the round-trip is identical on every boot.
|
|
//
|
|
// Bank-2 absolute markers (DBR-independent), per gnoHeapProbe convention:
|
|
// 0x025000 C0DE reached end (no hang in the shell-call path)
|
|
// 0x025002 0001 getenv("LLVMTEST") == "42" (round-trip OK), else DEAD
|
|
// 0x025012 0001 setenv("LLVMTEST","42",1) == 0 (call succeeded), else DEAD
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
#define M(a) (*(volatile uint16_t *)(a))
|
|
|
|
|
|
int main(void) {
|
|
int sr;
|
|
char *v;
|
|
uint16_t match;
|
|
|
|
M(0x025000UL) = 0x0000;
|
|
|
|
sr = setenv("LLVMTEST", "42", 1);
|
|
M(0x025012UL) = (sr == 0) ? 0x0001 : 0xDEAD;
|
|
|
|
v = getenv("LLVMTEST");
|
|
match = 0xDEAD;
|
|
if (v != 0 && v[0] == '4' && v[1] == '2' && v[2] == 0) {
|
|
match = 0x0001;
|
|
}
|
|
M(0x025002UL) = match;
|
|
|
|
M(0x025000UL) = 0xC0DE; // reached end
|
|
for (volatile unsigned long j = 0; j < 300000UL; j++) {
|
|
}
|
|
return 0;
|
|
}
|