summaryrefslogtreecommitdiffstats
path: root/qemu/roms/SLOF/slof/fs/alloc-mem-debug.fs
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/roms/SLOF/slof/fs/alloc-mem-debug.fs')
-rw-r--r--qemu/roms/SLOF/slof/fs/alloc-mem-debug.fs116
1 files changed, 116 insertions, 0 deletions
diff --git a/qemu/roms/SLOF/slof/fs/alloc-mem-debug.fs b/qemu/roms/SLOF/slof/fs/alloc-mem-debug.fs
new file mode 100644
index 000000000..d4ca70bbd
--- /dev/null
+++ b/qemu/roms/SLOF/slof/fs/alloc-mem-debug.fs
@@ -0,0 +1,116 @@
+\ *****************************************************************************
+\ * Copyright (c) 2011 IBM Corporation
+\ * All rights reserved.
+\ * This program and the accompanying materials
+\ * are made available under the terms of the BSD License
+\ * which accompanies this distribution, and is available at
+\ * http://www.opensource.org/licenses/bsd-license.php
+\ *
+\ * Contributors:
+\ * IBM Corporation - initial implementation
+\ ****************************************************************************/
+\ * Dynamic memory allocation/de-allocation debug functions
+\ *****************************************************************************
+
+
+\ Uncomment the following code for debugging bad write accesses beyond
+\ the end of the allocated block:
+\ Store magic value past the end of the block during alloc-mem and
+\ check for this magic value when free-mem has been called.
+#if 1
+: alloc-mem ( len -- addr )
+ dup /n + alloc-mem ( len addr )
+ 2dup + 3141592653589793 swap ! nip
+;
+
+: free-mem ( addr len -- )
+ 2dup + @ 3141592653589793 <> IF
+ cr ." Detected memory corrupt during free-mem of "
+ swap . . cr EXIT
+ THEN
+ /n + free-mem
+;
+#endif
+
+
+\ Never ever assume that allocated memory is pre-initialized with 0 ...
+: alloc-mem ( len -- addr )
+ dup alloc-mem swap 2dup ff fill drop
+;
+
+\ Make sure that memory block do not contain "valid" data after free-mem:
+: free-mem ( addr len -- )
+ 2dup ff fill free-mem
+;
+
+
+\ The following definitions are used for debugging the parameters of free-mem:
+\ Store block address and size of allocated blocks
+\ in an array, then check for right values on free-mem.
+
+1000 CONSTANT max-malloced-blocks
+CREATE malloced-blocks max-malloced-blocks 2 * cells allot
+malloced-blocks max-malloced-blocks 2 * cells erase
+
+
+: alloc-mem ( len -- addr )
+ dup alloc-mem dup 0= IF
+ cr ." alloc-mem returned 0 for size " swap . cr EXIT
+ THEN ( len addr )
+ malloced-blocks max-malloced-blocks 0 DO ( len addr m-blocks-ptr )
+ dup @ 0= IF ( len addr m-blocks-ptr )
+ \ Found a free entry: store addr and len
+ over >r dup >r !
+ r> cell+ !
+ r> UNLOOP EXIT
+ THEN
+ cell+ cell+ ( len addr next-m-blocks-ptr )
+ LOOP
+ ." Please increase max-malloced-blocks." cr ( len addr next-m-blocks-ptr )
+ drop nip
+;
+
+
+: free-mem ( addr len -- )
+ malloced-blocks max-malloced-blocks 0 DO ( addr len m-blocks-ptr )
+ dup @ ?dup IF
+ ( addr len m-blocks-ptr s-addr )
+ 3 pick = IF
+ ( addr len m-blocks-ptr )
+ dup cell+ @ ( addr len m-blocks-ptr s-len )
+ 2 pick = IF ( addr len m-blocks-ptr )
+ \ All right, addr and len matched,
+ \ clear entry and call original free-mem.
+ dup cell+ 0 swap !
+ 0 swap !
+ free-mem
+ ELSE
+ >r swap cr
+ ." free-mem called for block " . ." with wrong size=" . cr
+ ." ( correct size should be: " r> cell+ @ . ." )" cr
+ THEN
+ UNLOOP EXIT
+ THEN ( addr len m-blocks-ptr )
+ THEN
+ cell+ cell+ ( addr len next-m-blocks-ptr )
+ LOOP
+ drop swap cr
+ ." free-mem called for block " .
+ ." ( size=" .
+ ." ) which has never been allocated before!" cr
+;
+
+
+\ Enable these for verbose debug messages:
+#if 0
+: alloc-mem
+ cr ." alloc-mem with len=" dup .
+ alloc-mem
+ ." returned addr=" dup . cr
+;
+
+: free-mem
+ cr ." free mem addr=" over . ." len=" dup . cr
+ free-mem
+;
+#endif