|
阅读:2899回复:1
有src的xd们,帮忙看看HalReturnToFirmware这个函数怎么实现的?
特别是HalRebootRoutine,能帮忙贴上来最好
|
|
|
沙发#
发布于:2005-03-19 18:25
reboot啊
2k以上操作系统 如果不支持acpi的reboot方式 就用键盘上的micro controller的传统方法reboot 否则用acpi的reboot方式了 但是没有这个代码...你跟踪下就知道了 而nt本身不支持acpi nt的实现就是使用键盘..代码有 #define CMOS_CTRL (PUCHAR )0x70
#define CMOS_DATA (PUCHAR )0x71
#define RESET 0xfe
#define KEYBPORT (PUCHAR )0x64
//
// Private function prototypes
//
VOID
HalpReboot (
VOID
);
VOID
HalpReboot (
VOID
)
/*++
Routine Description:
This procedure resets the CMOS clock to the standard timer settings
so the bios will work, and then issues a reset command to the keyboard
to cause a warm boot.
It is very machine dependent, this implementation is intended for
PC-AT like machines.
This code copied from the \"old debugger\" sources.
N.B.
Will NOT return.
--*/
{
UCHAR Scratch;
PUSHORT Magic;
//
// By sticking 0x1234 at physical location 0x472, we can bypass the
// memory check after a reboot.
//
Magic = HalpMapPhysicalMemory(0, 1);
Magic[0x472 / sizeof(USHORT)] = 0x1234;
//
// Turn off interrupts
//
HalpAcquireCmosSpinLock();
_asm {
cli
}
//
// Reset the cmos clock to a standard value
// (We are setting the periodic interrupt control on the MC147818)
//
//
// Disable periodic interrupt
//
WRITE_PORT_UCHAR(CMOS_CTRL, 0x0b); // Set up for control reg B.
KeStallExecutionProcessor(1);
Scratch = READ_PORT_UCHAR(CMOS_DATA);
KeStallExecutionProcessor(1);
Scratch &= 0xbf; // Clear periodic interrupt enable
WRITE_PORT_UCHAR(CMOS_DATA, Scratch);
KeStallExecutionProcessor(1);
//
// Set \"standard\" divider rate
//
WRITE_PORT_UCHAR(CMOS_CTRL, 0x0a); // Set up for control reg A.
KeStallExecutionProcessor(1);
Scratch = READ_PORT_UCHAR(CMOS_DATA);
KeStallExecutionProcessor(1);
Scratch &= 0xf0; // Clear rate setting
Scratch |= 6; // Set default rate and divider
WRITE_PORT_UCHAR(CMOS_DATA, Scratch);
KeStallExecutionProcessor(1);
//
// Set a \"neutral\" cmos address to prevent weirdness
// (Why is this needed? Source this was copied from doesn\'t say)
//
WRITE_PORT_UCHAR(CMOS_CTRL, 0x15);
KeStallExecutionProcessor(1);
HalpResetAllProcessors();
//
// If we return, send the reset command to the keyboard controller
//
WRITE_PORT_UCHAR(KEYBPORT, RESET);
_asm {
hlt
}
} |
|