[OpenBIOS] [PATCH] Adds filll word to dictionary

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Sat Nov 24 19:08:09 CET 2012


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.

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.


ATB,

Mark.



More information about the OpenBIOS mailing list