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/fr…
==============================================================================
--- 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/fr…
==============================================================================
--- 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/fr…
==============================================================================
--- 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/fr…
==============================================================================
--- 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/fr…
==============================================================================
--- 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/fr…
==============================================================================
--- 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/fr…
==============================================================================
--- 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%…
==============================================================================
--- 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%…
==============================================================================
--- 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%…
==============================================================================
--- 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>