#define NX_SERVICE_ASSUME_NON_DOMAIN
#include "service_guard.h"
#include "services/smm.h"
#include "runtime/hosversion.h"

static Service g_smManagerSrv;

NX_GENERATE_SERVICE_GUARD(smManager);

Result _smManagerInitialize(void) {
    return smGetService(&g_smManagerSrv, "sm:m");
}

void _smManagerCleanup(void) {
    serviceClose(&g_smManagerSrv);
}

Service* smManagerGetServiceSession(void) {
    return &g_smManagerSrv;
}

Result smManagerRegisterProcess(u64 pid, const void *acid_sac, size_t acid_sac_size, const void *aci0_sac, size_t aci0_sac_size) {
    return serviceDispatchIn(&g_smManagerSrv, 0, pid,
        .buffer_attrs = {
            SfBufferAttr_In | SfBufferAttr_HipcMapAlias,
            SfBufferAttr_In | SfBufferAttr_HipcMapAlias,
        },
        .buffers = {
            { acid_sac, acid_sac_size },
            { aci0_sac, aci0_sac_size },
        },
    );
}

Result smManagerUnregisterProcess(u64 pid) {
    return serviceDispatchIn(&g_smManagerSrv, 1, pid);
}