mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
[orbis-kernel] implement kern.cpumode ioctl
This commit is contained in:
parent
00a1849a0b
commit
5edfdb037c
|
|
@ -19,7 +19,7 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
sdk_version,
|
sdk_version,
|
||||||
sched_cpusetsize,
|
sched_cpusetsize,
|
||||||
proc_ptc,
|
proc_ptc,
|
||||||
|
cpu_mode,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum sysctl_hw {
|
enum sysctl_hw {
|
||||||
|
|
@ -32,7 +32,7 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
};
|
};
|
||||||
|
|
||||||
// for (unsigned int i = 0; i < namelen; ++i) {
|
// for (unsigned int i = 0; i < namelen; ++i) {
|
||||||
// std::printf(" name[%u] = %u\n", i, name[i]);
|
// std::fprintf(stderr, " name[%u] = %u\n", i, name[i]);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (namelen == 3) {
|
if (namelen == 3) {
|
||||||
|
|
@ -70,7 +70,7 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
case sysctl_ctl::unspec: {
|
case sysctl_ctl::unspec: {
|
||||||
switch (name[1]) {
|
switch (name[1]) {
|
||||||
case 3: {
|
case 3: {
|
||||||
std::printf(" unspec - get name of '%s'\n",
|
std::fprintf(stderr, " unspec - get name of '%s'\n",
|
||||||
std::string((char *)new_, newlen).c_str());
|
std::string((char *)new_, newlen).c_str());
|
||||||
auto searchName = std::string_view((char *)new_, newlen);
|
auto searchName = std::string_view((char *)new_, newlen);
|
||||||
auto *dest = (std::uint32_t *)old;
|
auto *dest = (std::uint32_t *)old;
|
||||||
|
|
@ -78,6 +78,7 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
|
|
||||||
if (searchName == "kern.smp.cpus") {
|
if (searchName == "kern.smp.cpus") {
|
||||||
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
||||||
|
std::fprintf(stderr, " %s error\n", searchName.data());
|
||||||
return ErrorCode::INVAL;
|
return ErrorCode::INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -85,6 +86,7 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
dest[count++] = smp_cpus;
|
dest[count++] = smp_cpus;
|
||||||
} else if (searchName == "machdep.tsc_freq") {
|
} else if (searchName == "machdep.tsc_freq") {
|
||||||
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
||||||
|
std::fprintf(stderr, " %s error\n", searchName.data());
|
||||||
return ErrorCode::INVAL;
|
return ErrorCode::INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -92,6 +94,7 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
dest[count++] = tsc_freq;
|
dest[count++] = tsc_freq;
|
||||||
} else if (searchName == "kern.sdk_version") {
|
} else if (searchName == "kern.sdk_version") {
|
||||||
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
||||||
|
std::fprintf(stderr, " %s error\n", searchName.data());
|
||||||
return ErrorCode::INVAL;
|
return ErrorCode::INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,6 +102,7 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
dest[count++] = sdk_version;
|
dest[count++] = sdk_version;
|
||||||
} else if (searchName == "kern.sched.cpusetsize") {
|
} else if (searchName == "kern.sched.cpusetsize") {
|
||||||
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
||||||
|
std::fprintf(stderr, " %s error\n", searchName.data());
|
||||||
return ErrorCode::INVAL;
|
return ErrorCode::INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -106,15 +110,24 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
dest[count++] = sched_cpusetsize;
|
dest[count++] = sched_cpusetsize;
|
||||||
} else if (searchName == "kern.proc.ptc") {
|
} else if (searchName == "kern.proc.ptc") {
|
||||||
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
||||||
std::printf(" kern.proc.ptc error\n");
|
std::fprintf(stderr, " %s error\n", searchName.data());
|
||||||
return ErrorCode::INVAL;
|
return ErrorCode::INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dest[count++] = kern;
|
dest[count++] = kern;
|
||||||
dest[count++] = proc_ptc;
|
dest[count++] = proc_ptc;
|
||||||
|
} else if (searchName == "kern.cpumode") {
|
||||||
|
if (*oldlenp < 2 * sizeof(uint32_t)) {
|
||||||
|
std::fprintf(stderr, " %s error\n", searchName.data());
|
||||||
|
return ErrorCode::INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
dest[count++] = kern;
|
||||||
|
dest[count++] = cpu_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count == 0) {
|
if (count == 0) {
|
||||||
|
std::fprintf(stderr, " %s is unknown\n", searchName.data());
|
||||||
return ErrorCode::SRCH;
|
return ErrorCode::SRCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -198,6 +211,19 @@ orbis::SysResult orbis::sys___sysctl(Thread *thread, ptr<sint> name,
|
||||||
}
|
}
|
||||||
|
|
||||||
*(std::uint64_t *)old = 1357;
|
*(std::uint64_t *)old = 1357;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case sysctl_kern::cpu_mode: {
|
||||||
|
if (*oldlenp != 4 || new_ != nullptr || newlen != 0) {
|
||||||
|
return ErrorCode::INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 - 6 cpu
|
||||||
|
// 1 - 7 cpu, low power
|
||||||
|
// 5 - 7 cpu, normal
|
||||||
|
*(std::uint32_t *)old = 5;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue