From 0b66faaabd527388578379b50e81a813705da04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Tue, 23 Nov 2004 11:28:02 +0000 Subject: [PATCH] Make transfer of control to kernel work on Xbox svn path=/trunk/; revision=11787 --- freeldr/freeldr/arch/i386/machpc.c | 3 +- freeldr/freeldr/arch/i386/machpc.h | 3 +- freeldr/freeldr/arch/i386/machxbox.c | 3 +- freeldr/freeldr/arch/i386/machxbox.h | 3 +- freeldr/freeldr/arch/i386/mb.S | 119 ++------------------------ freeldr/freeldr/arch/i386/pcvideo.c | 9 +- freeldr/freeldr/arch/i386/xboxvideo.c | 10 ++- freeldr/freeldr/include/machine.h | 4 +- freeldr/freeldr/machine.c | 11 ++- freeldr/freeldr/reactos/reactos.c | 2 +- 10 files changed, 42 insertions(+), 125 deletions(-) diff --git a/freeldr/freeldr/arch/i386/machpc.c b/freeldr/freeldr/arch/i386/machpc.c index 624a6e12b8f..2bbe6f992a9 100644 --- a/freeldr/freeldr/arch/i386/machpc.c +++ b/freeldr/freeldr/arch/i386/machpc.c @@ -1,4 +1,4 @@ -/* $Id: machpc.c,v 1.5 2004/11/14 22:04:38 gvg Exp $ +/* $Id: machpc.c,v 1.6 2004/11/23 11:28:02 gvg Exp $ * * FreeLoader * @@ -46,6 +46,7 @@ PcMachInit(VOID) MachVtbl.VideoSetPaletteColor = PcVideoSetPaletteColor; MachVtbl.VideoGetPaletteColor = PcVideoGetPaletteColor; MachVtbl.VideoSync = PcVideoSync; + MachVtbl.VideoPrepareForReactOS = PcVideoPrepareForReactOS; MachVtbl.GetMemoryMap = PcMemGetMemoryMap; MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors; MachVtbl.DiskGetPartitionEntry = PcDiskGetPartitionEntry; diff --git a/freeldr/freeldr/arch/i386/machpc.h b/freeldr/freeldr/arch/i386/machpc.h index 5be6d435399..5754194571f 100644 --- a/freeldr/freeldr/arch/i386/machpc.h +++ b/freeldr/freeldr/arch/i386/machpc.h @@ -1,4 +1,4 @@ -/* $Id: machpc.h,v 1.5 2004/11/14 22:04:38 gvg Exp $ +/* $Id: machpc.h,v 1.6 2004/11/23 11:28:02 gvg Exp $ * * FreeLoader * @@ -44,6 +44,7 @@ BOOL PcVideoIsPaletteFixed(VOID); VOID PcVideoSetPaletteColor(U8 Color, U8 Red, U8 Green, U8 Blue); VOID PcVideoGetPaletteColor(U8 Color, U8* Red, U8* Green, U8* Blue); VOID PcVideoSync(VOID); +VOID PcVideoPrepareForReactOS(VOID); U32 PcMemGetMemoryMap(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize); diff --git a/freeldr/freeldr/arch/i386/machxbox.c b/freeldr/freeldr/arch/i386/machxbox.c index 6f584ab250f..3e75f49097c 100644 --- a/freeldr/freeldr/arch/i386/machxbox.c +++ b/freeldr/freeldr/arch/i386/machxbox.c @@ -1,4 +1,4 @@ -/* $Id: machxbox.c,v 1.5 2004/11/14 22:04:38 gvg Exp $ +/* $Id: machxbox.c,v 1.6 2004/11/23 11:28:02 gvg Exp $ * * FreeLoader * @@ -44,6 +44,7 @@ XboxMachInit(VOID) MachVtbl.VideoSetPaletteColor = XboxVideoSetPaletteColor; MachVtbl.VideoGetPaletteColor = XboxVideoGetPaletteColor; MachVtbl.VideoSync = XboxVideoSync; + MachVtbl.VideoPrepareForReactOS = XboxVideoPrepareForReactOS; MachVtbl.GetMemoryMap = XboxMemGetMemoryMap; MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors; MachVtbl.DiskGetPartitionEntry = XboxDiskGetPartitionEntry; diff --git a/freeldr/freeldr/arch/i386/machxbox.h b/freeldr/freeldr/arch/i386/machxbox.h index d570f2f54a7..e52c7128e9a 100644 --- a/freeldr/freeldr/arch/i386/machxbox.h +++ b/freeldr/freeldr/arch/i386/machxbox.h @@ -1,4 +1,4 @@ -/* $Id: machxbox.h,v 1.5 2004/11/14 22:04:38 gvg Exp $ +/* $Id: machxbox.h,v 1.6 2004/11/23 11:28:02 gvg Exp $ * * FreeLoader * @@ -45,6 +45,7 @@ BOOL XboxVideoIsPaletteFixed(VOID); VOID XboxVideoSetPaletteColor(U8 Color, U8 Red, U8 Green, U8 Blue); VOID XboxVideoGetPaletteColor(U8 Color, U8* Red, U8* Green, U8* Blue); VOID XboxVideoSync(VOID); +VOID XboxVideoPrepareForReactOS(VOID); VOID XboxMemInit(VOID); PVOID XboxMemReserveMemory(U32 MbToReserve); diff --git a/freeldr/freeldr/arch/i386/mb.S b/freeldr/freeldr/arch/i386/mb.S index 807e45ad76e..e77b380f4bb 100644 --- a/freeldr/freeldr/arch/i386/mb.S +++ b/freeldr/freeldr/arch/i386/mb.S @@ -25,117 +25,35 @@ #include /* - * Here we assume the kernel is loaded at 1mb - * This boots the kernel + * Here we assume the kernel is loaded at 1mb + * This boots the kernel */ .code32 EXTERN(_boot_reactos) - call switch_to_real - .code16 - - /* Save cursor position */ - movw $3,%ax //! Reset video mode - int $0x10 - - - movb $10,%bl - movb $12,%ah - int $0x10 - - movw $0x1112,%ax // Use 8x8 font - xorb %bl,%bl - int $0x10 - movw $0x1200,%ax // Use alternate print screen - movb $0x20,%bl - int $0x10 - movb $1,%ah // Define cursor (scan lines 6 to 7) - movw $0x0607,%cx - int $0x10 - - movb $1,%ah - movw $0x600,%cx - int $0x10 - - movb $6,%ah // Scroll active page up - movb $0x32,%al // Clear 25 lines - movw $0,%cx // Upper left of scroll - movw $0x314F,%dx // Lower right of scroll - movb $(1*0x00+0),%bh // Use normal attribute on blanked line - int $0x10 // Video-IO - - - movw $0,%dx - movb $0,%dh - - movb $2,%ah - movb $0,%bh - int $0x10 - - movw $0,%dx - movb $0,%dh - - movb $2,%ah - movb $0,%bh - int $0x10 + call _MachVideoPrepareForReactOS call _multi_boot // Should never get here cli +bootloop: hlt + jmp bootloop /* * After you have setup the _mb_header and _mb_info structures * then call this routine to transfer control to the kernel. - * This routine must be entered in 16-bit mode. */ - .code16 EXTERN(_multi_boot) cli - /* - * Setup various variables - */ - movw %ds,%bx - movzwl %bx,%eax - shll $4,%eax - addl %eax,kernel_gdtbase - /* * Load the absolute address of the multiboot information structure */ movl $_mb_info,%ebx - /* - * load gdt - */ - lgdt kernel_gdtptr - - /* - * Enter pmode and clear prefetch queue - */ - movl %cr0,%eax - orl $0x10001,%eax - movl %eax,%cr0 - jmp next -next: - /* - * NOTE: This must be position independant (no references to - * non absolute variables) - */ - - /* - * Initalize segment registers - */ - movw $KERNEL_DS,%ax - movw %ax,%ds - movw %ax,%ss - movw %ax,%es - movw %ax,%fs - movw %ax,%gs - /* * Initalize eflags */ @@ -155,33 +73,6 @@ next: pushl _mb_entry_addr lretl - //ljmpl $KERNEL_CS,$(0x0200000+0x1000) - //ljmpl $KERNEL_CS,(_mb_entry_addr) - //ljmpl $KERNEL_CS,$(KERNEL_BASE+0x1000) - - - .p2align 2 /* force 4-byte alignment */ -kernel_gdt: - .word 0 // Zero descriptor - .word 0 - .word 0 - .word 0 - - .word 0xffff // Kernel code descriptor - .word 0x0000 // - .word 0x9a00 // base 0h limit 4gb - .word 0x00cf - - .word 0xffff // Kernel data descriptor - .word 0x0000 // - .word 0x9200 // base 0h limit 4gb - .word 0x00cf - -kernel_gdtptr: - .word (3*8)-1 /* Limit */ -kernel_gdtbase: - .long kernel_gdt /* Base Address */ - EXTERN(_mb_header) _mb_magic: diff --git a/freeldr/freeldr/arch/i386/pcvideo.c b/freeldr/freeldr/arch/i386/pcvideo.c index 2b10daf68b8..f9fe9a0b692 100644 --- a/freeldr/freeldr/arch/i386/pcvideo.c +++ b/freeldr/freeldr/arch/i386/pcvideo.c @@ -1,4 +1,4 @@ -/* $Id: pcvideo.c,v 1.1 2004/11/14 22:04:38 gvg Exp $ +/* $Id: pcvideo.c,v 1.2 2004/11/23 11:28:02 gvg Exp $ * * FreeLoader * @@ -1106,4 +1106,11 @@ PcVideoSync(VOID) } } +VOID +PcVideoPrepareForReactOS(VOID) +{ + PcVideoSetMode80x50_80x43(); + PcVideoHideShowTextCursor(FALSE); +} + /* EOF */ diff --git a/freeldr/freeldr/arch/i386/xboxvideo.c b/freeldr/freeldr/arch/i386/xboxvideo.c index ad1278cdaea..a5c82cfe8b4 100644 --- a/freeldr/freeldr/arch/i386/xboxvideo.c +++ b/freeldr/freeldr/arch/i386/xboxvideo.c @@ -1,4 +1,4 @@ -/* $Id: xboxvideo.c,v 1.3 2004/11/14 22:04:38 gvg Exp $ +/* $Id: xboxvideo.c,v 1.4 2004/11/23 11:28:02 gvg Exp $ * * FreeLoader * @@ -35,7 +35,7 @@ static U32 Delta; #define CHAR_WIDTH 8 #define CHAR_HEIGHT 16 -#define TOP_BOTTOM_LINES 40 +#define TOP_BOTTOM_LINES 0 #define FB_SIZE_MB 4 @@ -209,4 +209,10 @@ XboxVideoSync() /* Not supported */ } +VOID +XboxVideoPrepareForReactOS(VOID) +{ + XboxVideoClearScreenColor(MAKE_COLOR(0, 0, 0), TRUE); +} + /* EOF */ diff --git a/freeldr/freeldr/include/machine.h b/freeldr/freeldr/include/machine.h index 97ab8ddd91e..8c601b93379 100644 --- a/freeldr/freeldr/include/machine.h +++ b/freeldr/freeldr/include/machine.h @@ -1,4 +1,4 @@ -/* $Id: machine.h,v 1.5 2004/11/14 22:04:39 gvg Exp $ +/* $Id: machine.h,v 1.6 2004/11/23 11:28:02 gvg Exp $ * * FreeLoader * @@ -52,6 +52,7 @@ typedef struct tagMACHVTBL VOID (*VideoSetPaletteColor)(U8 Color, U8 Red, U8 Green, U8 Blue); VOID (*VideoGetPaletteColor)(U8 Color, U8* Red, U8* Green, U8* Blue); VOID (*VideoSync)(VOID); + VOID (*VideoPrepareForReactOS)(VOID); U32 (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, U32 MaxMemoryMapSize); @@ -82,6 +83,7 @@ extern MACHVTBL MachVtbl; #define MachVideoSetPaletteColor(Col, R, G, B) MachVtbl.VideoSetPaletteColor((Col), (R), (G), (B)) #define MachVideoGetPaletteColor(Col, R, G, B) MachVtbl.VideoGetPaletteColor((Col), (R), (G), (B)) #define MachVideoSync() MachVtbl.VideoSync() +#define MachVideoPrepareForReactOS() MachVtbl.VideoPrepareForReactOS() #define MachGetMemoryMap(MMap, Size) MachVtbl.GetMemoryMap((MMap), (Size)) #define MachDiskReadLogicalSectors(Drive, Start, Count, Buf) MachVtbl.DiskReadLogicalSectors((Drive), (Start), (Count), (Buf)) #define MachDiskGetPartitionEntry(Drive, Part, Entry) MachVtbl.DiskGetPartitionEntry((Drive), (Part), (Entry)) diff --git a/freeldr/freeldr/machine.c b/freeldr/freeldr/machine.c index 4b155050cce..f8e7d302406 100644 --- a/freeldr/freeldr/machine.c +++ b/freeldr/freeldr/machine.c @@ -1,4 +1,4 @@ -/* $Id: machine.c,v 1.5 2004/11/14 22:04:38 gvg Exp $ +/* $Id: machine.c,v 1.6 2004/11/23 11:28:02 gvg Exp $ * * FreeLoader * @@ -35,6 +35,7 @@ #undef MachVideoSetPaletteColor #undef MachVideoGetPaletteColor #undef MachVideoSync +#undef MachVideoPrepareForReactOS #undef MachGetMemoryMap #undef MachDiskReadLogicalSectors #undef MachDiskGetPartitionEntry @@ -131,7 +132,13 @@ MachVideoGetPaletteColor(U8 Color, U8 *Red, U8 *Green, U8 *Blue) VOID MachVideoSync(VOID) { - return MachVtbl.VideoSync(); + MachVtbl.VideoSync(); +} + +VOID +MachVideoPrepareForReactOS(VOID) +{ + MachVtbl.VideoPrepareForReactOS(); } U32 diff --git a/freeldr/freeldr/reactos/reactos.c b/freeldr/freeldr/reactos/reactos.c index 21615f1f597..039add267f0 100644 --- a/freeldr/freeldr/reactos/reactos.c +++ b/freeldr/freeldr/reactos/reactos.c @@ -686,7 +686,7 @@ LoadAndBootReactOS(PUCHAR OperatingSystemName) rosPartition = 0; while (1) { - if (!DiskGetPartitionEntry(BootDrive, ++i, &PartitionTableEntry)) + if (!MachDiskGetPartitionEntry(BootDrive, ++i, &PartitionTableEntry)) { BootPartition = 0; break;