Author: arty Date: Tue Apr 17 15:22:30 2007 New Revision: 26369
URL: http://svn.reactos.org/svn/reactos?rev=26369&view=rev Log: Add the ability to load freeldr in qemu-system-ppc for the first time. Use '-append bootprep' to force prep mode (not great yet).
Added: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep.c branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep.h branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep_ide.c branches/powerpc/reactos/tools/ppc.lost+found/bootcd (with props) branches/powerpc/reactos/tools/ppc.lost+found/ofboot.b Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c branches/powerpc/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild branches/powerpc/reactos/tools/ppc.lost+found/link-freeldr
Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/fre... ============================================================================== --- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s (original) +++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s Tue Apr 17 15:22:30 2007 @@ -16,17 +16,25 @@ stw %r5,ofw_call_addr@l(%r10)
bl zero_registers - + /* Zero CTR */ mtcr %r31
lis %r3,PpcInit@ha addi %r3,%r3,PpcInit@l mtlr %r3 - + + /* Check for ofw */ + lis %r3,ofw_call_addr@ha + lwz %r3,ofw_call_addr@l(%r3) + cmpw %r3,%r31 /* Zero? */ + mr %r3,%r31 + beq bootme + lis %r3,call_ofw@ha addi %r3,%r3,call_ofw@l
+bootme: blr
zero_registers:
Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/fre... ============================================================================== --- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c (original) +++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c Tue Apr 17 15:22:30 2007 @@ -21,6 +21,7 @@ #include "of.h" #include "mmu.h" #include "ppcboot.h" +#include "prep.h" #include "compat.h"
extern void BootMain( LPSTR CmdLine ); @@ -32,12 +33,12 @@ part_handle = -1, kernel_mem = 0; int mmu_handle = 0, FixedMemory = 0; BOOLEAN AcpiPresent = FALSE; -char BootPath[0x100] = { 0 }, BootPart[0x100] = { 0 }, CmdLine[0x100] = { 0 }; +char BootPath[0x100] = { 0 }, BootPart[0x100] = { 0 }, CmdLine[0x100] = { "bootprep" }; jmp_buf jmp; volatile char *video_mem = 0; boot_infos_t BootInfo;
-void PpcPutChar( int ch ) { +void PpcOfwPutChar( int ch ) { char buf[3]; if( ch == 0x0a ) { buf[0] = 0x0d; buf[1] = 0x0a; } else { buf[0] = ch; buf[1] = 0; } @@ -64,7 +65,7 @@
if( !nth && match ) return parent;
- for( i = 0; i < depth; i++ ) PpcPutChar( ' ' ); + for( i = 0; i < depth; i++ ) PpcOfwPutChar( ' ' );
if( depth == 1 ) { if( gotname > 0 ) { @@ -97,17 +98,14 @@ }
VOID PpcVideoGetDisplaySize( PULONG Width, PULONG Height, PULONG Depth ) { - //ofw_print_string("GetDisplaySize\n"); *Width = 80; *Height = 25; *Depth = 16; - //printf("GetDisplaySize(%d,%d,%d)\n", *Width, *Height, *Depth); }
ULONG PpcVideoGetBufferSize() { ULONG Width, Height, Depth; - //ofw_print_string("PpcVideoGetBufferSize\n"); - PpcVideoGetDisplaySize( &Width, &Height, &Depth ); + MachVideoGetDisplaySize( &Width, &Height, &Depth ); return Width * Height * Depth / 8; }
@@ -137,14 +135,14 @@ PCHAR ChBuf = Buffer; int offset = 0;
- PpcVideoGetDisplaySize( &w, &h, &d ); + MachVideoGetDisplaySize( &w, &h, &d );
for( i = 0; i < h; i++ ) { for( j = 0; j < w; j++ ) { offset = (j * 2) + (i * w * 2); if( ChBuf[offset] != video_mem[offset] ) { video_mem[offset] = ChBuf[offset]; - PpcVideoPutChar(ChBuf[offset],0,j+1,i+1); + MachVideoPutChar(ChBuf[offset],0,j+1,i+1); } } } @@ -380,7 +378,7 @@ RemainingPath[0] = 0; } *Device = 0; - return PpcDiskGetBootVolume(DriveNumber, StartSector, SectorCount, FsType); + return MachDiskGetBootVolume(DriveNumber, StartSector, SectorCount, FsType); }
BOOLEAN PpcDiskGetBootPath( char *OutBootPath, unsigned Size ) { @@ -493,14 +491,15 @@
extern int _bss; typedef unsigned int uint32_t; -void PpcInit( of_proxy the_ofproxy ) { - int len; - ofproxy = the_ofproxy; - + +void PpcOfwInit() +{ //SetPhys(0x900, (19 << 26) | (50 << 1));
chosen_package = ofw_finddevice( "/chosen" );
+ ofw_getprop(chosen_package, "bootargs", + CmdLine, sizeof(CmdLine)); ofw_getprop( chosen_package, "stdin", (char *)&stdin_handle, sizeof(stdin_handle) ); ofw_getprop( chosen_package, "stdout", @@ -508,7 +507,7 @@ ofw_getprop( chosen_package, "mmu", (char *)&mmu_handle, sizeof(mmu_handle) );
- MachVtbl.ConsPutChar = PpcPutChar; + MachVtbl.ConsPutChar = PpcOfwPutChar; MachVtbl.ConsKbHit = PpcConsKbHit; MachVtbl.ConsGetCh = PpcConsGetCh;
@@ -549,21 +548,27 @@
MachVtbl.HwDetect = PpcHwDetect;
+ // Allow forcing prep for broken OFW + if(!strncmp(CmdLine, "bootprep", 8)) + { + printf("Going to PREP init...\n"); + PpcPrepInit(); + return; + } + printf( "FreeLDR version [%s]\n", GetFreeLoaderVersionString() );
- len = ofw_getprop(chosen_package, "bootargs", - CmdLine, sizeof(CmdLine)); - - if( len < 0 ) len = 0; - CmdLine[len] = 0; - - printf("bootargs: len %d [%s]\n", len, CmdLine); - BootMain( CmdLine ); }
+void PpcInit( of_proxy the_ofproxy ) { + ofproxy = the_ofproxy; + if(ofproxy) PpcOfwInit(); + else PpcPrepInit(); +} + void MachInit(const char *CmdLine) { - int len, i; + int i, len; char *sep;
BootPart[0] = 0;
Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/fre... ============================================================================== --- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c (original) +++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c Tue Apr 17 15:22:30 2007 @@ -32,6 +32,44 @@ "blr" );
+__asm__("\t.globl GetPhysHalf\n" + "GetPhysHalf:\t\n" + "mflr 0\n\t" + "stwu 0,-16(1)\n\t" + "mfmsr 5\n\t" + "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ + "mtmsr 6\n\t" + "isync\n\t" + "sync\n\t" + "lhz 3,0(3)\n\t" /* Get actual value at phys addr r3 */ + "mtmsr 5\n\t" + "isync\n\t" + "sync\n\t" + "lwz 0,0(1)\n\t" + "addi 1,1,16\n\t" + "mtlr 0\n\t" + "blr" + ); + +__asm__("\t.globl GetPhysByte\n" + "GetPhysByte:\t\n" + "mflr 0\n\t" + "stwu 0,-16(1)\n\t" + "mfmsr 5\n\t" + "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ + "mtmsr 6\n\t" + "isync\n\t" + "sync\n\t" + "lbz 3,0(3)\n\t" /* Get actual value at phys addr r3 */ + "mtmsr 5\n\t" + "isync\n\t" + "sync\n\t" + "lwz 0,0(1)\n\t" + "addi 1,1,16\n\t" + "mtlr 0\n\t" + "blr" + ); + __asm__("\t.globl SetPhys\n" "SetPhys:\t\n" "mflr 0\n\t" @@ -42,6 +80,27 @@ "sync\n\t" "eieio\n\t" "stw 4,0(3)\n\t" /* Set actual value at phys addr r3 */ + "dcbst 0,3\n\t" + "mtmsr 5\n\t" + "sync\n\t" + "eieio\n\t" + "mr 3,4\n\t" + "lwz 0,0(1)\n\t" + "addi 1,1,16\n\t" + "mtlr 0\n\t" + "blr" + ); + +__asm__("\t.globl SetPhysHalf\n" + "SetPhysHalf:\t\n" + "mflr 0\n\t" + "stwu 0,-16(1)\n\t" + "mfmsr 5\n\t" + "andi. 6,5,0xffef\n\t"/* turn off MSR[DR] */ + "mtmsr 6\n\t" + "sync\n\t" + "eieio\n\t" + "sth 4,0(3)\n\t" /* Set actual value at phys addr r3 */ "dcbst 0,3\n\t" "mtmsr 5\n\t" "sync\n\t"
Added: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep.c URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/fre... ============================================================================== --- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep.c (added) +++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep.c Tue Apr 17 15:22:30 2007 @@ -1,0 +1,101 @@ +#include "freeldr.h" +#include "machine.h" +#include "mmu.h" +#include "prep.h" + +int prep_serial = 0x800003f8; + +void sync() { __asm__("sync\n\teieio"); } + +/* Simple serial */ + +void PpcPrepPutChar( int ch ) { + if( ch == 0x0a ) { + SetPhysByte(prep_serial, 0x0d); + sync(); + } + SetPhysByte(prep_serial, ch); + sync(); +} + +BOOLEAN PpcPrepDiskReadLogicalSectors +( ULONG DriveNumber, ULONGLONG SectorNumber, + ULONG SectorCount, PVOID Buffer ) { + int secct; + + for(secct = 0; secct < SectorCount; secct++) + { + ide_seek(&ide1_desc, SectorNumber + secct, 0); + ide_read(&ide1_desc, ((PCHAR)Buffer) + secct * 512, 512); + } + /* Never give up! */ + return TRUE; +} + +BOOLEAN PpcPrepConsKbHit() +{ + return GetPhysByte(prep_serial+5) & 1; +} + +int PpcPrepConsGetCh() +{ + while(!PpcPrepConsKbHit()); + return GetPhysByte(prep_serial); +} + +void PpcPrepVideoClearScreen(UCHAR Attr) +{ + printf("\033c"); +} + +VIDEODISPLAYMODE PpcPrepVideoSetDisplayMode( char *DisplayMode, BOOLEAN Init ) +{ + return VideoTextMode; +} + +void PpcPrepVideoGetDisplaySize( PULONG Width, PULONG Height, PULONG Depth ) +{ + *Width = 80; + *Height = 25; + *Depth = 16; +} + +void PpcPrepVideoPrepareForReactOS() +{ +} + +ULONG PpcPrepGetMemoryMap( PBIOS_MEMORY_MAP BiosMemoryMap, + ULONG MaxMemoryMapSize ) +{ + // xxx fixme + BiosMemoryMap[0].Type = 1; + BiosMemoryMap[0].BaseAddress = 0; + BiosMemoryMap[0].Length = 64 * 1024 * 1024; + return 1; +} + +void PpcPrepInit() +{ + MachVtbl.ConsPutChar = PpcPrepPutChar; + printf("Breathing ...\n"); + + ide_setup( &ide1_desc ); + + MachVtbl.DiskReadLogicalSectors = PpcPrepDiskReadLogicalSectors; + + MachVtbl.ConsKbHit = PpcPrepConsKbHit; + MachVtbl.ConsGetCh = PpcPrepConsGetCh; + + MachVtbl.VideoClearScreen = PpcPrepVideoClearScreen; + MachVtbl.VideoSetDisplayMode = PpcPrepVideoSetDisplayMode; + MachVtbl.VideoGetDisplaySize = PpcPrepVideoGetDisplaySize; + + MachVtbl.VideoPrepareForReactOS = PpcPrepVideoPrepareForReactOS; + + MachVtbl.GetMemoryMap = PpcPrepGetMemoryMap; + + printf( "FreeLDR version [%s]\n", GetFreeLoaderVersionString() ); + + BootMain( "" ); +} +
Added: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep.h URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/fre... ============================================================================== --- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep.h (added) +++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep.h Tue Apr 17 15:22:30 2007 @@ -1,0 +1,12 @@ +#ifndef FREELDR_ARCH_POWERPC_PREP_H +#define FREELDR_ARCH_POWERPC_PREP_H + +extern struct _idectl_desc ide1_desc; + +void sync(); +void PpcPrepInit(); +void ide_seek( void *extension, int low, int high ); +void ide_read( void *extension, char *buffer, int bytes ); +void ide_setup( void *extension ); + +#endif//FREELDR_ARCH_POWERPC_PREP_H
Added: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep_ide.c URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/fre... ============================================================================== --- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep_ide.c (added) +++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/prep_ide.c Tue Apr 17 15:22:30 2007 @@ -1,0 +1,99 @@ +#include "freeldr.h" +#include "machine.h" +#include "mmu.h" +#include "prep.h" + +#define SWAP_W(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff)) + +typedef struct _idectl_desc { + int port; + long long seekto; + int seek_cylinder, seek_head, seek_sector; + int cylinders, heads, sectors, bytespersec; +} idectl_desc; + +idectl_desc ide1_desc = { 0x800001f0 }; + +void ide_seek( void *extension, int low, int high ) { + idectl_desc *desc = (idectl_desc *)extension; + long long seekto = ((((long long)high) << 32) | (low & 0xffffffff)) / desc->bytespersec; + /* order = sector, head, cylinder */ + desc->seek_sector = seekto % desc->sectors; + seekto /= desc->sectors; + desc->seek_head = seekto % desc->heads; + seekto /= desc->heads; + desc->seek_cylinder = seekto; + desc->seekto = seekto; +} + +/* Thanks chuck moore. This is based on the color forth ide code */ +/* Wait for ready */ +void ide_rdy( void *extension ) { + idectl_desc *desc = (idectl_desc *)extension; + while( !(GetPhysByte(desc->port+7) & 8) ) sync(); +} + +void ide_bsy( void *extension ) { + idectl_desc *desc = (idectl_desc *)extension; + while( GetPhysByte(desc->port+7) & 0x80 ) sync(); +} + +int ide_read( void *extension, char *buffer, int bytes ) { + idectl_desc *desc = (idectl_desc *)extension; + short *databuf = (short *)buffer; + short in; + int inwords; + + ide_bsy( extension ); + SetPhysByte(desc->port+2, bytes / desc->bytespersec); + SetPhysByte(desc->port+3, desc->seek_sector + 1); + SetPhysByte(desc->port+4, desc->seek_cylinder); + SetPhysByte(desc->port+5, desc->seek_cylinder >> 8); + SetPhysByte(desc->port+6, desc->seek_head | 0xa0); + SetPhysByte(desc->port+7, 0x20); + + sync(); + + for( inwords = 0; inwords < desc->bytespersec / sizeof(short); inwords++ ) { + ide_rdy( extension ); + in = GetPhysHalf(desc->port); + databuf[inwords] = SWAP_W(in); + sync(); + } + + desc->seekto += desc->bytespersec; + ide_seek( extension, desc->seekto, desc->seekto >> 32 ); + + return bytes - (bytes % desc->bytespersec); +} + +void ide_setup( void *extension ) { + idectl_desc *desc = (idectl_desc *)extension; + short identbuffer[256]; + char namebuf[41]; + short *databuf = (short *)identbuffer, in; + int inwords; + + ide_bsy( extension ); + SetPhysByte(desc->port+7, 0xec); + desc->bytespersec = 512; + + sync(); + + for( inwords = 0; inwords < desc->bytespersec / sizeof(short); inwords++ ) { + ide_rdy( extension ); + in = GetPhysHalf(desc->port); + databuf[inwords] = SWAP_W(in); + sync(); + } + + desc->cylinders = identbuffer[1]; + desc->heads = identbuffer[3]; + desc->sectors = identbuffer[6]; + + /* Debug: Write out hard disc model */ + + strncpy(namebuf, (char *)(identbuffer+0x1b), 41); + printf("HARD DISC MODEL: %s c,h,s %d,%d,%d\n", + namebuf, desc->cylinders, desc->heads, desc->sectors); +}
Modified: branches/powerpc/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/fre... ============================================================================== --- branches/powerpc/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild (original) +++ branches/powerpc/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild Tue Apr 17 15:22:30 2007 @@ -71,6 +71,8 @@ <file>ofw.c</file> <file>mmu.c</file> <file>mach.c</file> + <file>prep.c</file> + <file>prep_ide.c</file> <file>mboot.c</file> </module> </if>
Added: branches/powerpc/reactos/tools/ppc.lost+found/bootcd URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/tools/ppc.lost%2... ============================================================================== --- branches/powerpc/reactos/tools/ppc.lost+found/bootcd (added) +++ branches/powerpc/reactos/tools/ppc.lost+found/bootcd Tue Apr 17 15:22:30 2007 @@ -1,0 +1,20 @@ +#!/bin/sh +# +# Create an iso that can be booted under qemu. +# For now, this is just to make ofwldr available to qemu. A disk image will +# still be required yet. +# + +CD=output-ppc/ppcboot +I=$CD/install + +tools/ppc.lost+found/link-freeldr + +mkdir -p $I +cp freeldr.elf $I/yaboot +cp `dirname $0`/ofboot.b $I + +mkisofs -chrp-boot -U -part -hfs -T -r -l -J -A "ReactOS" -sysid PPC \ + -V "ReactOS" -volset 1 -volset-size 1 -volset-seqno 1 \ + -hfs-volid "ReactOS" -hfs-bless $I -map hfsmap.lst \ + -no-desktop -allow-multidot -o ppcboot.iso $CD
Propchange: branches/powerpc/reactos/tools/ppc.lost+found/bootcd ------------------------------------------------------------------------------ svn:executable = *
Modified: branches/powerpc/reactos/tools/ppc.lost+found/link-freeldr URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/tools/ppc.lost%2... ============================================================================== --- branches/powerpc/reactos/tools/ppc.lost+found/link-freeldr (original) +++ branches/powerpc/reactos/tools/ppc.lost+found/link-freeldr Tue Apr 17 15:22:30 2007 @@ -53,6 +53,8 @@ obj-ppc/boot/freeldr/freeldr/arch/powerpc/ofw.o \ obj-ppc/boot/freeldr/freeldr/arch/powerpc/mmu.o \ obj-ppc/boot/freeldr/freeldr/arch/powerpc/mboot.o \ + obj-ppc/boot/freeldr/freeldr/arch/powerpc/prep.o \ + obj-ppc/boot/freeldr/freeldr/arch/powerpc/prep_ide.o \ obj-ppc/boot/freeldr/freeldr/bootmgr.o \ obj-ppc/boot/freeldr/freeldr/drivemap.o \ obj-ppc/boot/freeldr/freeldr/miscboot.o \
Added: branches/powerpc/reactos/tools/ppc.lost+found/ofboot.b URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/tools/ppc.lost%2... ============================================================================== --- branches/powerpc/reactos/tools/ppc.lost+found/ofboot.b (added) +++ branches/powerpc/reactos/tools/ppc.lost+found/ofboot.b Tue Apr 17 15:22:30 2007 @@ -1,0 +1,64 @@ +<CHRP-BOOT> +<COMPATIBLE> +MacRISC MacRISC3 MacRISC4 +</COMPATIBLE> +<DESCRIPTION> +GNU/Linux PPC bootloader +</DESCRIPTION> +<BOOT-SCRIPT> +" screen" output +load-base release-load-area +boot cd:,\install\yaboot +</BOOT-SCRIPT> +<OS-BADGE-ICONS> +1010 +000000000000F8FEACF6000000000000 +0000000000F5FFFFFEFEF50000000000 +00000000002BFAFEFAFCF70000000000 +0000000000F65D5857812B0000000000 +0000000000F5350B2F88560000000000 +0000000000F6335708F8FE0000000000 +00000000005600F600F5FD8100000000 +00000000F9F8000000F5FAFFF8000000 +000000008100F5F50000F6FEFE000000 +000000F8F700F500F50000FCFFF70000 +00000088F70000F50000F5FCFF2B0000 +0000002F582A00F5000008ADE02C0000 +00090B0A35A62B0000002D3B350A0000 +000A0A0B0B3BF60000505E0B0A0B0A00 +002E350B0B2F87FAFCF45F0B2E090000 +00000007335FF82BF72B575907000000 +000000000000ACFFFF81000000000000 +000000000081FFFFFFFF810000000000 +0000000000FBFFFFFFFFAC0000000000 +000000000081DFDFDFFFFB0000000000 +000000000081DD5F83FFFD0000000000 +000000000081DDDF5EACFF0000000000 +0000000000FDF981F981FFFF00000000 +00000000FFACF9F9F981FFFFAC000000 +00000000FFF98181F9F981FFFF000000 +000000ACACF981F981F9F9FFFFAC0000 +000000FFACF9F981F9F981FFFFFB0000 +00000083DFFBF981F9F95EFFFFFC0000 +005F5F5FDDFFFBF9F9F983DDDD5F0000 +005F5F5F5FDD81F9F9E7DF5F5F5F5F00 +0083DD5F5F83FFFFFFFFDF5F835F0000 +000000FBDDDFACFBACFBDFDFFB000000 +000000000000FFFFFFFF000000000000 +0000000000FFFFFFFFFFFF0000000000 +0000000000FFFFFFFFFFFF0000000000 +0000000000FFFFFFFFFFFF0000000000 +0000000000FFFFFFFFFFFF0000000000 +0000000000FFFFFFFFFFFF0000000000 +0000000000FFFFFFFFFFFFFF00000000 +00000000FFFFFFFFFFFFFFFFFF000000 +00000000FFFFFFFFFFFFFFFFFF000000 +000000FFFFFFFFFFFFFFFFFFFFFF0000 +000000FFFFFFFFFFFFFFFFFFFFFF0000 +000000FFFFFFFFFFFFFFFFFFFFFF0000 +00FFFFFFFFFFFFFFFFFFFFFFFFFF0000 +00FFFFFFFFFFFFFFFFFFFFFFFFFFFF00 +00FFFFFFFFFFFFFFFFFFFFFFFFFF0000 +000000FFFFFFFFFFFFFFFFFFFF000000 +</OS-BADGE-ICONS> +</CHRP-BOOT>