Implement exception handling for Xen Modified: branches/xen/reactos/boot/freeldr/freeldr/Makefile Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386.h Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386trap.S Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machpc.c Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machpc.h Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxbox.h Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xencons.c Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenmem.c Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenvideo.c Modified: branches/xen/reactos/boot/freeldr/freeldr/include/machine.h Modified: branches/xen/reactos/boot/freeldr/freeldr/machine.c _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/Makefile --- branches/xen/reactos/boot/freeldr/freeldr/Makefile 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/Makefile 2005-04-05 17:50:21 UTC (rev 14508) @@ -174,6 +174,7 @@
xencons.o \ xenctrlif.o \ xenmem.o \ + xenvideo.o \ _alloca.o # For Mingw32 builds
ARCH_OBJS = $(addprefix i386/,$(ARCH_I386_OBJS)) _____
Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386.h --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386.h 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386.h 2005-04-05 17:50:21 UTC (rev 14508) @@ -0,0 +1,47 @@
+/* + * FreeLoader + * + * Copyright (C) 2003 Eric Kohl + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __I386_I386_H_ +#define __I386_I386_H_ + +extern void i386DivideByZero(); +extern void i386DebugException(); +extern void i386NMIException(); +extern void i386Breakpoint(); +extern void i386Overflow(); +extern void i386BoundException(); +extern void i386InvalidOpcode(); +extern void i386FPUNotAvailable(); +extern void i386DoubleFault(); +extern void i386CoprocessorSegment(); +extern void i386InvalidTSS(); +extern void i386SegmentNotPresent(); +extern void i386StackException(); +extern void i386GeneralProtectionFault(); +extern void i386PageFault(); +extern void i386CoprocessorError(); +extern void i386AlignmentCheck(); +extern void i386MachineCheck(); + +extern void (*i386TrapSaveDRHook)(unsigned long *DRRegs); + +#endif /* __I386_I386_H_ */ + +/* EOF */ Property changes on: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386.h ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386trap.S --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386trap.S 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/i386trap.S 2005-04-05 17:50:21 UTC (rev 14508) @@ -26,59 +26,7 @@
#define SCREEN_ATTR 0x1f /* Bright white on blue background */
-.macro SAVE_CPU_REGS - movl %eax,i386_EAX - movl %ebx,i386_EBX - movl %ecx,i386_ECX - movl %edx,i386_EDX - movl %esp,i386_ESP - movl %ebp,i386_EBP - movl %esi,i386_ESI - movl %edi,i386_EDI - movw %ds,%ax - movw %ax,i386_DS - movw %es,%ax - movw %ax,i386_ES - movw %fs,%ax - movw %ax,i386_FS - movw %gs,%ax - movw %ax,i386_GS - movw %ss,%ax - movw %ax,i386_SS - popl %eax - movl %eax,i386_EIP - popl %eax - movw %ax,i386_CS - popl %eax - movl %eax,i386_EFLAGS - movl %cr0,%eax - movl %eax,i386_CR0 - //movl %cr1,%eax - //movl %eax,i386_CR1 - movl %cr2,%eax - movl %eax,i386_CR2 - movl %cr3,%eax - movl %eax,i386_CR3 - movl %dr0,%eax - movl %eax,i386_DR0 - movl %dr1,%eax - movl %eax,i386_DR1 - movl %dr2,%eax - movl %eax,i386_DR2 - movl %dr3,%eax - movl %eax,i386_DR3 - movl %dr6,%eax - movl %eax,i386_DR6 - movl %dr7,%eax - movl %eax,i386_DR7 - sgdt i386_GDTR - sidt i386_IDTR - sldt i386_LDTR - str i386_TR -.endm
- - i386ExceptionHandlerText: .ascii "An error occured in FreeLoader\n" .ascii VERSION @@ -260,6 +208,10 @@ i386_TR: .word 0
+/* Hook to save debug registers */ +EXTERN(i386TrapSaveDRHook) + .long 0 + /* Used to store the current X and Y position on the screen */ i386_ScreenPosX: .long 0 @@ -270,8 +222,70 @@ i386CommonExceptionHandler: .code32
- SAVE_CPU_REGS + movl %eax,i386_EAX + movl %ebx,i386_EBX + movl %ecx,i386_ECX + movl %edx,i386_EDX + movl %esp,i386_ESP + movl %ebp,i386_EBP + movl %esi,i386_ESI + movl %edi,i386_EDI + movw %ds,%ax + movw %ax,i386_DS + movw %es,%ax + movw %ax,i386_ES + movw %fs,%ax + movw %ax,i386_FS + movw %gs,%ax + movw %ax,i386_GS + movw %ss,%ax + movw %ax,i386_SS + popl %eax + movl %eax,i386_EIP + popl %eax + movw %ax,i386_CS + popl %eax + movl %eax,i386_EFLAGS + movl %cr0,%eax + movl %eax,i386_CR0 + //movl %cr1,%eax + //movl %eax,i386_CR1 + movl %cr2,%eax + movl %eax,i386_CR2 + movl %cr3,%eax + movl %eax,i386_CR3
+/* Check for a hook to save debug regs (it's here for the benefit of Xen) */ + movl i386TrapSaveDRHook,%eax + test %eax,%eax + jz save_dr + +/* Hook present, call it */ + pushl $i386_DR0 + call *%eax + jmp end_save_dr + +save_dr: +/* No hook present, we can save the regs ourselves */ + movl %dr0,%eax + movl %eax,i386_DR0 + movl %dr1,%eax + movl %eax,i386_DR1 + movl %dr2,%eax + movl %eax,i386_DR2 + movl %dr3,%eax + movl %eax,i386_DR3 + movl %dr6,%eax + movl %eax,i386_DR6 + movl %dr7,%eax + movl %eax,i386_DR7 + +end_save_dr: + sgdt i386_GDTR + sidt i386_IDTR + sldt i386_LDTR + str i386_TR + pushl $SCREEN_ATTR call MachVideoClearScreen add $4,%esp @@ -444,9 +458,8 @@ incl i386_ScreenPosY incl i386_ScreenPosY
- cli i386ExceptionHandlerHang: - hlt + call MachDie jmp i386ExceptionHandlerHang
iret _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machpc.c --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machpc.c 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machpc.c 2005-04-05 17:50:21 UTC (rev 14508) @@ -1,5 +1,4 @@
-/* $Id$ - * +/* * FreeLoader * * This program is free software; you can redistribute it and/or modify @@ -54,6 +53,19 @@ MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount; MachVtbl.RTCGetCurrentDateTime = PcRTCGetCurrentDateTime; MachVtbl.HwDetect = PcHwDetect; + MachVtbl.Die = PcDie; }
+VOID +PcDie() +{ + while (1) + { + __asm__ __volatile__( + " cli\n" + " hlt\n" + ); + } +} + /* EOF */ _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machpc.h --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machpc.h 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machpc.h 2005-04-05 17:50:21 UTC (rev 14508) @@ -57,6 +57,8 @@
VOID PcHwDetect(VOID);
+VOID PcDie(VOID); + #endif /* __I386_MACHPC_H_ */
/* EOF */ _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c 2005-04-05 17:50:21 UTC (rev 14508) @@ -1,5 +1,4 @@
-/* $Id$ - * +/* * FreeLoader * * This program is free software; you can redistribute it and/or modify @@ -52,4 +51,19 @@ MachVtbl.DiskGetCacheableBlockCount = XboxDiskGetCacheableBlockCount; MachVtbl.RTCGetCurrentDateTime = XboxRTCGetCurrentDateTime; MachVtbl.HwDetect = XboxHwDetect; + MachVtbl.Die = XboxDie; } + +VOID +XboxDie() +{ + while (1) + { + __asm__ __volatile__( + " cli\n" + " hlt\n" + ); + } +} + +/* EOF */ _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxbox.h --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxbox.h 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxbox.h 2005-04-05 17:50:21 UTC (rev 14508) @@ -60,6 +60,8 @@
VOID XboxHwDetect(VOID);
+VOID XboxDie(VOID); + #endif /* __I386_HWXBOX_H_ */
/* EOF */ _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.c 2005-04-05 17:50:21 UTC (rev 14508) @@ -21,13 +21,13 @@
#include "freeldr.h" #include "machxen.h" +#include "i386.h"
#include <rosxen.h> #include <xen.h> #include <hypervisor.h>
BOOL XenActive = FALSE; -int XenCtrlIfEvtchn;
VOID XenMachInit(VOID) @@ -57,8 +57,55 @@ MachVtbl.DiskGetCacheableBlockCount = XenDiskGetCacheableBlockCount; MachVtbl.RTCGetCurrentDateTime = XenRTCGetCurrentDateTime; MachVtbl.HwDetect = XenHwDetect; + MachVtbl.Die = XenDie; }
+VOID +XenDie() +{ + XenConsFlush(); + while (1) + { + HYPERVISOR_shutdown(); + } +} + +extern void (*i386TrapSaveDRHook)(unsigned long *DRRegs); +extern void i386Breakpoint(); + +static trap_info_t trap_table[] = { + { 0, 0, FLAT_RING1_CS, (unsigned long)i386DivideByZero }, + { 1, 0, FLAT_RING1_CS, (unsigned long)i386DebugException }, + { 2, 0, FLAT_RING1_CS, (unsigned long)i386NMIException }, + { 3, 3, FLAT_RING1_CS, (unsigned long)i386Breakpoint }, + { 4, 3, FLAT_RING1_CS, (unsigned long)i386Overflow }, + { 5, 3, FLAT_RING1_CS, (unsigned long)i386BoundException }, + { 6, 0, FLAT_RING1_CS, (unsigned long)i386InvalidOpcode }, + { 7, 0, FLAT_RING1_CS, (unsigned long)i386FPUNotAvailable }, + { 8, 0, FLAT_RING1_CS, (unsigned long)i386DoubleFault }, + { 9, 0, FLAT_RING1_CS, (unsigned long)i386CoprocessorSegment }, + { 10, 0, FLAT_RING1_CS, (unsigned long)i386InvalidTSS }, + { 11, 0, FLAT_RING1_CS, (unsigned long)i386SegmentNotPresent }, + { 12, 0, FLAT_RING1_CS, (unsigned long)i386StackException }, + { 13, 0, FLAT_RING1_CS, (unsigned long)i386GeneralProtectionFault }, + { 14, 0, FLAT_RING1_CS, (unsigned long)i386PageFault }, + { 16, 0, FLAT_RING1_CS, (unsigned long)i386CoprocessorError }, + { 17, 0, FLAT_RING1_CS, (unsigned long)i386AlignmentCheck }, + { 18, 0, FLAT_RING1_CS, (unsigned long)i386MachineCheck }, + { 0, 0, 0, 0 } +}; + +static void +XenTrapSaveDR(unsigned long *DRRegs) +{ + unsigned Reg; + + for (Reg = 0; Reg < 8; Reg++) + { + DRRegs[Reg] = HYPERVISOR_get_debugreg(Reg); + } +} + /* _start is the default name ld will use as the entry point. When xen * loads the domain, it will start execution at the elf entry point. */
@@ -95,18 +142,21 @@ __asm__ __volatile__("mov %%eax,%%esp\n" : : "a"(NewStackPtr)); /* Don't use stack based variables after this */
+ i386TrapSaveDRHook = XenTrapSaveDR; + HYPERVISOR_set_trap_table(trap_table); + /* Start freeldr */ XenActive = TRUE; BootDrive = 0x80; BootMain(XenStartInfo->cmd_line);
/* Shouldn't get here */ - HYPERVISOR_shutdown(); + XenDie(); }
#define XEN_UNIMPLEMENTED(routine) \ printf(routine " unimplemented. Shutting down\n"); \ - HYPERVISOR_shutdown() + XenDie()
BOOL XenConsKbHit() @@ -122,12 +172,6 @@ return 0; }
-VOID -XenVideoClearScreen(UCHAR Attr) - { - XEN_UNIMPLEMENTED("XenVideoClearScreen"); - } - VIDEODISPLAYMODE XenVideoSetDisplayMode(char *DisplayMode, BOOL Init) { @@ -161,12 +205,6 @@ }
VOID -XenVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y) - { - XEN_UNIMPLEMENTED("XenVideoPutChar"); - } - -VOID XenVideoCopyOffScreenBufferToVRAM(PVOID Buffer) { XEN_UNIMPLEMENTED("XenVideoCopyOffScreenBufferToVRAM"); _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/machxen.h 2005-04-05 17:50:21 UTC (rev 14508) @@ -45,6 +45,7 @@
VOID XenConsPutChar(int Ch); BOOL XenConsKbHit(); int XenConsGetCh(); +VOID XenConsFlush();
VOID XenVideoClearScreen(UCHAR Attr); VIDEODISPLAYMODE XenVideoSetDisplayMode(char *DisplayMode, BOOL Init); @@ -71,6 +72,8 @@
VOID XenHwDetect(VOID);
+VOID XenDie(VOID); + #endif /* __I386_MACHXEN_H_ */
/* EOF */ _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xencons.c --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xencons.c 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xencons.c 2005-04-05 17:50:21 UTC (rev 14508) @@ -37,8 +37,8 @@
static char OutputBuffer[OUTPUT_BUFFER_SIZE]; static unsigned OutputPtr = 0;
-static void -FlushOutput() +VOID +XenConsFlush() { ctrl_msg_t Msg;
@@ -69,7 +69,7 @@ { if (OUTPUT_BUFFER_SIZE <= OutputPtr) { - FlushOutput(); + XenConsFlush(); } OutputBuffer[OutputPtr++] = Ch; } @@ -81,7 +81,7 @@ { PutCharInBuffer('\r'); PutCharInBuffer('\n'); - FlushOutput(); + XenConsFlush(); } else { _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenmem.c --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenmem.c 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenmem.c 2005-04-05 17:50:21 UTC (rev 14508) @@ -204,7 +204,7 @@
if (0 != HYPERVISOR_mmu_update(&MmuReq, 1, NULL)) { HYPERVISOR_console_io(CONSOLEIO_write, sizeof(ErrMsg), ErrMsg); - HYPERVISOR_shutdown(); + XenDie(); } }
@@ -217,7 +217,7 @@ if (0 != HYPERVISOR_mmu_update(&MmuReq, 1, NULL)) { HYPERVISOR_console_io(CONSOLEIO_write, sizeof(ErrMsg), ErrMsg); - HYPERVISOR_shutdown(); + XenDie(); } XenPageDir = (PPDE) HighAddr;
@@ -231,7 +231,7 @@ if (0 != HYPERVISOR_mmu_update(&MmuReq, 1, NULL)) { HYPERVISOR_console_io(CONSOLEIO_write, sizeof(ErrMsg), ErrMsg); - HYPERVISOR_shutdown(); + XenDie(); }
/* Map the page tables near the top of mem */ @@ -247,7 +247,7 @@ if (0 != HYPERVISOR_mmu_update(&MmuReq, 1, NULL)) { HYPERVISOR_console_io(CONSOLEIO_write, sizeof(ErrMsg), ErrMsg); - HYPERVISOR_shutdown(); + XenDie(); } }
@@ -276,7 +276,7 @@ if (0 != HYPERVISOR_mmu_update(&MmuReq, 1, NULL)) { HYPERVISOR_console_io(CONSOLEIO_write, sizeof(ErrMsg), ErrMsg); - HYPERVISOR_shutdown(); + XenDie(); } } } @@ -296,7 +296,7 @@ if (0 != HYPERVISOR_mmu_update(&MmuReq, 1, NULL)) { HYPERVISOR_console_io(CONSOLEIO_write, sizeof(ErrMsg), ErrMsg); - HYPERVISOR_shutdown(); + XenDie(); } }
_____
Added: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenvideo.c --- branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenvideo.c 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenvideo.c 2005-04-05 17:50:21 UTC (rev 14508) @@ -0,0 +1,105 @@
+/* + * FreeLoader + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* + * Xen virtualization of the console isn't that great, it doesn't properly + * virtualize full-screen access. We simulate it by sending ANSI control + * codes and assume a display size of 80x25. This should be enough for proper + * display on e.g. linux consoles and xterms. + */ + +#include "freeldr.h" +#include "machxen.h" + +#define ROWS 25 +#define COLS 80 + +static unsigned CurrentX = (unsigned) -1; +static unsigned CurrentY = (unsigned) -1; +static UCHAR CurrentAttr = 0x07; + + +static VOID +AnsiMoveToPos(unsigned X, unsigned Y) +{ + CurrentX = X; + CurrentY = Y; + printf("\033[%d;%dH", Y + 1, X + 1); +} + +static VOID +AnsiSetAttr(UCHAR Attr) +{ + /* Convert color from BIOS (RGB) to ANSI (BGR) */ + static UCHAR ConvertColor[] = + { 0x00, 0x04, 0x02, 0x06, 0x01, 0x05, 0x03, 0x07 }; + char Bright[3]; + + CurrentAttr = Attr; + /* Check for bright foreground */ + if (0 != (Attr & 0x08)) + { + strcpy(Bright, "1;"); + } + else + { + Bright[0] = '\0'; + } + printf("\033[%s3%d;4%dm", Bright, ConvertColor[Attr & 0x07], + ConvertColor[(Attr >> 4) & 0x07]); +} + +static VOID +AnsiClearScreen() +{ + printf("\033[H\033[J\n"); +} + +VOID +XenVideoClearScreen(UCHAR Attr) +{ + if (Attr != CurrentAttr) + { + AnsiSetAttr(Attr); + } + AnsiClearScreen(); +} + +VOID +XenVideoPutChar(int Ch, UCHAR Attr, unsigned X, unsigned Y) +{ + /* Don't write outside the screen or on the bottom-right position, + it might trigger a scroll operation */ + if (COLS <= X || ROWS <= Y + || (X == COLS - 1 && Y == ROWS - 1)) + { + return; + } + + if (X != CurrentX || Y != CurrentY) + { + AnsiMoveToPos(X, Y); + } + if (Attr != CurrentAttr) + { + AnsiSetAttr(Attr); + } + XenConsPutChar(Ch); + CurrentX++; +} + +/* EOF */ Property changes on: branches/xen/reactos/boot/freeldr/freeldr/arch/i386/xenvideo.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native _____
Modified: branches/xen/reactos/boot/freeldr/freeldr/include/machine.h --- branches/xen/reactos/boot/freeldr/freeldr/include/machine.h 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/include/machine.h 2005-04-05 17:50:21 UTC (rev 14508) @@ -64,6 +64,8 @@
VOID (*RTCGetCurrentDateTime)(PULONG Year, PULONG Month, PULONG Day, PULONG Hour, PULONG Minute, PULONG Second);
VOID (*HwDetect)(VOID); + + VOID (*Die)(VOID); } MACHVTBL, *PMACHVTBL;
VOID MachInit(VOID); @@ -93,6 +95,7 @@ #define MachDiskGetCacheableBlockCount(Drive) MachVtbl.DiskGetCacheableBlockCount(Drive) #define MachRTCGetCurrentDateTime(Y, Mo, D, H, Mi, S) MachVtbl.RTCGetCurrentDateTime((Y), (Mo), (D), (H), (Mi), (S)); #define MachHwDetect() MachVtbl.HwDetect() +#define MachDie() MachVtbl.Die()
#endif /* __MACHINE_H_ */
_____
Modified: branches/xen/reactos/boot/freeldr/freeldr/machine.c --- branches/xen/reactos/boot/freeldr/freeldr/machine.c 2005-04-05 17:22:02 UTC (rev 14507) +++ branches/xen/reactos/boot/freeldr/freeldr/machine.c 2005-04-05 17:50:21 UTC (rev 14508) @@ -43,6 +43,7 @@
#undef MachDiskGetCacheableBlockCount #undef MachRTCGetCurrentDateTime #undef MachHwDetect +#undef MachDie
MACHVTBL MachVtbl;
@@ -184,4 +185,10 @@ MachVtbl.HwDetect(); }
+VOID +MachDie(VOID) +{ + MachVtbl.Die(); +} + /* EOF */