mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
htc: ObserverThread (mostly), system now boots + works with htc in bg
This commit is contained in:
parent
79a3f442d6
commit
4d86863f2c
6 changed files with 83 additions and 7 deletions
|
@ -34,7 +34,7 @@ namespace ams::boot2 {
|
||||||
constexpr size_t NumPreSdCardLaunchPrograms = util::size(PreSdCardLaunchPrograms);
|
constexpr size_t NumPreSdCardLaunchPrograms = util::size(PreSdCardLaunchPrograms);
|
||||||
|
|
||||||
constexpr ncm::SystemProgramId AdditionalLaunchPrograms[] = {
|
constexpr ncm::SystemProgramId AdditionalLaunchPrograms[] = {
|
||||||
ncm::SystemProgramId::Tma, /* tma */
|
ncm::SystemProgramId::Htc, /* htc */ /* TODO: should we do boot!use_htc_gen2, with default to on in custom settings? */
|
||||||
ncm::SystemProgramId::Am, /* am */
|
ncm::SystemProgramId::Am, /* am */
|
||||||
ncm::SystemProgramId::NvServices, /* nvservices */
|
ncm::SystemProgramId::NvServices, /* nvservices */
|
||||||
ncm::SystemProgramId::NvnFlinger, /* nvnflinger */
|
ncm::SystemProgramId::NvnFlinger, /* nvnflinger */
|
||||||
|
@ -80,7 +80,7 @@ namespace ams::boot2 {
|
||||||
constexpr size_t NumAdditionalLaunchPrograms = util::size(AdditionalLaunchPrograms);
|
constexpr size_t NumAdditionalLaunchPrograms = util::size(AdditionalLaunchPrograms);
|
||||||
|
|
||||||
constexpr ncm::SystemProgramId AdditionalMaintenanceLaunchPrograms[] = {
|
constexpr ncm::SystemProgramId AdditionalMaintenanceLaunchPrograms[] = {
|
||||||
ncm::SystemProgramId::Tma, /* tma */
|
ncm::SystemProgramId::Htc, /* htc */
|
||||||
ncm::SystemProgramId::Am, /* am */
|
ncm::SystemProgramId::Am, /* am */
|
||||||
ncm::SystemProgramId::NvServices, /* nvservices */
|
ncm::SystemProgramId::NvServices, /* nvservices */
|
||||||
ncm::SystemProgramId::NvnFlinger, /* nvnflinger */
|
ncm::SystemProgramId::NvnFlinger, /* nvnflinger */
|
||||||
|
|
|
@ -195,4 +195,15 @@ namespace ams::htc::server {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
os::EventType *HtcmiscImpl::GetConnectionEvent() const {
|
||||||
|
return m_connection_event.GetBase();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HtcmiscImpl::IsConnected() const {
|
||||||
|
/* Lock ourselves. */
|
||||||
|
std::scoped_lock lk(m_connection_mutex);
|
||||||
|
|
||||||
|
return m_connected;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,11 +33,11 @@ namespace ams::htc::server {
|
||||||
os::ThreadType m_server_thread;
|
os::ThreadType m_server_thread;
|
||||||
os::Event m_cancel_event;
|
os::Event m_cancel_event;
|
||||||
bool m_cancelled;
|
bool m_cancelled;
|
||||||
os::Event m_connection_event;
|
mutable os::Event m_connection_event;
|
||||||
bool m_client_connected;
|
bool m_client_connected;
|
||||||
bool m_server_connected;
|
bool m_server_connected;
|
||||||
bool m_connected;
|
bool m_connected;
|
||||||
os::SdkMutex m_connection_mutex;
|
mutable os::SdkMutex m_connection_mutex;
|
||||||
private:
|
private:
|
||||||
static void ClientThreadEntry(void *arg) { static_cast<HtcmiscImpl *>(arg)->ClientThread(); }
|
static void ClientThreadEntry(void *arg) { static_cast<HtcmiscImpl *>(arg)->ClientThread(); }
|
||||||
static void ServerThreadEntry(void *arg) { static_cast<HtcmiscImpl *>(arg)->ServerThread(); }
|
static void ServerThreadEntry(void *arg) { static_cast<HtcmiscImpl *>(arg)->ServerThread(); }
|
||||||
|
@ -47,6 +47,9 @@ namespace ams::htc::server {
|
||||||
public:
|
public:
|
||||||
HtcmiscImpl(htclow::HtclowManager *htclow_manager);
|
HtcmiscImpl(htclow::HtclowManager *htclow_manager);
|
||||||
~HtcmiscImpl();
|
~HtcmiscImpl();
|
||||||
|
|
||||||
|
os::EventType *GetConnectionEvent() const;
|
||||||
|
bool IsConnected() const;
|
||||||
private:
|
private:
|
||||||
void SetClientConnectionEvent(bool en);
|
void SetClientConnectionEvent(bool en);
|
||||||
void SetServerConnectionEvent(bool en);
|
void SetServerConnectionEvent(bool en);
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace ams::htc::server {
|
||||||
m_is_service_available(false)
|
m_is_service_available(false)
|
||||||
{
|
{
|
||||||
/* Initialize htcs library. */
|
/* Initialize htcs library. */
|
||||||
AMS_ABORT("htcs::impl::HtcsManagerHolder::AddReference();");
|
/* TODO: AMS_ABORT("htcs::impl::HtcsManagerHolder::AddReference();"); */
|
||||||
|
|
||||||
/* Update our event state. */
|
/* Update our event state. */
|
||||||
this->UpdateEvent();
|
this->UpdateEvent();
|
||||||
|
@ -69,7 +69,48 @@ namespace ams::htc::server {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Observer::ObserverThreadBody() {
|
void Observer::ObserverThreadBody() {
|
||||||
AMS_ABORT("Observer::ObserverThreadBody");
|
/* When we're done observing, clear our state. */
|
||||||
|
ON_SCOPE_EXIT {
|
||||||
|
m_connected = false;
|
||||||
|
m_is_service_available = false;
|
||||||
|
this->UpdateEvent();
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Get the events we're waiting on. */
|
||||||
|
os::EventType * const stop_event = m_stop_event.GetBase();
|
||||||
|
os::EventType * const conn_event = m_misc_impl.GetConnectionEvent();
|
||||||
|
os::EventType * const htcs_event = nullptr /* TODO: htcs::impl::HtcsManagerHolder::GetHtcsManager()->GetServiceAvailabilityEvent() */;
|
||||||
|
|
||||||
|
/* Loop until we're asked to stop. */
|
||||||
|
while (!m_stopped) {
|
||||||
|
/* Wait for an event to be signaled. */
|
||||||
|
const auto index = os::WaitAny(stop_event, conn_event /*, htcs_event */);
|
||||||
|
switch (index) {
|
||||||
|
case 0:
|
||||||
|
/* Stop event, just break out of the loop. */
|
||||||
|
os::ClearEvent(stop_event);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
/* Connection event, update our connection status. */
|
||||||
|
os::ClearEvent(conn_event);
|
||||||
|
m_connected = m_misc_impl.IsConnected();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
/* Htcs event, update our service status. */
|
||||||
|
os::ClearEvent(htcs_event);
|
||||||
|
m_is_service_available = false /* TODO: htcs::impl::HtcsManagerHolder::GetHtcsManager()->IsServiceAvailable() */;
|
||||||
|
break;
|
||||||
|
AMS_UNREACHABLE_DEFAULT_CASE();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the event was our stop event, break. */
|
||||||
|
if (index == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update event status. */
|
||||||
|
this->UpdateEvent();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -274,7 +274,7 @@ namespace ams::usb {
|
||||||
|
|
||||||
Result DsInterface::Finalize() {
|
Result DsInterface::Finalize() {
|
||||||
/* Validate that we have a service. */
|
/* Validate that we have a service. */
|
||||||
R_ABORT_UNLESS(m_interface != nullptr);
|
AMS_ABORT_UNLESS(m_interface != nullptr);
|
||||||
|
|
||||||
/* We must be disabled. */
|
/* We must be disabled. */
|
||||||
R_UNLESS(!m_client->m_is_enabled, usb::ResultResourceBusy());
|
R_UNLESS(!m_client->m_is_enabled, usb::ResultResourceBusy());
|
||||||
|
|
|
@ -42,6 +42,25 @@ namespace ams {
|
||||||
|
|
||||||
using namespace ams;
|
using namespace ams;
|
||||||
|
|
||||||
|
#define AMS_HTC_USE_FATAL_ERROR 1
|
||||||
|
|
||||||
|
#if AMS_HTC_USE_FATAL_ERROR
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
/* Exception handling. */
|
||||||
|
alignas(16) u8 __nx_exception_stack[ams::os::MemoryPageSize];
|
||||||
|
u64 __nx_exception_stack_size = sizeof(__nx_exception_stack);
|
||||||
|
void __libnx_exception_handler(ThreadExceptionDump *ctx);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void __libnx_exception_handler(ThreadExceptionDump *ctx) {
|
||||||
|
ams::CrashHandler(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace ams::htc {
|
namespace ams::htc {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
@ -87,6 +106,8 @@ void __appInit(void) {
|
||||||
|
|
||||||
sm::DoWithSession([&]() {
|
sm::DoWithSession([&]() {
|
||||||
R_ABORT_UNLESS(setsysInitialize());
|
R_ABORT_UNLESS(setsysInitialize());
|
||||||
|
R_ABORT_UNLESS(setcalInitialize());
|
||||||
|
R_ABORT_UNLESS(pscmInitialize());
|
||||||
R_ABORT_UNLESS(fsInitialize());
|
R_ABORT_UNLESS(fsInitialize());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue