Integrate 3ds_pxi and 3ds_sm
This commit is contained in:
94
sysmodules/pxi/source/common.h
Normal file
94
sysmodules/pxi/source/common.h
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
common.h:
|
||||
Common types and global variables.
|
||||
|
||||
(c) TuxSH, 2016-2017
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user