[OpenBIOS] [PATCH] Adds filll word to dictionary

Programmingkid programmingkidx at gmail.com
Sun Dec 2 19:12:21 CET 2012


On Nov 24, 2012, at 1:08 PM, Mark Cave-Ayland wrote:

> On 20/11/12 03:35, Programmingkid wrote:
> 
>> The filll word fills a region of memory with a 4 byte value. This word is different from fill because fill is used to fill a region of memory with a 1 byte value.
>> 
>> This word is needed by bootx to boot Mac OS X.
>> 
>> Here are some test results comparing Apple's implementation to mine.
>> 
>> Apple's implementation:
>> 
>> 0>  100 buffer: mybuffer  ok
>> 0>  mybuffer 100 87654321 filll  ok
>> 0>  mybuffer 100 dump
>> ffbc8800: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8810: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8820: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8830: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8840: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8850: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8860: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8870: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8880: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc8890: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc88a0: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc88b0: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc88c0: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc88d0: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc88e0: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> ffbc88f0: 87 65 43 21 87 65 43 21 87 65 43 21 87 65 43 21 |.eC!.eC!.eC!.eC!|
>> 
>> 
>> 
>> My patch:
>> 
>> 0>  mybuffer 100 87654321 filll   ok
>> 0>  mybuffer 100 dump
>> fff771e0  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff771f0  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77200  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77210  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77220  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77230  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77240  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77250  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77260  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77270  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77280  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff77290  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff772a0  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff772b0  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff772c0  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> fff772d0  87 65 43 21 87 65 43 21  87 65 43 21 87 65 43 21    ?eC!?eC!?eC!?eC!
>> 
>> 
>> The results are the same. This indicates the patch will work.
>> 
>> After I applied this patch, bootx continued booting a little further than before.
>> 
>> 
>> signed-off-by: John Arbuckle<programmingkidx at gmail.com>
>> 
>> Index: kernel/bootstrap.c
>> ===================================================================
>> --- kernel/bootstrap.c	(revision 1067)
>> +++ kernel/bootstrap.c	(working copy)
>> @@ -89,7 +89,7 @@
>>  	"here", "here!", "dobranch", "do?branch", "unaligned-w@",
>>  	"unaligned-w!", "unaligned-l@", "unaligned-l!", "ioc@", "iow@",
>>  	"iol@", "ioc!", "iow!", "iol!", "i", "j", "call", "sys-debug",
>> -	"$include", "$encode-file", "(debug", "(debug-off)"
>> +	"$include", "$encode-file", "(debug", "(debug-off)", "filll"
>>  };
>> 
>>  /*
>> Index: kernel/forth.c
>> ===================================================================
>> --- kernel/forth.c	(revision 1067)
>> +++ kernel/forth.c	(working copy)
>> @@ -1611,6 +1611,24 @@
>>  }
>> 
>> 
>> +// filll  ( addr len long-number -- )
>> +
>> +static void filll(void)
>> +{
>> +   int * location;
>> +   int length, fillNumber, index;
>> +
>> +   fillNumber = POP();
>> +   length = POP();
>> +   location = (int *) POP();
>> +
>> +   for(index = 0; index<= length; index++)
>> +   {
>> +      location[index] = fillNumber;
>> +   }
>> +}
>> +
>> +
>>  /*
>>   *  unaligned-w@  ( addr -- w )
>>   */
>> @@ -1963,4 +1981,5 @@
>>      do_encode_file,         /* $encode-file */
>>      do_debug_xt,            /* (debug  */
>>      do_debug_off,           /* (debug-off) */
>> +    filll,                  /* filll   */
>>  };
>> 
>> 
> 
> I can see that the patch works, but in order to commit it I'd like to see the following changes:
> 
> 1) Move the filll C function somewhere under arch/ppc/qemu/ and use bind_func() somewhere in an initialiser to "hook" it into Forth. This is to ensure that we keep the non-IEEE standard words separate from the core project.

I don't see any advantage to doing this. Is there a filll (3 l's) word on any other platform? 

Is this how the bind_func call would look like:  bind_func("filll", filll); ? Where should I place this call?

> 
> 2) Make the method for filling the memory work better on other architectures. The problem with the above is that you're assuming that sizeof(int) == 4 which may not always be the case (think PPC64). Take a look at lstore() in kernel/forth.c to see how this should be done in a multi-arch friendly way for 32-bit values.

Sounds like a good suggestion.


More information about the OpenBIOS mailing list