[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