Skip to content

Commit

Permalink
fix symresolve in Big Sur
Browse files Browse the repository at this point in the history
  • Loading branch information
trulyspinach committed Sep 3, 2020
1 parent 5aa7136 commit f32a371
Show file tree
Hide file tree
Showing 13 changed files with 247 additions and 158 deletions.
56 changes: 28 additions & 28 deletions AMD Power Gadget/Base.lproj/Main.storyboard

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion AMD Power Gadget/ProcessorModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class ProcessorModel {
&outputStr, &outputStrCount)
AMDRyzenCPUPowerManagementVersion = String(cString: Array(outputStr[0...outputStrCount-1]))

let compatVers = ["0.6.3", "0.6.4"]
let compatVers = ["0.6.3", "0.6.4", "0.6.5"]

if !compatVers.contains(AMDRyzenCPUPowerManagementVersion){
alertAndQuit(message: "Your AMDRyzenCPUPowerManagement version is outdated. Please use the lastest version and start this application again.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ class SystemMonitorViewController: NSViewController, NSTableViewDelegate, NSTabl
}

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
return 20
return 30
}

func numberOfRows(in tableView: NSTableView) -> Int {
Expand Down
120 changes: 65 additions & 55 deletions AMDRyzenCPUPowerManagement/AMDRyzenCPUPowerManagement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,31 @@ uint64_t pmRyzen_rdmsr_safe(void *handle, uint32_t addr){
return v;
}

pmRyzen_symtable_t pmRyzen_symtable={0};
uint8_t pmRyzen_symtable_ready = 0;

}


bool AMDRyzenCPUPowerManagement::init(OSDictionary *dictionary){
// strcpy((char*)kMODULE_VERSION, xStringify(MODULE_VERSION), (uint32_t)strlen(xStringify(MODULE_VERSION)));
IOLog("AMDCPUSupport v%s, init\n", xStringify(MODULE_VERSION));


IOLog("AMDCPUSupport::enter dlinking..\n");

pmRyzen_symtable_ready = 0;

pmRyzen_symtable._wrmsr_carefully = lookup_symbol("_wrmsr_carefully");
pmRyzen_symtable._KUNCUserNotificationDisplayAlert = lookup_symbol("_KUNCUserNotificationDisplayAlert");
pmRyzen_symtable._cpu_to_processor = lookup_symbol("_cpu_to_processor");
pmRyzen_symtable._tscFreq = lookup_symbol("_tscFreq");
pmRyzen_symtable._pmDispatch = lookup_symbol("_pmDispatch");
pmRyzen_symtable._pmUnRegister = lookup_symbol("_pmUnRegister");
pmRyzen_symtable._cpu_NMI_interrupt = lookup_symbol("_cpu_NMI_interrupt");
pmRyzen_symtable._NMIPI_enable = lookup_symbol("_NMIPI_enable");
pmRyzen_symtable._i386_cpu_IPI = lookup_symbol("_i386_cpu_IPI");
pmRyzen_symtable_ready = 1;
IOLog("AMDCPUSupport::enter link finished.\n");
return IOService::init(dictionary);
}

Expand Down Expand Up @@ -147,9 +164,9 @@ void AMDRyzenCPUPowerManagement::startWorkLoop() {
mp_rendezvous_no_intrs([](void *obj) {
auto provider = static_cast<AMDRyzenCPUPowerManagement*>(obj);
uint32_t cpu_num = cpu_number();

provider->updateInstructionDelta(cpu_num);

// Ignore hyper-threaded cores
if(!pmRyzen_cpu_primary_in_core(cpu_num)) return;
uint8_t physical = pmRyzen_cpu_phys_num(cpu_num);
Expand All @@ -162,30 +179,19 @@ void AMDRyzenCPUPowerManagement::startWorkLoop() {
//Read stats from package.
provider->updatePackageTemp();
provider->updatePackageEnergy();
// if(provider->superIO) provider->superIO->updateFanControl();
// IOLog("exit idle: %llu, ipi: %llu, diff %llu, false %llu\n", pmRyzen_exit_idle_c, pmRyzen_exit_idle_ipi_c, pmRyzen_exit_idle_c - pmRyzen_exit_idle_ipi_c, pmRyzen_exit_idle_false_c);
// pmRyzen_exit_idle_c = 0; pmRyzen_exit_idle_ipi_c = 0; pmRyzen_exit_idle_false_c = 0;
//
//
// IOLog("time: 0.%llu, running: %llu\n", uint64_t(pmRyzen_get_processor(0)->eff_load * 1000000000), pmRyzen_get_processor(4)->stat_exit_idle);

// IOLog("active p %u\n", pmRyzen_hpcpus);


uint32_t now = uint32_t(getCurrentTimeNs() / 1000000); //ms
uint32_t newInt = max(now - provider->timeOfLastMissedRequest,
provider->estimatedRequestTimeInterval);

provider->actualUpdateTimeInterval = now - provider->timeOfLastUpdate;
provider->timeOfLastUpdate = now;
provider->updateTimeInterval = min(1200, max(50, newInt));

provider->timerEventSource->setTimeoutMS(provider->updateTimeInterval);
// IOLog("est time: %d\n", provider->estimatedRequestTimeInterval);
// IOLog("update time: %d\n", provider->updateTimeInterval);
// IOLog("Core %d: %llu\n", 0, (uint64_t)(provider->PStateCur_perCore[0]));
// for (int i = 0; i < provider->totalNumberOfPhysicalCores; i++) {
// IOLog("Core %d: %llu\n", i, (uint64_t)(provider->PStateCur_perCore[i]));
// }



});
Expand Down Expand Up @@ -298,14 +304,24 @@ bool AMDRyzenCPUPowerManagement::start(IOService *provider){
// totalNumberOfLogicalCores = cpuTopology.totalLogical();


void *safe_wrmsr = lookup_symbol("_wrmsr_carefully");
IOLog("AMDCPUSupport::start trying to init PCI service...\n");
if(!getPCIService()){
IOLog("AMDCPUSupport::start no PCI support found, failing...\n");
return false;
}

// while (!pmRyzen_symtable_ready) {
// IOSleep(200);
// }

void *safe_wrmsr = pmRyzen_symtable._wrmsr_carefully;
if(!safe_wrmsr){
IOLog("AMDCPUSupport::start WARN: Can't find _wrmsr_carefully, proceeding with unsafe wrmsr\n");
} else {
wrmsr_carefully = (int(*)(uint32_t,uint32_t,uint32_t)) safe_wrmsr;
}
void *_kunc_alert = lookup_symbol("_KUNCUserNotificationDisplayAlert");

void *_kunc_alert = pmRyzen_symtable._KUNCUserNotificationDisplayAlert;
IOLog("kunc_alert %p\n", kunc_alert);
if(!_kunc_alert){
IOLog("AMDCPUSupport::start WARN: Can't find _KUNCUserNotificationDisplayAlert.\n");
Expand All @@ -314,30 +330,19 @@ bool AMDRyzenCPUPowerManagement::start(IOService *provider){
(kern_return_t(*)(int,unsigned,const char*,const char*,const char*,
const char*,const char*,const char*,const char*,const char*,unsigned*))_kunc_alert;
}

cpu_to_processor = (processor_t(*)(int))lookup_symbol("_cpu_to_processor");
processor_shutdown = (kern_return_t(*)(processor_t))lookup_symbol("_processor_exit_from_user");
processor_startup = (kern_return_t(*)(processor_t))lookup_symbol("_processor_start_from_user");
xnuTSCFreq = *((uint64_t*)lookup_symbol("_tscFreq"));

// for(int i = 4; i< 24; i++){
// (*processor_startup)((*cpu_to_processor)(i));
// }

IOLog("AMDCPUSupport::start trying to init PCI service...\n");
if(!getPCIService()){
IOLog("AMDCPUSupport::start no PCI support found, failing...\n");
return false;
}


cpu_to_processor = (processor_t(*)(int))pmRyzen_symtable._cpu_to_processor;

xnuTSCFreq = *((uint64_t*)pmRyzen_symtable._tscFreq);

pmRyzen_init(this);

totalNumberOfLogicalCores = pmRyzen_num_logi;
totalNumberOfPhysicalCores = pmRyzen_num_phys;

IOLog("AMDCPUSupport::start, Physical Count: %u, Logical Count %u.\n",
totalNumberOfPhysicalCores, totalNumberOfLogicalCores);

workLoop = IOWorkLoop::workLoop();
startWorkLoop();

Expand Down Expand Up @@ -489,11 +494,10 @@ void AMDRyzenCPUPowerManagement::calculateEffectiveFrequency(uint8_t physical){
uint64_t lastAPERF = lastAPERF_PerCore[physical];
uint64_t lastMPERF = lastMPERF_PerCore[physical];

//If an overflow of either the MPERF or APERF register occurs between the read of last MPERF and the
//If an overflow of either the MPERF or APERF register occurs between read of last MPERF and
//read of last APERF, the effective frequency calculated in is invalid.
//Yeah, so we will do nothing.
if(APERF <= lastAPERF || MPERF <= lastMPERF) {
IOLog("AMDCPUSupport::calculateEffectiveFrequency: frequency is invalid!!!");
// IOLog("AMDCPUSupport::calculateEffectiveFrequency: frequency is invalid!!!");
return;
}

Expand Down Expand Up @@ -595,17 +599,6 @@ void AMDRyzenCPUPowerManagement::updatePackageTemp(){


PACKAGE_TEMPERATURE_perPackage[0] = t;


// IOPCIAddressSpace space2;
// space2.bits = 0;
// space2.es.deviceNum = 0x18;
// space2.es.functionNum = 3;
// uint32_t nn = fIOPCIDevice->configRead32(space2, 0x00);
// uint64_t ca = 0;
// read_msr(kMSR_CSTATE_ADDR, &ca);
//
// IOLog("shit %u %llu\n", nn, ca);
}

void AMDRyzenCPUPowerManagement::updatePackageEnergy(){
Expand Down Expand Up @@ -717,15 +710,32 @@ uint32_t AMDRyzenCPUPowerManagement::getHPcpus(){
return pmRyzen_hpcpus;
}

EXPORT extern "C" kern_return_t ADDPR(kern_start)(kmod_info_t *, void *) {
EXPORT extern "C" kern_return_t amdryzencpupm_kern_start(kmod_info_t *, void *) {
// Report success but actually do not start and let I/O Kit unload us.
// This works better and increases boot speed in some cases.
PE_parse_boot_argn("liludelay", &ADDPR(debugPrintDelay), sizeof(ADDPR(debugPrintDelay)));
ADDPR(debugEnabled) = checkKernelArgument("-amdpdbg");

// IOLog("AMDCPUSupport::enter dlinking..\n");
//
// pmRyzen_symtable_ready = 0;
//
// pmRyzen_symtable._wrmsr_carefully = lookup_symbol("_wrmsr_carefully");
// pmRyzen_symtable._KUNCUserNotificationDisplayAlert = lookup_symbol("_KUNCUserNotificationDisplayAlert");
// pmRyzen_symtable._cpu_to_processor = lookup_symbol("_cpu_to_processor");
// pmRyzen_symtable._tscFreq = lookup_symbol("_tscFreq");
// pmRyzen_symtable._pmDispatch = lookup_symbol("_pmDispatch");
// pmRyzen_symtable._pmUnRegister = lookup_symbol("_pmUnRegister");
// pmRyzen_symtable._cpu_NMI_interrupt = lookup_symbol("_cpu_NMI_interrupt");
// pmRyzen_symtable._NMIPI_enable = lookup_symbol("_NMIPI_enable");
// pmRyzen_symtable._i386_cpu_IPI = lookup_symbol("_i386_cpu_IPI");
// pmRyzen_symtable_ready = 1;
// IOLog("AMDCPUSupport::enter link finished.\n");

return KERN_SUCCESS;
}

EXPORT extern "C" kern_return_t ADDPR(kern_stop)(kmod_info_t *, void *) {
EXPORT extern "C" kern_return_t amdryzencpupm_kern_stop(kmod_info_t *, void *) {
// It is not safe to unload VirtualSMC plugins!
return KERN_FAILURE;
}
Expand Down
18 changes: 13 additions & 5 deletions AMDRyzenCPUPowerManagement/AMDRyzenCPUPowerManagement.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,24 @@
#include <i386/proc_reg.h>
#include <libkern/libkern.h>

#include <Headers/kern_efi.hpp>

#include <Headers/kern_efi.hpp>
#include <Headers/kern_util.hpp>
#include <Headers/kern_cpu.hpp>
#include <Headers/kern_time.hpp>

#include <VirtualSMCSDK/kern_vsmcapi.hpp>
#include <VirtualSMCSDK/AppleSmc.h>


#include <Headers/kern_api.hpp>
#define LILU_CUSTOM_KMOD_INIT
#define LILU_CUSTOM_IOKIT_INIT
#include <Headers/plugin_start.hpp>
#include "symresolver/kernel_resolver.h"

#include "SuperIO/ISSuperIONCT668X.hpp"
#include "SuperIO/ISSuperIONCT67XXFamily.hpp"
#include "SuperIO/ISSuperIOIT86XXEFamily.hpp"

#include "Headers/pmRyzenSymbolTable.h"

#include <i386/cpuid.h>

#define OC_OEM_VENDOR_VARIABLE_NAME u"oem-vendor"
Expand Down Expand Up @@ -60,6 +62,9 @@ void i386_deactivate_cpu(void);
void pmRyzen_wrmsr_safe(void *, uint32_t, uint64_t);
uint64_t pmRyzen_rdmsr_safe(void *, uint32_t);



extern pmRyzen_symtable_t pmRyzen_symtable;
};


Expand Down Expand Up @@ -249,6 +254,9 @@ class AMDRyzenCPUPowerManagement : public IOService {
CPUInfo::CpuTopology cpuTopology {};

IOPCIDevice *fIOPCIDevice;

KernelPatcher *liluKernelPatcher;

bool getPCIService();
bool wentToSleep;

Expand Down
26 changes: 26 additions & 0 deletions AMDRyzenCPUPowerManagement/Headers/pmRyzenSymbolTable.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
//
// pmRyzenSymbolTable.c
// AMDRyzenCPUPowerManagement
//
// Created by Qi HaoYan on 9/2/20.
// Copyright © 2020 trulyspinach. All rights reserved.
//



#ifndef pmRyzenSymbolTable_h
#define pmRyzenSymbolTable_h

typedef struct pmRyzen_symtable {
void* _wrmsr_carefully;
void* _KUNCUserNotificationDisplayAlert;
void* _cpu_to_processor;
void* _tscFreq;
void* _pmDispatch;
void* _pmUnRegister;
void* _cpu_NMI_interrupt;
void* _NMIPI_enable;
void* _i386_cpu_IPI;
} pmRyzen_symtable_t;

#endif
2 changes: 1 addition & 1 deletion AMDRyzenCPUPowerManagement/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
<key>OSBundleLibraries</key>
<dict>
<key>as.vit9696.Lilu</key>
<string>1.3.9</string>
<string>1.4.6</string>
<key>com.apple.iokit.IOPCIFamily</key>
<string>2.9</string>
<key>com.apple.kec.Libm</key>
Expand Down
24 changes: 15 additions & 9 deletions AMDRyzenCPUPowerManagement/pmAMDRyzen.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,11 @@ pmDispatch_t pmRyzen_cpuFuncs = {
.GetDeadline = 0,
.SetDeadline = 0,
.Deadline = 0,
#ifdef PMRYZEN_IDLE_MWAIT
.exitIdle = &pmRyzen_exit_idle,
#else
.exitIdle = 0,
#endif
.markCPURunning = 0,
.pmCPUControl = 0,
.pmCPUHalt = 0,
Expand Down Expand Up @@ -145,18 +149,19 @@ void pmRyzen_init(void *handle){
pmRyzen_io_service_handle = handle;


void **kernelDisp = lookup_symbol("_pmDispatch");
pmRyzen_pmUnRegister = (void(*)(pmDispatch_t*))lookup_symbol("_pmUnRegister");
pmRyzen_cpu_NMI = (void(*)(int))lookup_symbol("_cpu_NMI_interrupt");
pmRyzen_NMI_enabled = (void(*)(boolean_t))lookup_symbol("_NMIPI_enable");
pmRyzen_cpu_IPI = (void(*)(boolean_t))lookup_symbol("_i386_cpu_IPI");
pmRyzen_tsc_freq = *((uint64_t*)lookup_symbol("_tscFreq"));
void **kernelDisp = pmRyzen_symtable._pmDispatch;
pmRyzen_pmUnRegister = (void(*)(pmDispatch_t*))pmRyzen_symtable._pmUnRegister;
pmRyzen_cpu_NMI = (void(*)(int))pmRyzen_symtable._cpu_NMI_interrupt;
pmRyzen_NMI_enabled = (void(*)(boolean_t))pmRyzen_symtable._NMIPI_enable;
pmRyzen_cpu_IPI = (void(*)(boolean_t))pmRyzen_symtable._i386_cpu_IPI;
pmRyzen_tsc_freq = *((uint64_t*)pmRyzen_symtable._tscFreq);



pmCallBacks_t cb;
if(*kernelDisp)(*pmRyzen_pmUnRegister)(*kernelDisp);
pmKextRegister(PM_DISPATCH_VERSION, &pmRyzen_cpuFuncs, &cb);
// pmKextRegister(PM_DISPATCH_VERSION, NULL, &cb);

x86_pkg_t * pkg = cb.GetPkgRoot();
int pkgCount = 0;
Expand Down Expand Up @@ -351,9 +356,9 @@ boolean_t pmRyzen_exit_idle(x86_lcpu_t *lcpu){
pmProcessor_t *target = &pmRyzen_cpus[lcpu->cpu_num];

// Exit if cpu is already awake.
if(target->cpu_awake) return false;
// if(target->cpu_awake) return false;

pmRyzen_exit_idle_c++;
// pmRyzen_exit_idle_c++;

#ifdef PMRYZEN_IDLE_MWAIT
uint64_t start_tsc = rdtsc64();
Expand All @@ -374,7 +379,8 @@ boolean_t pmRyzen_exit_idle(x86_lcpu_t *lcpu){

#else
target->arm_flag = 1;
pmRyzen_exit_idle_ipi_c++;
// pmRyzen_exit_idle_ipi_c++;


return true;
#endif
Expand Down
4 changes: 3 additions & 1 deletion AMDRyzenCPUPowerManagement/pmAMDRyzen.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include "symresolver/kernel_resolver.h"

#include <i386/proc_reg.h>

#include "Headers/pmRyzenSymbolTable.h"

#define MOD_NAME pmARyzen
#define XNU_MAX_CPU 64
Expand Down Expand Up @@ -51,8 +51,10 @@ extern uint32_t pmRyzen_hpcpus;

extern uint32_t pmRyzen_pstatelimit;


extern void pmRyzen_wrmsr_safe(void *, uint32_t, uint64_t);
extern uint64_t pmRyzen_rdmsr_safe(void *, uint32_t);
extern pmRyzen_symtable_t pmRyzen_symtable;


typedef struct pmProcessor{
Expand Down
Loading

0 comments on commit f32a371

Please sign in to comment.