Merge pull request #1917 from Fisherman166/HalReadSMCTrayState

Rewrite HalReadSMCTrayState to match original kernel implementation.
This commit is contained in:
Luke Usher 2020-06-08 15:22:32 +01:00 committed by GitHub
commit f1d09aff15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 24 deletions

View File

@ -15,7 +15,7 @@
// ******************************************************************
// * HalReadSMCTrayState
// ******************************************************************
XBSYSAPI EXPORTNUM(9) VOID NTAPI HalReadSMCTrayState
XBSYSAPI EXPORTNUM(9) NTSTATUS NTAPI HalReadSMCTrayState
(
DWORD* State,
DWORD* Count

View File

@ -72,10 +72,17 @@ xboxkrnl::LIST_ENTRY ShutdownRoutineList = { &ShutdownRoutineList , &ShutdownRou
// ******************************************************************
xboxkrnl::KPCR* WINAPI KeGetPcr();
#define TRAY_CLOSED_MEDIA_PRESENT 0x60
#define TRAY_CLOSED_NO_MEDIA 0x40
#define TRAY_OPEN 0x10
#define INIT_TRAY_STATE 0xFFFFFFFF
static DWORD g_TrayState = INIT_TRAY_STATE;
static DWORD g_TrayCount = 0;
// ******************************************************************
// * 0x0009 - HalReadSMCTrayState()
// ******************************************************************
XBSYSAPI EXPORTNUM(9) xboxkrnl::VOID NTAPI xboxkrnl::HalReadSMCTrayState
XBSYSAPI EXPORTNUM(9) xboxkrnl::NTSTATUS NTAPI xboxkrnl::HalReadSMCTrayState
(
DWORD* State,
DWORD* Count
@ -86,22 +93,36 @@ XBSYSAPI EXPORTNUM(9) xboxkrnl::VOID NTAPI xboxkrnl::HalReadSMCTrayState
LOG_FUNC_ARG(Count)
LOG_FUNC_END;
#define TRAY_CLOSED_MEDIA_PRESENT 96
#define TRAY_CLOSED_NO_MEDIA 64
#define TRAY_OPEN 16
UCHAR orig_irql = KeRaiseIrqlToDpcLevel();
DWORD TrayState = g_TrayState;
DWORD orig_TrayCount = g_TrayCount;
KfLowerIrql(orig_irql);
// TODO: Make this configurable?
// TODO: What is the count parameter for??
if (Count)
*Count = 1;
// Pretend the tray is open
NTSTATUS ret = STATUS_SUCCESS;
if (TrayState == INIT_TRAY_STATE) {
ret = HalReadSMBusValue(SMBUS_ADDRESS_SYSTEM_MICRO_CONTROLLER, SMC_COMMAND_TRAY_STATE, 0, &TrayState);
// If bit 31 = 1, then there is an error so do not execute this code.
if ((ret >> 31) == 0) {
TrayState &= 0x70;
if ((TrayState != TRAY_CLOSED_MEDIA_PRESENT) && (TrayState != TRAY_CLOSED_NO_MEDIA)) {
TrayState = TRAY_OPEN;
}
orig_irql = KeRaiseIrqlToDpcLevel();
if (orig_TrayCount != g_TrayCount) {
g_TrayState = TrayState;
}
KfLowerIrql(orig_irql);
}
}
// FIXME: Pretend the tray is open
// TRAY_CLOSED_NO_MEDIA causes Dashboard to call DeviceIoControl, which we do not implement
// TRAY_CLOSED_MEDIA_PRESENT causes Dashboard to attempt to launch media, causing errors.
//*State = TrayState;
*State = TRAY_OPEN;
// *Count = 1;
if (Count) {
*Count = orig_TrayCount;
}
RETURN(ret);
}
// ******************************************************************

View File

@ -44,20 +44,20 @@
// From https://web.archive.org/web/20100617022549/https://www.xbox-linux.org/wiki/PIC :
// Command Description
#define SMC_COMMAND_VERSION 0x01 // PIC version string
//0x03 tray state
#define SMC_COMMAND_AV_PACK 0x04 // A / V Pack state
#define SMC_COMMAND_CPU_TEMP 0x09 // CPU temperature (°C)
#define SMC_COMMAND_MOTHERBOARD_TEMP 0x0A // motherboard temperature (°C)
#define SMC_COMMAND_VERSION 0x01 // PIC version string
#define SMC_COMMAND_TRAY_STATE 0x03 //tray state
#define SMC_COMMAND_AV_PACK 0x04 // A / V Pack state
#define SMC_COMMAND_CPU_TEMP 0x09 // CPU temperature (°C)
#define SMC_COMMAND_MOTHERBOARD_TEMP 0x0A // motherboard temperature (°C)
//0x0F reads scratch register written with 0x0E
#define SMC_COMMAND_POWER_FAN_READBACK 0x10 // Current power fan speed (0-50)
//0x11 interrupt reason
//0x18 reading this reg locks up xbox in "overheated" state
#define SMC_COMMAND_SCRATCH 0x1B // scratch register for the original kernel
#define SMC_COMMAND_CHALLENGE_1C 0x1C // random number for boot challenge
#define SMC_COMMAND_CHALLENGE_1D 0x1D // random number for boot challenge
#define SMC_COMMAND_CHALLENGE_1E 0x1E // random number for boot challenge
#define SMC_COMMAND_CHALLENGE_1F 0x1F // random number for boot challenge
#define SMC_COMMAND_SCRATCH 0x1B // scratch register for the original kernel
#define SMC_COMMAND_CHALLENGE_1C 0x1C // random number for boot challenge
#define SMC_COMMAND_CHALLENGE_1D 0x1D // random number for boot challenge
#define SMC_COMMAND_CHALLENGE_1E 0x1E // random number for boot challenge
#define SMC_COMMAND_CHALLENGE_1F 0x1F // random number for boot challenge
//
// Writing:
//