HalIsResetOrShutdownPending implementation

This commit is contained in:
ergo720 2018-01-22 16:06:17 +01:00
parent f738bf47d4
commit 1a4295c3da
3 changed files with 31 additions and 3 deletions

View File

@ -684,9 +684,14 @@ XBSYSAPI EXPORTNUM(358) xboxkrnl::BOOLEAN NTAPI xboxkrnl::HalIsResetOrShutdownPe
{
LOG_FUNC();
LOG_UNIMPLEMENTED();
BOOLEAN ret = FALSE;
uint8_t CommandCode;
uint32_t DataValue;
g_SMC->GetResetOrShutdownCode(&CommandCode, &DataValue);
RETURN(FALSE);
if (CommandCode != 0) { ret = TRUE; }
RETURN(ret);
}
// ******************************************************************
@ -699,7 +704,10 @@ XBSYSAPI EXPORTNUM(360) xboxkrnl::NTSTATUS NTAPI xboxkrnl::HalInitiateShutdown
{
LOG_FUNC();
xboxkrnl::HalWriteSMBusValue(SMBUS_SMC_SLAVE_ADDRESS, SMC_COMMAND_RESET, 0, SMC_RESET_ASSERT_SHUTDOWN);
uint8_t CommandCode = SMC_COMMAND_RESET;
uint32_t DataValue = SMC_RESET_ASSERT_SHUTDOWN;
g_SMC->SetResetOrShutdownCode(&CommandCode, &DataValue);
xboxkrnl::HalWriteSMBusValue(SMBUS_SMC_SLAVE_ADDRESS, CommandCode, 0, DataValue);
RETURN(S_OK);
}

View File

@ -75,6 +75,8 @@ void SMCDevice::Init()
buffer[SMC_COMMAND_AV_PACK] = AV_PACK_HDTV; // see http://xboxdevwiki.net/PIC#The_AV_Pack
buffer[SMC_COMMAND_LED_SEQUENCE] = LED::GREEN;
buffer[SMC_COMMAND_SCRATCH] = 0; // http://xboxdevwiki.net/PIC#Scratch_register_values
ResetOrShutdownCommandCode.store(0);
ResetOrShutdownDataValue.store(0);
}
void SMCDevice::Reset()
@ -209,3 +211,15 @@ void SMCDevice::WriteBlock(uint8_t command, uint8_t* data, int length)
{
// TODO
}
void SMCDevice::GetResetOrShutdownCode(uint8_t* CommandCode, uint32_t* DataValue)
{
*CommandCode = ResetOrShutdownCommandCode.load();
*DataValue = ResetOrShutdownDataValue.load();
}
void SMCDevice::SetResetOrShutdownCode(uint8_t* CommandCode, uint32_t* DataValue)
{
ResetOrShutdownCommandCode.store(*CommandCode);
ResetOrShutdownDataValue.store(*DataValue);
}

View File

@ -36,6 +36,7 @@
#pragma once
#include "SMDevice.h"
#include <atomic>
// This https://upload.wikimedia.org/wikipedia/commons/9/94/Xbox-Motherboard-FR.jpg shows :
// PIC16LC63A-04/SO
@ -119,10 +120,15 @@ public:
void WriteByte(uint8_t command, uint8_t value);
void WriteWord(uint8_t command, uint16_t value);
void WriteBlock(uint8_t command, uint8_t* data, int length);
void GetResetOrShutdownCode(uint8_t* CommandCode, uint32_t* DataValue);
void SetResetOrShutdownCode(uint8_t* CommandCode, uint32_t* DataValue);
private:
HardwareModel m_HardwareModel;
int m_PICVersionStringIndex = 0;
uint8_t buffer[256] = {};
// variables used by the SMC to know a reset / shutdown is pending
std::atomic<uint8_t> ResetOrShutdownCommandCode;
std::atomic<uint32_t> ResetOrShutdownDataValue;
};
extern SMCDevice* g_SMC;