2017-11-02 15:11:55 +01:00
|
|
|
/*
|
|
|
|
common.h:
|
|
|
|
Common types and global variables.
|
|
|
|
|
2020-04-25 14:26:21 +02:00
|
|
|
(c) TuxSH, 2016-2020
|
2017-11-02 15:11:55 +01:00
|
|
|
This is part of 3ds_pxi, which is licensed under the MIT license (see LICENSE for details).
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <3ds.h>
|
|
|
|
|
|
|
|
typedef enum SessionState
|
|
|
|
{
|
|
|
|
STATE_IDLE = 0,
|
|
|
|
STATE_RECEIVED_FROM_ARM11 = 1,
|
|
|
|
STATE_SENT_TO_ARM9 = 2,
|
|
|
|
STATE_RECEIVED_FROM_ARM9 = 3
|
|
|
|
} SessionState;
|
|
|
|
|
|
|
|
typedef struct SessionData
|
|
|
|
{
|
|
|
|
SessionState state;
|
|
|
|
u32 buffer[0x100/4];
|
|
|
|
|
|
|
|
Handle handle;
|
|
|
|
u32 usedStaticBuffers;
|
|
|
|
|
|
|
|
RecursiveLock lock;
|
|
|
|
} SessionData;
|
|
|
|
|
|
|
|
#define NB_STATIC_BUFFERS 21
|
|
|
|
|
|
|
|
typedef struct SessionManager
|
|
|
|
{
|
|
|
|
Handle sendAllBuffersToArm9Event, replySemaphore, PXISRV11CommandReceivedEvent, PXISRV11ReplySentEvent;
|
|
|
|
u32 latest_PXI_MC5_val, pendingArm9Commands;
|
|
|
|
u32 receivedServiceId;
|
|
|
|
RecursiveLock senderLock;
|
|
|
|
bool sendingDisabled;
|
|
|
|
SessionData sessionData[10];
|
|
|
|
|
|
|
|
u32 currentlyProvidedStaticBuffers, freeStaticBuffers;
|
|
|
|
} SessionManager;
|
|
|
|
|
|
|
|
//Page alignment is mandatory there
|
|
|
|
extern u32 ALIGN(0x1000) staticBuffers[NB_STATIC_BUFFERS][0x1000/4];
|
|
|
|
|
|
|
|
extern Handle PXISyncInterrupt, PXITransferMutex;
|
|
|
|
extern Handle terminationRequestedEvent;
|
|
|
|
extern bool shouldTerminate;
|
|
|
|
extern SessionManager sessionManager;
|
|
|
|
|
|
|
|
extern const u32 nbStaticBuffersByService[10];
|
|
|
|
|
|
|
|
static inline Result assertSuccess(Result res)
|
|
|
|
{
|
|
|
|
if(R_FAILED(res)) svcBreak(USERBREAK_PANIC);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline s32 getMSBPosition(u32 val)
|
|
|
|
{
|
|
|
|
return 31 - (s32) __builtin_clz(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline s32 getLSBPosition(u32 val)
|
|
|
|
{
|
|
|
|
return __builtin_ffs(val) - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline u32 clearMSBs(u32 val, u32 nb)
|
|
|
|
{
|
|
|
|
for(u32 i = 0; i < nb; i++)
|
|
|
|
{
|
|
|
|
s32 pos = getMSBPosition(val);
|
|
|
|
if(pos == -1) break;
|
|
|
|
val &= ~(1 << pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline u32 countNbBitsSet(u32 val)
|
|
|
|
{
|
|
|
|
u32 nb = 0;
|
|
|
|
while(val != 0)
|
|
|
|
{
|
|
|
|
val = clearMSBs(val, 1);
|
|
|
|
nb++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return nb;
|
|
|
|
}
|