[Oberon] FPGA RISC memory interfacing
Andreas Pirklbauer
andreas_pirklbauer at yahoo.com
Thu Dec 26 17:22:55 CET 2019
> There was also is a bug in the allocator (dubbed "memory alligator” here
> on the mailing list), which I am not sure whether it is already fixed in the
> official sources. A failed allocation can cause the linked list of free memory
> segments to get corrupted, which may result in a freeze or other corruption
> related artifacts later.
As an FYI: On my system, detecting the double trap only works with the “memory
alligator” fix also implemented in module Kernel, for example as follows:
PROCEDURE GetBlock128(VAR p: LONGINT);
VAR q: LONGINT;
BEGIN
IF list1 # 0 THEN p := list1; SYSTEM.GET(list1+8, list1)
ELSE GetBlock(q, 256);
IF q > 0 THEN SYSTEM.PUT(q+128, 128); SYSTEM.PUT(q+132, -1); SYSTEM.PUT(q+136, list1); list1 := q + 128 END ;
p := q
END
END GetBlock128;
PROCEDURE GetBlock64(VAR p: LONGINT);
VAR q: LONGINT;
BEGIN
IF list2 # 0 THEN p := list2; SYSTEM.GET(list2+8, list2)
ELSE GetBlock128(q);
IF q > 0 THEN SYSTEM.PUT(q+64, 64); SYSTEM.PUT(q+68, -1); SYSTEM.PUT(q+72, list2); list2 := q + 64 END ;
p := q
END
END GetBlock64;
PROCEDURE GetBlock32(VAR p: LONGINT);
VAR q: LONGINT;
BEGIN
IF list3 # 0 THEN p := list3; SYSTEM.GET(list3+8, list3)
ELSE GetBlock64(q);
IF q > 0 THEN SYSTEM.PUT(q+32, 32); SYSTEM.PUT(q+36, -1); SYSTEM.PUT(q+40, list3); list3 := q + 32 END ;
p := q
END
END GetBlock32;
More information about the Oberon
mailing list