[ros-diffs] [arty] 24390: - Create a slab that contains the last vestage of our life as the boot program. - Include a font containing some characters we can use with boot video. - Copy in a description of the boot framebuffer. - Add a small ad-hoc number writing function. - Display our progress building the initial page table. - We don't necessarily have space in the boot-time page table so just kill off boot-time paging. - Pass ntoskrnl the address of the boot slab. It contains the boot font, a description of the boot video device and all active page table entries. - Next, well be able to use this in early ntoskrnl space to display our progress etc. Since we're using phyiscal addresses to write to the boot framebuffer, the page table needn't include it. This simplifies things compared to linux, but it's expensive.

arty at svn.reactos.org arty at svn.reactos.org
Wed Oct 4 10:10:02 CEST 2006


Author: arty
Date: Wed Oct  4 12:10:01 2006
New Revision: 24390

URL: http://svn.reactos.org/svn/reactos?rev=24390&view=rev
Log:
- Create a slab that contains the last vestage of our life as the boot program.
- Include a font containing some characters we can use with boot video.
- Copy in a description of the boot framebuffer.
- Add a small ad-hoc number writing function.
- Display our progress building the initial page table.
- We don't necessarily have space in the boot-time page table so just kill
  off boot-time paging.
- Pass ntoskrnl the address of the boot slab.  It contains the boot font, a
  description of the boot video device and all active page table entries.
- Next, well be able to use this in early ntoskrnl space to display our 
  progress etc.  Since we're using phyiscal addresses to write to the boot
  framebuffer, the page table needn't include it.  This simplifies things
  compared to linux, but it's expensive.

Modified:
    branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s
    branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h
    branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
    branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mboot.c
    branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c
    branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.h
    branches/powerpc/reactos/include/reactos/ppcboot.h

Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s
URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s?rev=24390&r1=24389&r2=24390&view=diff
==============================================================================
--- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s (original)
+++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/boot.s Wed Oct  4 12:10:01 2006
@@ -1,3 +1,8 @@
 	.extern PpcInit
 _start:
 	b	PpcInit
+
+	.globl _bss
+	.section ".bss"
+_bss:
+	.long	0

Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h
URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h?rev=24390&r1=24389&r2=24390&view=diff
==============================================================================
--- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h (original)
+++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h Wed Oct  4 12:10:01 2006
@@ -103,6 +103,107 @@
 void *ioremap(__u32 phys, __u32 size);
 void iounmap(void *logical);
 
+font_char BootDigits[16] = {
+    " XXXXX  "
+    "X     X "
+    "X  x  X "
+    "X  X  X "
+    "X     X "
+    " XXXXX  "
+    "        ",
+    "   XX   "
+    "  XXX   "
+    "   XX   "
+    "   XX   "
+    "   XX   "
+    "   XX   "
+    "        ",
+    "  XXXX  "
+    " X    X "
+    "     XX "
+    "   XX   "
+    " XX     "
+    " XXXXXX "
+    "        ",
+    "  XXXX  "
+    " X    X "
+    "    XX  "
+    "      X "
+    " X    X "
+    "  XXXX  "
+    "        ",
+    " X   X  "
+    " X   X  "
+    " XXXXXX "
+    "     X  "
+    "     X  "
+    "     X  "
+    "        ",
+    " XXXXXX "
+    " X      "
+    " XXXXX  "
+    "      X "
+    "      X "
+    " XXXXX  "
+    "        ",
+    "  XXXXX "
+    " X      "
+    " XXXXX  "
+    " X    X "
+    " X    X "
+    "  XXXX  "
+    "        ",
+    " XXXXXX "
+    "     XX "
+    "    XX  "
+    "  XXXXX "
+    "   XX   "
+    "   XX   "
+    "        ",
+    "  XXXX  "
+    " X    X "
+    "  XXXX  "
+    " X    X "
+    " X    X "
+    "  XXXX  "
+    "        ",
+    "  XXXX  "
+    " X    X "
+    " XXXXXX "
+    " X    X "
+    " X    X "
+    " X    X "
+    "        ",
+    " XXXXX  "
+    " X    X "
+    " XXXXX  "
+    " X    X "
+    " X    X "
+    " XXXXX  "
+    "        ",
+    "  XXXX  "
+    " X    X "
+    " X      "
+    " X      "
+    " X    X "
+    "  XXXX  "
+    "        ",
+    " XXXXXX "
+    " X      "
+    " XXXX   "
+    " X      "
+    " X      "
+    " XXXXXX "
+    "        ",
+    " XXXXXX "
+    " X      "
+    " XXXX   "
+    " X      "
+    " X      "
+    " X      "
+    "        "
+};
+
 __u32 GetPVR();
 
 #endif/*_FREELDR_ARCH_COMPAT_H*/

Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c
URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c?rev=24390&r1=24389&r2=24390&view=diff
==============================================================================
--- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c (original)
+++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mach.c Wed Oct  4 12:10:01 2006
@@ -28,7 +28,7 @@
 extern ULONG CacheSizeLimit;
 of_proxy ofproxy;
 void *PageDirectoryStart, *PageDirectoryEnd;
-static int chosen_package, stdin_handle, part_handle = -1;
+static int chosen_package, stdin_handle, part_handle = -1, kernel_mem = 0;
 BOOLEAN AcpiPresent = FALSE;
 char BootPath[0x100] = { 0 }, BootPart[0x100] = { 0 }, CmdLine[0x100] = { 0 };
 jmp_buf jmp;
@@ -340,10 +340,20 @@
 	       (int)BiosMemoryMap[slots].BaseAddress,
 	       (int)BiosMemoryMap[slots].Length);
 
-	if( BiosMemoryMap[slots].Length &&
+	/* Hack for pearpc */
+	if( kernel_mem ) {
+	    BiosMemoryMap[slots].Length = kernel_mem * 1024;
 	    ofw_claim((int)BiosMemoryMap[slots].BaseAddress,
 		      (int)BiosMemoryMap[slots].Length,
-		      0x1000) ) {
+		      0x1000);
+	    total += BiosMemoryMap[slots].Length;
+	    slots++;
+	    break;
+	/* Normal way */
+	} else if( BiosMemoryMap[slots].Length &&
+		   ofw_claim((int)BiosMemoryMap[slots].BaseAddress,
+			     (int)BiosMemoryMap[slots].Length,
+			     0x1000) ) {
 	    total += BiosMemoryMap[slots].Length;
 	    slots++;
 	}
@@ -555,10 +565,10 @@
     len = ofw_getprop(chosen_package, "bootargs",
 		      CmdLine, sizeof(CmdLine));
 
-    printf("bootargs: len %d\n", len);
-
     if( len < 0 ) len = 0;
     CmdLine[len] = 0;
+
+    printf("bootargs: len %d [%s]\n", len, CmdLine);
 
     BootMain( CmdLine );
 }
@@ -572,15 +582,19 @@
 
     printf( "Determining boot device: [%s]\n", CmdLine );
 
-    printf( "Boot Args: %s\n", CmdLine );
     sep = NULL;
     for( i = 0; i < strlen(CmdLine); i++ ) {
 	if( strncmp(CmdLine + i, "boot=", 5) == 0) {
 	    strcpy(BootPart, CmdLine + i + 5);
-	    sep = strchr(BootPart, ' ');
+	    sep = strchr(BootPart, ',');
 	    if( sep )
 		*sep = 0;
-	    break;
+	    while(CmdLine[i] && CmdLine[i]!=',') i++;
+	}
+	if( strncmp(CmdLine + i, "mem=", 4) == 0) {
+	    kernel_mem = atoi(CmdLine+i+4);
+	    printf("Allocate %dk kernel memory\n", kernel_mem);
+	    while(CmdLine[i] && CmdLine[i]!=',') i++;
 	}
     }
 

Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mboot.c
URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mboot.c?rev=24390&r1=24389&r2=24390&view=diff
==============================================================================
--- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mboot.c (original)
+++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mboot.c Wed Oct  4 12:10:01 2006
@@ -20,12 +20,15 @@
 
 #include <freeldr.h>
 #include <of_call.h>
+#include "ppcboot.h"
 #include "mmu.h"
+#include "compat.h"
 
 #define NDEBUG
 #include <debug.h>
 
 static PVOID KernelMemory = 0;
+extern boot_infos_t BootInfo;
 
 /* Bits to shift to convert a Virtual Address into an Offset in the Page Table */
 #define PFN_SHIFT 12
@@ -108,25 +111,96 @@
 typedef void (*KernelEntryFn)( void * );
 
 VOID
+DrawDigit(boot_infos_t *BootInfo, ULONG Digit, int x, int y)
+{
+    int i,j,k;
+
+    for( i = 0; i < 7; i++ ) {
+	for( j = 0; j < 8; j++ ) {
+	    for( k = 0; k < BootInfo->dispDeviceDepth/8; k++ ) {
+		SetPhysByte(((ULONG_PTR)BootInfo->dispDeviceBase)+
+			    k +
+			    (((j+x) * (BootInfo->dispDeviceDepth/8)) +
+			     ((i+y) * (BootInfo->dispDeviceRowBytes))),
+			    BootInfo->dispFont[Digit][i*8+j] == ' ' ? 0 : 255);
+	    }
+	}
+    }
+}
+
+VOID
+DrawNumber(boot_infos_t *BootInfo, ULONG Number, int x, int y)
+{
+    int i;
+
+    for( i = 0; i < 8; i++, Number<<=4 ) {
+	DrawDigit(BootInfo,(Number>>28)&0xf,x+(i*8),y);
+    }
+}
+
+VOID
 NTAPI
 FrLdrStartup(ULONG Magic)
 {
     KernelEntryFn KernelEntryAddress = 
 	(KernelEntryFn)(KernelEntry + KernelBase);
-    ULONG_PTR PhysAddr, i;
-
-    for( i = 0; i < KernelMemorySize; i+=1<<PFN_SHIFT ) 
+    register ULONG_PTR i asm("r4"), j asm("r5");
+    UINT NeededPTE = ((UINT)KernelMemory) >> PFN_SHIFT;
+    UINT NeededMemory = 
+	(2 * sizeof(ULONG_PTR) * (NeededPTE + NeededPTE / 512)) + 
+	sizeof(BootInfo) + sizeof(BootDigits);
+    UINT NeededPages = ROUND_UP(NeededMemory,(1<<PFN_SHIFT));
+    register PULONG_PTR TranslationMap asm("r6") = 
+	MmAllocateMemory(NeededMemory);
+    boot_infos_t *LocalBootInfo = (boot_infos_t *)TranslationMap;
+    TranslationMap = (PULONG_PTR)
+	(((PCHAR)&LocalBootInfo[1]) + sizeof(BootDigits));
+    memcpy(&LocalBootInfo[1], BootDigits, sizeof(BootDigits));
+    *LocalBootInfo = BootInfo;
+    LocalBootInfo->dispFont = (font_char *)&LocalBootInfo[1];
+    
+    TranslationMap[0] = (ULONG_PTR)FrLdrStartup;
+    for( i = 1; i < NeededPages; i++ )
     {
-	PhysAddr = PpcVirt2phys((ULONG)KernelMemory + i,0);
-
-	if( !InsertPageEntry(KernelBase + i,PhysAddr) ) 
-	{
-	    printf("Foo: couldn't find a page slot for %x\n", i);
-	    while(1);
-	}
-    }
-
-    KernelEntryAddress( (void*)Magic );
+	TranslationMap[i*2] = NeededMemory+(i<<PFN_SHIFT);
+    }
+
+    for( j = 0; j < KernelMemorySize>>PFN_SHIFT; j++ )
+    {
+	TranslationMap[(i+j)*2] = ((UINT)(KernelMemory+(i<<PFN_SHIFT)));
+    }
+
+    for( i = 0; i < j; i++ ) 
+    {
+	TranslationMap[(i*2)+1] = PpcVirt2phys(TranslationMap[i*2],0);
+    }
+
+    printf("Built map of %d pages\n", j);
+
+    /* 
+     * Stuff page table entries for the page containing this code,
+     * The pages containing the page table entries, and finally the kernel
+     * pages.
+     * 
+     * When done, we'll be able to flop over to kernel land! 
+     */
+    for( i = 0; i < j; i++ )
+    {
+	DrawNumber(LocalBootInfo,i,10,90);
+	DrawNumber(LocalBootInfo,TranslationMap[i*2],10,100);
+	DrawNumber(LocalBootInfo,TranslationMap[i*2+1],10,110);
+
+	InsertPageEntry
+	    (TranslationMap[i*2],
+	     TranslationMap[(i*2)+1],
+	     (i>>10));
+    }
+
+    /* Tell them we're booting */
+    DrawNumber(LocalBootInfo,0x1cabba9e,10,120);
+    DrawNumber(LocalBootInfo,(ULONG)KernelEntryAddress,100,120);
+
+    KernelEntryAddress( (void*)LocalBootInfo );
     while(1);
 }
 

Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c
URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c?rev=24390&r1=24389&r2=24390&view=diff
==============================================================================
--- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c (original)
+++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.c Wed Oct  4 12:10:01 2006
@@ -293,7 +293,7 @@
 }
 
 /* Add a new page table entry for the indicated mapping */
-BOOLEAN InsertPageEntry( int virt, int phys ) {
+BOOLEAN InsertPageEntry( int virt, int phys, int slot ) {
     int i, ptehi, ptelo;
     int sdr1 = GetSDR1();
     int sr = GetSR( (virt >> 28) & 0xf );
@@ -307,7 +307,7 @@
     for( i = 0; i < 8; i++ ) {
 	ptehi = GetPhys( ptegaddr + (i * 8) );
 	
-	if( ptehi & 0x80000000 ) continue;
+	if( (slot != i) && (ptehi & 0x80000000) ) continue;
 
 	ptehi = (1 << 31) | (vsid << 7) | ((virt >> 22) & 0x3f);
 	ptelo = phys & ~0xfff;

Modified: branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.h
URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.h?rev=24390&r1=24389&r2=24390&view=diff
==============================================================================
--- branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.h (original)
+++ branches/powerpc/reactos/boot/freeldr/freeldr/arch/powerpc/mmu.h Wed Oct  4 12:10:01 2006
@@ -14,6 +14,6 @@
 int BatTranslate( int bath, int batl, int virt );
 /* translate address */
 int PpcVirt2phys( int virt, int inst );
-BOOLEAN InsertPageEntry( int virt, int phys );
+BOOLEAN InsertPageEntry( int virt, int phys, int slot );
 
 #endif/*FREELDR_MMU_H*/

Modified: branches/powerpc/reactos/include/reactos/ppcboot.h
URL: http://svn.reactos.org/svn/reactos/branches/powerpc/reactos/include/reactos/ppcboot.h?rev=24390&r1=24389&r2=24390&view=diff
==============================================================================
--- branches/powerpc/reactos/include/reactos/ppcboot.h (original)
+++ branches/powerpc/reactos/include/reactos/ppcboot.h Wed Oct  4 12:10:01 2006
@@ -1,11 +1,13 @@
 #ifndef REACTOS_PPCBOOT_H
 #define REACTOS_PPCBOOT_H
 
+typedef char font_char[57];
 typedef struct _boot_infos_t {
     int dispDeviceRect[4];
     int dispDeviceRowBytes;
     int dispDeviceDepth;
     void *dispDeviceBase;
+    font_char *dispFont;
 } boot_infos_t;
 
 #endif/*REACTOS_PPCBOOT_H*/




More information about the Ros-diffs mailing list