[OpenBIOS] OpenBIOS dictionary relocation - can anyone explain this?

Mark Cave-Ayland mark.cave-ayland at siriusit.co.uk
Thu Jan 22 12:57:48 CET 2009

Hi everyone,

I'm trying to check the the forth dictionary is being loaded correctly 
on Sparc64, and I'm struggling to understand the dynamic relocation code 
from kernel/dict.c:

==== cut ====

         dicthead = target_long(header->length);

         memcpy(dict, data, dicthead);
         reloc_table=(ucell *)(data+dicthead);

         printk("\nmoving dictionary (%x bytes) to %x\n",
                         (ucell)dicthead, (ucell)dict);
         printk("\ndynamic relocation...");

         for (walk = (ucell *) dict; walk < (ucell *) (dict + dicthead);
              walk++) {
                 int pos, bit, l;
                 l=(walk-(ucell *)dict);
                 if (reloc_table[pos]&target_ucell(1UL<<bit)) {
                         // printk("%lx, pos %x, bit %d\n",*walk, pos, bit);

         printk(" done.\n");

==== cut ====

Stepping through with the debugger, l appears to be a count of the 
number of words from the beginning of the dictionary, pos is set to 
either 0 or 1 depending upon whether the word offset is a multiple of 
the target word size and bit is a modulo of l, again based upon the word 

It looks as if bit is being used to set up a shifting bit mask up to the 
word size in bits, and it is based upon the interaction of this and 
reloc_table[pos] which decides whether any code is moved.

Can anyone shed any light on exactly what this code does, and how it 
actually does it? The part that confuses me the most is that decisions 
are being made on which words to relocate, but these criteria are based 
upon some strange combination of arithmetic involving the current offset 
and the target word size.

Many thanks,


Mark Cave-Ayland
Sirius Corporation - The Open Source Experts
T: +44 870 608 0063

More information about the OpenBIOS mailing list