reactos/ntoskrnl/fstub/halstub.c

293 lines
6 KiB
C
Raw Normal View History

/*
* PROJECT: ReactOS Kernel
* LICENSE: GPL - See COPYING in the top level directory
* FILE: ntoskrnl/fstub/halstub.c
* PURPOSE: I/O Stub HAL Routines
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
Pierre Schweitzer (pierre.schweitzer@reactos.org)
*/
/* INCLUDES ******************************************************************/
#include <ntoskrnl.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS *******************************************************************/
HAL_DISPATCH HalDispatchTable =
{
HAL_DISPATCH_VERSION,
xHalQuerySystemInformation,
xHalSetSystemInformation,
xHalQueryBusSlots,
0,
xHalExamineMBR,
xHalIoAssignDriveLetters,
xHalIoReadPartitionTable,
xHalIoSetPartitionInformation,
xHalIoWritePartitionTable,
xHalHandlerForBus,
xHalReferenceHandler,
xHalReferenceHandler,
xHalInitPnpDriver,
xHalInitPowerManagement,
(pHalGetDmaAdapter) NULL,
xHalGetInterruptTranslator,
xHalStartMirroring,
xHalEndMirroring,
xHalMirrorPhysicalMemory,
xHalEndOfBoot,
xHalMirrorPhysicalMemory
};
HAL_PRIVATE_DISPATCH HalPrivateDispatchTable =
{
HAL_PRIVATE_DISPATCH_VERSION,
xHalHandlerForBus,
(pHalHandlerForConfigSpace)xHalHandlerForBus,
xHalLocateHiberRanges,
xHalRegisterBusHandler,
xHalSetWakeEnable,
xHalSetWakeAlarm,
xHalTranslateBusAddress,
(pHalAssignSlotResources)xHalTranslateBusAddress,
- Stub out DbgKdWriteVirtualMemoryApi, DbgKdReadPhysicalMemoryApi, DbgKdWritePhysicalMemoryApi, DbgKdWriteBreakPointExApi, DbgKdRestoreBreakPointExApi, DbgKdSearchMemoryApi and DbgKdFillMemoryApi cases more properly. - Fail on physical memory write like we do for read too. - Don't handle OldVlm1/2 as they appear to be deprecated and unhandled in Windows. - Implement HalHaltSystem to halt execution in a portable way. Default to xHalHaltSystem, a simple infinite loop, if we get called before HAL has initialized. Use this in KiBugCheckDebugBreak and the system shutdown handler instead of x86/AMD64/ARM intrinsics. - Don't try to halt the CPU if KeBugCheck has been called 3 times or more -- if this happens, something has gone very wrong, and we shouldn't try to do anything special. Just loop infinitely. - Fix KiBugCheckDebugBreak -- it shouldn't halt execution when called for the first chance as bugcheck callbacks have not been invoked at this point (nor has the BSOD been displayed). Use SEH to protect against a crash instead of checking KdDebuggerNotPresent as the debugger, if it is present, *could* disconnect while the trap is being handled. Also, don't halt execution if the debugger handled the breakpoint, just break again. - Don't call MmMapIoSpace from HalpReboot! The reboot might take place at elevated IRQL (as high as HIGH_LEVEL if called from KeBugCheck), and thus can't use any Mm support routines. Use a PTE from the reserved HAL region and map it ourselves instead as done in the BIOS call code. - Acquire the display ownership in HalReturnToFirmware in case the caller hasn't done so (as done in the KD reboot routine, for example). - Just include ntndk.h in hal.h instead of including 6 NDK headers (which turns into more than half of the NDK anyway since those headers include other NDK headers). - Crashing and rebooting from KD now works properly. svn path=/trunk/; revision=43380
2009-10-11 20:16:45 +00:00
xHalHaltSystem,
(pHalFindBusAddressTranslation)NULL,
(pHalResetDisplay)NULL,
xHalAllocateMapRegisters,
xKdSetupPciDeviceForDebugging,
xKdReleasePciDeviceForDebugging,
xKdGetAcpiTablePhase,
(pKdCheckPowerButton)xHalReferenceHandler,
xHalVectorToIDTEntry,
(pKdMapPhysicalMemory64)MatchAll,
(pKdUnmapVirtualAddress)xKdUnmapVirtualAddress
};
/* FUNCTIONS *****************************************************************/
UCHAR
NTAPI
xHalVectorToIDTEntry(IN ULONG Vector)
{
/* Return the vector */
return Vector;
}
- Stub out DbgKdWriteVirtualMemoryApi, DbgKdReadPhysicalMemoryApi, DbgKdWritePhysicalMemoryApi, DbgKdWriteBreakPointExApi, DbgKdRestoreBreakPointExApi, DbgKdSearchMemoryApi and DbgKdFillMemoryApi cases more properly. - Fail on physical memory write like we do for read too. - Don't handle OldVlm1/2 as they appear to be deprecated and unhandled in Windows. - Implement HalHaltSystem to halt execution in a portable way. Default to xHalHaltSystem, a simple infinite loop, if we get called before HAL has initialized. Use this in KiBugCheckDebugBreak and the system shutdown handler instead of x86/AMD64/ARM intrinsics. - Don't try to halt the CPU if KeBugCheck has been called 3 times or more -- if this happens, something has gone very wrong, and we shouldn't try to do anything special. Just loop infinitely. - Fix KiBugCheckDebugBreak -- it shouldn't halt execution when called for the first chance as bugcheck callbacks have not been invoked at this point (nor has the BSOD been displayed). Use SEH to protect against a crash instead of checking KdDebuggerNotPresent as the debugger, if it is present, *could* disconnect while the trap is being handled. Also, don't halt execution if the debugger handled the breakpoint, just break again. - Don't call MmMapIoSpace from HalpReboot! The reboot might take place at elevated IRQL (as high as HIGH_LEVEL if called from KeBugCheck), and thus can't use any Mm support routines. Use a PTE from the reserved HAL region and map it ourselves instead as done in the BIOS call code. - Acquire the display ownership in HalReturnToFirmware in case the caller hasn't done so (as done in the KD reboot routine, for example). - Just include ntndk.h in hal.h instead of including 6 NDK headers (which turns into more than half of the NDK anyway since those headers include other NDK headers). - Crashing and rebooting from KD now works properly. svn path=/trunk/; revision=43380
2009-10-11 20:16:45 +00:00
VOID
NTAPI
xHalHaltSystem(VOID)
{
/* Halt execution */
while (TRUE);
}
VOID
NTAPI
xHalEndOfBoot(VOID)
{
PAGED_CODE();
/* Nothing */
return;
}
VOID
NTAPI
xHalSetWakeEnable(IN BOOLEAN Enable)
{
/* Nothing */
return;
}
PBUS_HANDLER
FASTCALL
xHalHandlerForBus(IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber)
{
return NULL;
}
VOID
FASTCALL
xHalReferenceHandler(IN PBUS_HANDLER BusHandler)
{
/* Nothing */
return;
}
NTSTATUS
NTAPI
xHalInitPnpDriver(VOID)
{
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
xHalInitPowerManagement(IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
OUT PPM_DISPATCH_TABLE *PmHalDispatchTable)
{
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
xHalStartMirroring(VOID)
{
PAGED_CODE();
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
xHalEndMirroring(IN ULONG PassNumber)
{
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
xHalMirrorPhysicalMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
IN LARGE_INTEGER NumberOfBytes)
{
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
xHalQueryBusSlots(IN PBUS_HANDLER BusHandler,
IN ULONG BufferSize,
OUT PULONG SlotNumbers,
OUT PULONG ReturnedLength)
{
PAGED_CODE();
return STATUS_NOT_SUPPORTED;
}
NTSTATUS
NTAPI
xHalSetSystemInformation(IN HAL_SET_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN PVOID Buffer)
{
PAGED_CODE();
return STATUS_INVALID_LEVEL;
}
NTSTATUS
NTAPI
xHalQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass,
IN ULONG BufferSize,
IN OUT PVOID Buffer,
OUT PULONG ReturnedLength)
{
PAGED_CODE();
return STATUS_INVALID_LEVEL;
}
VOID
NTAPI
xHalLocateHiberRanges(IN PVOID MemoryMap)
{
/* Nothing */
return;
}
NTSTATUS
NTAPI
xHalRegisterBusHandler(IN INTERFACE_TYPE InterfaceType,
IN BUS_DATA_TYPE ConfigSpace,
IN ULONG BusNumber,
IN INTERFACE_TYPE ParentInterfaceType,
IN ULONG ParentBusNumber,
IN ULONG ContextSize,
IN PINSTALL_BUS_HANDLER InstallCallback,
OUT PBUS_HANDLER *BusHandler)
{
PAGED_CODE();
return STATUS_NOT_SUPPORTED;
}
VOID
NTAPI
xHalSetWakeAlarm(IN ULONGLONG AlartTime,
IN PTIME_FIELDS TimeFields)
{
/* Nothing */
return;
}
BOOLEAN
NTAPI
xHalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress)
{
KeBugCheckEx(HAL_INITIALIZATION_FAILED, 0, 0, 0, 0);
return FALSE;
}
NTSTATUS
NTAPI
xHalAllocateMapRegisters(IN PADAPTER_OBJECT AdapterObject,
IN ULONG Unknown,
IN ULONG Unknown2,
PMAP_REGISTER_ENTRY Registers)
{
PAGED_CODE();
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
NTAPI
xKdSetupPciDeviceForDebugging(IN PVOID LoaderBlock OPTIONAL,
IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice)
{
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
NTAPI
xKdReleasePciDeviceForDebugging(IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice)
{
return STATUS_NOT_IMPLEMENTED;
}
PVOID
NTAPI
xKdGetAcpiTablePhase(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
IN ULONG Signature)
{
return NULL;
}
PVOID
NTAPI
MatchAll(IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberPages,
IN BOOLEAN FlushCurrentTLB)
{
return NULL;
}
VOID
NTAPI
xKdUnmapVirtualAddress(IN PVOID VirtualAddress,
IN ULONG NumberPages,
IN BOOLEAN FlushCurrentTLB)
{
/* Nothing */
return;
}