[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