More clang fixes.

This commit is contained in:
Ben Vanik 2015-07-19 20:46:14 -07:00
parent 12a29371e3
commit bebda48a4f
12 changed files with 89 additions and 102 deletions

View File

@ -224,12 +224,12 @@ void KernelState::SetExecutableModule(object_ref<XUserModule> module) {
} }
// Setup the kernel's XexExecutableModuleHandle field. // Setup the kernel's XexExecutableModuleHandle field.
auto export = processor()->export_resolver()->GetExportByOrdinal( auto export_entry = processor()->export_resolver()->GetExportByOrdinal(
"xboxkrnl.exe", ordinals::XexExecutableModuleHandle); "xboxkrnl.exe", ordinals::XexExecutableModuleHandle);
if (export) { if (export_entry) {
assert_not_zero(export->variable_ptr); assert_not_zero(export_entry->variable_ptr);
auto variable_ptr = auto variable_ptr = memory()->TranslateVirtual<xe::be<uint32_t>*>(
memory()->TranslateVirtual<xe::be<uint32_t>*>(export->variable_ptr); export_entry->variable_ptr);
*variable_ptr = executable_module_->hmodule_ptr(); *variable_ptr = executable_module_->hmodule_ptr();
} }
@ -548,7 +548,6 @@ void KernelState::CompleteOverlappedDeferredEx(
xe::threading::Sleep( xe::threading::Sleep(
std::chrono::milliseconds::duration(kDeferredOverlappedDelayMillis)); std::chrono::milliseconds::duration(kDeferredOverlappedDelayMillis));
completion_callback(); completion_callback();
auto ptr = memory()->TranslateVirtual(overlapped_ptr);
CompleteOverlappedEx(overlapped_ptr, result, extended_error, length); CompleteOverlappedEx(overlapped_ptr, result, extended_error, length);
}); });
dispatch_cond_.notify_all(); dispatch_cond_.notify_all();

View File

@ -28,23 +28,23 @@ XKernelModule::XKernelModule(KernelState* kernel_state, const char* path)
XKernelModule::~XKernelModule() {} XKernelModule::~XKernelModule() {}
uint32_t XKernelModule::GetProcAddressByOrdinal(uint16_t ordinal) { uint32_t XKernelModule::GetProcAddressByOrdinal(uint16_t ordinal) {
auto export = export_resolver_->GetExportByOrdinal(name(), ordinal); auto export_entry = export_resolver_->GetExportByOrdinal(name(), ordinal);
if (!export) { if (!export_entry) {
// Export (or its parent library) not found. // Export (or its parent library) not found.
return 0; return 0;
} }
if (export->type == cpu::Export::Type::kVariable) { if (export_entry->type == cpu::Export::Type::kVariable) {
if (export->variable_ptr) { if (export_entry->variable_ptr) {
return export->variable_ptr; return export_entry->variable_ptr;
} else { } else {
XELOGW( XELOGW(
"ERROR: var export referenced GetProcAddressByOrdinal(%.4X(%s)) is " "ERROR: var export referenced GetProcAddressByOrdinal(%.4X(%s)) is "
"not implemented", "not implemented",
ordinal, export->name); ordinal, export_entry->name);
return 0; return 0;
} }
} else { } else {
if (export->function_data.shim) { if (export_entry->function_data.shim) {
// Implemented. Dynamically generate trampoline. // Implemented. Dynamically generate trampoline.
XELOGE("GetProcAddressByOrdinal not implemented"); XELOGE("GetProcAddressByOrdinal not implemented");
return 0; return 0;
@ -53,7 +53,7 @@ uint32_t XKernelModule::GetProcAddressByOrdinal(uint16_t ordinal) {
XELOGW( XELOGW(
"ERROR: fn export referenced GetProcAddressByOrdinal(%.4X(%s)) is " "ERROR: fn export referenced GetProcAddressByOrdinal(%.4X(%s)) is "
"not implemented", "not implemented",
ordinal, export->name); ordinal, export_entry->name);
return 0; return 0;
} }
} }

View File

@ -45,14 +45,7 @@ XThread::XThread(KernelState* kernel_state, uint32_t stack_size,
bool guest_thread) bool guest_thread)
: XObject(kernel_state, kTypeThread), : XObject(kernel_state, kTypeThread),
thread_id_(++next_xthread_id), thread_id_(++next_xthread_id),
pcr_address_(0), guest_thread_(guest_thread) {
thread_state_address_(0),
thread_state_(0),
priority_(0),
affinity_(0),
irql_(0),
guest_thread_(guest_thread),
running_(false) {
creation_params_.stack_size = stack_size; creation_params_.stack_size = stack_size;
creation_params_.xapi_thread_startup = xapi_thread_startup; creation_params_.xapi_thread_startup = xapi_thread_startup;
creation_params_.start_address = start_address; creation_params_.start_address = start_address;

View File

@ -141,27 +141,27 @@ class XThread : public XObject {
uint32_t start_address; uint32_t start_address;
uint32_t start_context; uint32_t start_context;
uint32_t creation_flags; uint32_t creation_flags;
} creation_params_; } creation_params_ = {0};
uint32_t thread_id_; uint32_t thread_id_ = 0;
std::unique_ptr<xe::threading::Thread> thread_; std::unique_ptr<xe::threading::Thread> thread_;
uint32_t scratch_address_; uint32_t scratch_address_ = 0;
uint32_t scratch_size_; uint32_t scratch_size_ = 0;
uint32_t tls_address_; uint32_t tls_address_ = 0;
uint32_t pcr_address_; uint32_t pcr_address_ = 0;
uint32_t thread_state_address_; uint32_t thread_state_address_ = 0;
cpu::ThreadState* thread_state_; cpu::ThreadState* thread_state_ = nullptr;
bool guest_thread_; // Launched into guest code? bool guest_thread_ = false; // Launched into guest code.
bool running_; bool running_ = false;
std::string name_; std::string name_;
int32_t priority_; int32_t priority_ = 0;
uint32_t affinity_; uint32_t affinity_ = 0;
std::atomic<uint32_t> irql_; std::atomic<uint32_t> irql_;
xe::mutex apc_lock_; xe::mutex apc_lock_;
NativeList* apc_list_; NativeList* apc_list_ = nullptr;
}; };
class XHostThread : public XThread { class XHostThread : public XThread {

View File

@ -22,8 +22,6 @@ XTimer::~XTimer() = default;
void XTimer::Initialize(uint32_t timer_type) { void XTimer::Initialize(uint32_t timer_type) {
assert_false(timer_); assert_false(timer_);
bool manual_reset = false;
switch (timer_type) { switch (timer_type) {
case 0: // NotificationTimer case 0: // NotificationTimer
timer_ = xe::threading::Timer::CreateManualResetTimer(); timer_ = xe::threading::Timer::CreateManualResetTimer();

View File

@ -107,41 +107,40 @@ class Param {
Param() : ordinal_(-1) {} Param() : ordinal_(-1) {}
explicit Param(Init& init) : ordinal_(--init.ordinal) {} explicit Param(Init& init) : ordinal_(--init.ordinal) {}
template <typename V>
void LoadValue(Init& init, V* out_value) {
if (ordinal_ <= 7) {
*out_value = V(init.ppc_context->r[3 + ordinal_]);
} else {
uint32_t stack_ptr =
uint32_t(init.ppc_context->r[1]) + 0x54 + (ordinal_ - 7) * 8;
*out_value =
xe::load_and_swap<V>(init.ppc_context->virtual_membase + stack_ptr);
}
}
int ordinal_; int ordinal_;
}; };
template <>
inline void Param::LoadValue<float>(Param::Init& init, float* out_value) {
*out_value = float(init.ppc_context->f[1 + ++init.float_ordinal]);
}
template <>
inline void Param::LoadValue<double>(Param::Init& init, double* out_value) {
*out_value = init.ppc_context->f[1 + ++init.float_ordinal];
}
template <typename T> template <typename T>
class ParamBase : public Param { class ParamBase : public Param {
public: public:
ParamBase() : Param(), value_(0) {} ParamBase() : Param(), value_(0) {}
ParamBase(T value) : Param(), value_(value) {} ParamBase(T value) : Param(), value_(value) {}
ParamBase(Init& init) : Param(init) { LoadValue<T>(init); } ParamBase(Init& init) : Param(init) { LoadValue<T>(init, &value_); }
ParamBase& operator=(const T& other) { ParamBase& operator=(const T& other) {
value_ = other; value_ = other;
return *this; return *this;
} }
operator T() const { return value_; } operator T() const { return value_; }
private:
template <typename V>
void LoadValue(Init& init) {
if (ordinal_ <= 7) {
value_ = V(init.ppc_context->r[3 + ordinal_]);
} else {
uint32_t stack_ptr =
uint32_t(init.ppc_context->r[1]) + 0x54 + (ordinal_ - 7) * 8;
value_ =
xe::load_and_swap<T>(init.ppc_context->virtual_membase + stack_ptr);
}
}
template <>
void LoadValue<float>(Init& init) {
value_ = init.ppc_context->f[1 + ++init.float_ordinal];
}
template <>
void LoadValue<double>(Init& init) {
value_ = init.ppc_context->f[1 + ++init.float_ordinal];
}
protected: protected:
T value_; T value_;
}; };
@ -365,34 +364,34 @@ enum class KernelModuleId {
template <size_t I = 0, typename... Ps> template <size_t I = 0, typename... Ps>
typename std::enable_if<I == sizeof...(Ps)>::type AppendKernelCallParams( typename std::enable_if<I == sizeof...(Ps)>::type AppendKernelCallParams(
StringBuffer& string_buffer, xe::cpu::Export* export, StringBuffer& string_buffer, xe::cpu::Export* export_entry,
const std::tuple<Ps...>&) {} const std::tuple<Ps...>&) {}
template <size_t I = 0, typename... Ps> template <size_t I = 0, typename... Ps>
typename std::enable_if < typename std::enable_if <
I<sizeof...(Ps)>::type AppendKernelCallParams( I<sizeof...(Ps)>::type AppendKernelCallParams(
StringBuffer& string_buffer, xe::cpu::Export* export, StringBuffer& string_buffer, xe::cpu::Export* export_entry,
const std::tuple<Ps...>& params) { const std::tuple<Ps...>& params) {
if (I) { if (I) {
string_buffer.Append(", "); string_buffer.Append(", ");
} }
auto param = std::get<I>(params); auto param = std::get<I>(params);
AppendParam(string_buffer, param); AppendParam(string_buffer, param);
AppendKernelCallParams<I + 1>(string_buffer, export, params); AppendKernelCallParams<I + 1>(string_buffer, export_entry, params);
} }
StringBuffer* thread_local_string_buffer(); StringBuffer* thread_local_string_buffer();
template <typename Tuple> template <typename Tuple>
void PrintKernelCall(cpu::Export* export, const Tuple& params) { void PrintKernelCall(cpu::Export* export_entry, const Tuple& params) {
auto& string_buffer = *thread_local_string_buffer(); auto& string_buffer = *thread_local_string_buffer();
string_buffer.Reset(); string_buffer.Reset();
string_buffer.Append(export->name); string_buffer.Append(export_entry->name);
string_buffer.Append('('); string_buffer.Append('(');
AppendKernelCallParams(string_buffer, export, params); AppendKernelCallParams(string_buffer, export_entry, params);
string_buffer.Append(')'); string_buffer.Append(')');
auto str = string_buffer.GetString(); auto str = string_buffer.GetString();
if (export->tags & ExportTag::kImportant) { if (export_entry->tags & ExportTag::kImportant) {
XELOGI(str); XELOGI(str);
} else { } else {
XELOGD(str); XELOGD(str);
@ -407,56 +406,56 @@ auto KernelTrampoline(F&& f, Tuple&& t, std::index_sequence<I...>) {
template <KernelModuleId MODULE, uint16_t ORDINAL, typename R, typename... Ps> template <KernelModuleId MODULE, uint16_t ORDINAL, typename R, typename... Ps>
xe::cpu::Export* RegisterExport(R (*fn)(Ps&...), const char* name, xe::cpu::Export* RegisterExport(R (*fn)(Ps&...), const char* name,
xe::cpu::ExportTag::type tags) { xe::cpu::ExportTag::type tags) {
static const auto export = static const auto export_entry =
new cpu::Export(ORDINAL, xe::cpu::Export::Type::kFunction, name, new cpu::Export(ORDINAL, xe::cpu::Export::Type::kFunction, name,
tags | ExportTag::kImplemented | ExportTag::kLog); tags | ExportTag::kImplemented | ExportTag::kLog);
static R (*FN)(Ps&...) = fn; static R (*FN)(Ps&...) = fn;
struct X { struct X {
static void Trampoline(PPCContext* ppc_context) { static void Trampoline(PPCContext* ppc_context) {
++export->function_data.call_count; ++export_entry->function_data.call_count;
Param::Init init = { Param::Init init = {
ppc_context, sizeof...(Ps), 0, ppc_context, sizeof...(Ps), 0,
}; };
auto params = std::make_tuple<Ps...>(Ps(init)...); auto params = std::make_tuple<Ps...>(Ps(init)...);
if (export->tags & ExportTag::kLog) { if (export_entry->tags & ExportTag::kLog) {
PrintKernelCall(export, params); PrintKernelCall(export_entry, params);
} }
auto result = auto result =
KernelTrampoline(FN, std::forward<std::tuple<Ps...>>(params), KernelTrampoline(FN, std::forward<std::tuple<Ps...>>(params),
std::make_index_sequence<sizeof...(Ps)>()); std::make_index_sequence<sizeof...(Ps)>());
result.Store(ppc_context); result.Store(ppc_context);
if (export->tags & (ExportTag::kLog | ExportTag::kLogResult)) { if (export_entry->tags & (ExportTag::kLog | ExportTag::kLogResult)) {
// TODO(benvanik): log result. // TODO(benvanik): log result.
} }
} }
}; };
export->function_data.trampoline = &X::Trampoline; export_entry->function_data.trampoline = &X::Trampoline;
return export; return export_entry;
} }
template <KernelModuleId MODULE, uint16_t ORDINAL, typename... Ps> template <KernelModuleId MODULE, uint16_t ORDINAL, typename... Ps>
xe::cpu::Export* RegisterExport(void (*fn)(Ps&...), const char* name, xe::cpu::Export* RegisterExport(void (*fn)(Ps&...), const char* name,
xe::cpu::ExportTag::type tags) { xe::cpu::ExportTag::type tags) {
static const auto export = static const auto export_entry =
new cpu::Export(ORDINAL, xe::cpu::Export::Type::kFunction, name, new cpu::Export(ORDINAL, xe::cpu::Export::Type::kFunction, name,
tags | ExportTag::kImplemented | ExportTag::kLog); tags | ExportTag::kImplemented | ExportTag::kLog);
static void (*FN)(Ps&...) = fn; static void (*FN)(Ps&...) = fn;
struct X { struct X {
static void Trampoline(PPCContext* ppc_context) { static void Trampoline(PPCContext* ppc_context) {
++export->function_data.call_count; ++export_entry->function_data.call_count;
Param::Init init = { Param::Init init = {
ppc_context, sizeof...(Ps), ppc_context, sizeof...(Ps),
}; };
auto params = std::make_tuple<Ps...>(Ps(init)...); auto params = std::make_tuple<Ps...>(Ps(init)...);
if (export->tags & ExportTag::kLog) { if (export_entry->tags & ExportTag::kLog) {
PrintKernelCall(export, params); PrintKernelCall(export_entry, params);
} }
KernelTrampoline(FN, std::forward<std::tuple<Ps...>>(params), KernelTrampoline(FN, std::forward<std::tuple<Ps...>>(params),
std::make_index_sequence<sizeof...(Ps)>()); std::make_index_sequence<sizeof...(Ps)>());
} }
}; };
export->function_data.trampoline = &X::Trampoline; export_entry->function_data.trampoline = &X::Trampoline;
return export; return export_entry;
} }
} // namespace shim } // namespace shim

View File

@ -37,10 +37,10 @@ XamModule::XamModule(Emulator* emulator, KernelState* kernel_state)
std::vector<xe::cpu::Export*> xam_exports(4096); std::vector<xe::cpu::Export*> xam_exports(4096);
xe::cpu::Export* RegisterExport_xam(xe::cpu::Export* export) { xe::cpu::Export* RegisterExport_xam(xe::cpu::Export* export_entry) {
assert_true(export->ordinal < xam_exports.size()); assert_true(export_entry->ordinal < xam_exports.size());
xam_exports[export->ordinal] = export; xam_exports[export_entry->ordinal] = export_entry;
return export; return export_entry;
} }
void XamModule::RegisterExportTable(xe::cpu::ExportResolver* export_resolver) { void XamModule::RegisterExportTable(xe::cpu::ExportResolver* export_resolver) {
@ -53,10 +53,10 @@ void XamModule::RegisterExportTable(xe::cpu::ExportResolver* export_resolver) {
}; };
#include "xenia/kernel/util/export_table_post.inc" #include "xenia/kernel/util/export_table_post.inc"
for (size_t i = 0; i < xe::countof(xam_export_table); ++i) { for (size_t i = 0; i < xe::countof(xam_export_table); ++i) {
auto& export = xam_export_table[i]; auto& export_entry = xam_export_table[i];
assert_true(export.ordinal < xam_exports.size()); assert_true(export_entry.ordinal < xam_exports.size());
if (!xam_exports[export.ordinal]) { if (!xam_exports[export_entry.ordinal]) {
xam_exports[export.ordinal] = &export; xam_exports[export_entry.ordinal] = &export_entry;
} }
} }
export_resolver->RegisterTable("xam.xex", &xam_exports); export_resolver->RegisterTable("xam.xex", &xam_exports);

View File

@ -18,7 +18,7 @@ namespace kernel {
class KernelState; class KernelState;
xe::cpu::Export* RegisterExport_xam(xe::cpu::Export* export); xe::cpu::Export* RegisterExport_xam(xe::cpu::Export* export_entry);
namespace xam { namespace xam {
// Registration functions, one per file. // Registration functions, one per file.

View File

@ -280,9 +280,8 @@ SHIM_CALL XamUserWriteProfileSettings_shim(PPCContext* ppc_context,
return; return;
} }
const auto& user_profile = kernel_state->user_profile();
// TODO: Update and save settings. // TODO: Update and save settings.
// const auto& user_profile = kernel_state->user_profile();
if (overlapped_ptr) { if (overlapped_ptr) {
kernel_state->CompleteOverlappedImmediate(overlapped_ptr, X_ERROR_SUCCESS); kernel_state->CompleteOverlappedImmediate(overlapped_ptr, X_ERROR_SUCCESS);

View File

@ -139,10 +139,10 @@ XboxkrnlModule::XboxkrnlModule(Emulator* emulator, KernelState* kernel_state)
std::vector<xe::cpu::Export*> xboxkrnl_exports(4096); std::vector<xe::cpu::Export*> xboxkrnl_exports(4096);
xe::cpu::Export* RegisterExport_xboxkrnl(xe::cpu::Export* export) { xe::cpu::Export* RegisterExport_xboxkrnl(xe::cpu::Export* export_entry) {
assert_true(export->ordinal < xboxkrnl_exports.size()); assert_true(export_entry->ordinal < xboxkrnl_exports.size());
xboxkrnl_exports[export->ordinal] = export; xboxkrnl_exports[export_entry->ordinal] = export_entry;
return export; return export_entry;
} }
void XboxkrnlModule::RegisterExportTable( void XboxkrnlModule::RegisterExportTable(
@ -156,10 +156,10 @@ void XboxkrnlModule::RegisterExportTable(
}; };
#include "xenia/kernel/util/export_table_post.inc" #include "xenia/kernel/util/export_table_post.inc"
for (size_t i = 0; i < xe::countof(xboxkrnl_export_table); ++i) { for (size_t i = 0; i < xe::countof(xboxkrnl_export_table); ++i) {
auto& export = xboxkrnl_export_table[i]; auto& export_entry = xboxkrnl_export_table[i];
assert_true(export.ordinal < xboxkrnl_exports.size()); assert_true(export_entry.ordinal < xboxkrnl_exports.size());
if (!xboxkrnl_exports[export.ordinal]) { if (!xboxkrnl_exports[export_entry.ordinal]) {
xboxkrnl_exports[export.ordinal] = &export; xboxkrnl_exports[export_entry.ordinal] = &export_entry;
} }
} }
export_resolver->RegisterTable("xboxkrnl.exe", &xboxkrnl_exports); export_resolver->RegisterTable("xboxkrnl.exe", &xboxkrnl_exports);

View File

@ -17,7 +17,7 @@ namespace kernel {
class KernelState; class KernelState;
xe::cpu::Export* RegisterExport_xboxkrnl(xe::cpu::Export* export); xe::cpu::Export* RegisterExport_xboxkrnl(xe::cpu::Export* export_entry);
namespace xboxkrnl { namespace xboxkrnl {
// Registration functions, one per file. // Registration functions, one per file.

View File

@ -343,8 +343,8 @@ SHIM_CALL KeDelayExecutionThread_shim(PPCContext* ppc_context,
SHIM_CALL NtYieldExecution_shim(PPCContext* ppc_context, SHIM_CALL NtYieldExecution_shim(PPCContext* ppc_context,
KernelState* kernel_state) { KernelState* kernel_state) {
// XELOGD("NtYieldExecution()"); // XELOGD("NtYieldExecution()");
XThread* thread = XThread::GetCurrentThread(); auto thread = XThread::GetCurrentThread();
X_STATUS result = thread->Delay(0, 0, 0); thread->Delay(0, 0, 0);
SHIM_SET_RETURN_32(0); SHIM_SET_RETURN_32(0);
} }
@ -355,7 +355,6 @@ SHIM_CALL KeQuerySystemTime_shim(PPCContext* ppc_context,
XELOGD("KeQuerySystemTime(%.8X)", time_ptr); XELOGD("KeQuerySystemTime(%.8X)", time_ptr);
uint64_t time = Clock::QueryGuestSystemTime(); uint64_t time = Clock::QueryGuestSystemTime();
if (time_ptr) { if (time_ptr) {
SHIM_SET_MEM_64(time_ptr, time); SHIM_SET_MEM_64(time_ptr, time);
} }