<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.3dbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bond697</id>
	<title>3dbrew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.3dbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bond697"/>
	<link rel="alternate" type="text/html" href="https://www.3dbrew.org/wiki/Special:Contributions/Bond697"/>
	<updated>2026-05-13T02:05:40Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KDebug&amp;diff=18881</id>
		<title>KDebug</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KDebug&amp;diff=18881"/>
		<updated>2016-12-13T01:24:53Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel synchronization objects]]&lt;br /&gt;
[[Category:Kernel interrupt events]]&lt;br /&gt;
class [[KDebug]] extends [[KSynchronizationObject]] and [[KSendableInterruptEvent]];&lt;br /&gt;
&lt;br /&gt;
Size : 0xA0 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KThreads that sync with this object - number of nodes in the linked list below&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KSendableInterruptEvent]]&lt;br /&gt;
| Process termination event&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Debug event flags.&lt;br /&gt;
Bit0: debugger is attached, bit1: report CPU exceptions, bit2 : ?, bit3: ?, bit4: ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| Stop point type that caused the event: 0 = svc 0xFF, 1 = breakpoint, 2 = watchpoint (otherwise it&#039;s not updated).&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KEventInfo object nodes associated with this KDebug object&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in linked list of KEventInfo objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in linked list of KEventInfo objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| [[KProcess]]*&lt;br /&gt;
| Process the thread belongs to (virtual address)&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Current KThread- thread being debugged&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Thread using ContinueDebugEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| s32&lt;br /&gt;
| Cpu core of thread using ContinueDebugEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KDebugThread object nodes associated with this KDebug object&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in linked list of KDebugThread objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in linked list of KDebugThread objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KDebug object nodes&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in linked list of KDebug objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in linked list of KDebug objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| [[KRecursiveLock]] *&lt;br /&gt;
| Recursive lock&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Current KThread- used in svcBreak&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| u8&lt;br /&gt;
| Set to 1 to indicate the KProcess it belongs to exited&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| u8&lt;br /&gt;
| Set to 1 to indicate the KProcess it belongs to has been terminated&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| u32 *&lt;br /&gt;
| Register dump&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| u32&lt;br /&gt;
| [[SVC#EXCEPTION_event|Exception type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| u16&lt;br /&gt;
| ID of the invalid SVC that was attempted&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| const char *&lt;br /&gt;
| Debug string&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C&lt;br /&gt;
| u32&lt;br /&gt;
| Debug string length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception fields are set for the latest notified exception that occured in userland.&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KDebug&amp;diff=18880</id>
		<title>KDebug</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KDebug&amp;diff=18880"/>
		<updated>2016-12-13T01:24:16Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel synchronization objects]]&lt;br /&gt;
[[Category:Kernel interrupt events]]&lt;br /&gt;
class [[KDebug]] extends [[KSynchronizationObject]] and [[KSendableInterruptEvent]];&lt;br /&gt;
&lt;br /&gt;
Size : 0xA0 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KThreads that sync with this object - number of nodes in the linked list below&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KSendableInterruptEvent]]&lt;br /&gt;
| Process termination event&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Debug event flags.&lt;br /&gt;
Bit0: debugger is attached, bit1: report CPU exceptions, bit2 : ?, bit3: ?, bit4: ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| Stop point type that caused the event: 0 = svc 0xFF, 1 = breakpoint, 2 = watchpoint (otherwise it&#039;s not updated).&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KEventInfo object nodes associated with this KDebug object&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in linked list of KEventInfo objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in linked list of KEventInfo objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| [[KProcess]]*&lt;br /&gt;
| Process the thread belongs to (virtual address)&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| [[KThread*]]&lt;br /&gt;
| Current KThread- thread being debugged&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| [[KThread*]]&lt;br /&gt;
| Thread using ContinueDebugEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| s32&lt;br /&gt;
| Cpu core of thread using ContinueDebugEvent&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KDebugThread object nodes associated with this KDebug object&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in linked list of KDebugThread objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in linked list of KDebugThread objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KDebug object nodes&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in linked list of KDebug objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in linked list of KDebug objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| [[KRecursiveLock]] *&lt;br /&gt;
| Recursive lock&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| [[KThread*]]&lt;br /&gt;
| Current KThread- used in svcBreak&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| u8&lt;br /&gt;
| Set to 1 to indicate the KProcess it belongs to exited&lt;br /&gt;
|-&lt;br /&gt;
| 0x85&lt;br /&gt;
| u8&lt;br /&gt;
| Set to 1 to indicate the KProcess it belongs to has been terminated&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| u32 *&lt;br /&gt;
| Register dump&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| u32&lt;br /&gt;
| [[SVC#EXCEPTION_event|Exception type]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x92&lt;br /&gt;
| u16&lt;br /&gt;
| ID of the invalid SVC that was attempted&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| const char *&lt;br /&gt;
| Debug string&lt;br /&gt;
|-&lt;br /&gt;
| 0x9C&lt;br /&gt;
| u32&lt;br /&gt;
| Debug string length&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception fields are set for the latest notified exception that occured in userland.&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KThread&amp;diff=18852</id>
		<title>KThread</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KThread&amp;diff=18852"/>
		<updated>2016-12-11T21:19:36Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel synchronization objects]]&lt;br /&gt;
[[Category:Kernel interrupt events]]&lt;br /&gt;
class [[KThread]] extends [[KSynchronizationObject]], [[KTimeableInterruptEvent]], [[KSendableInterruptEvent]] and [[KSchedulableInterruptEvent]];&lt;br /&gt;
&lt;br /&gt;
Size : 0xB0 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KThreads that sync with this object - number of nodes in the linked list below&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KTimeableInterruptEvent]]&lt;br /&gt;
| Used to suspend threads (*this)&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KSendableInterruptEvent]]&lt;br /&gt;
| Interrupt event (*this) sent to terminate a thread, except in the case just below&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| [[KSchedulableInterruptEvent]]&lt;br /&gt;
| Interrupt event (*this) scheduled by the IRQ handler when the thread should terminate (*this)&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u8&lt;br /&gt;
| Whether the thread is in the scheduler&#039;s queue and is ready to run&lt;br /&gt;
|-&lt;br /&gt;
| 0x35&lt;br /&gt;
| u8&lt;br /&gt;
| Used in syncing&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| s8&lt;br /&gt;
| Indicates that the thread shall terminate&lt;br /&gt;
|-&lt;br /&gt;
| 0x37&lt;br /&gt;
| u8&lt;br /&gt;
| Used in syncing&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| KDebugThread*&lt;br /&gt;
| Pointer to KDebugThread object used with the current KThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| u32&lt;br /&gt;
| Base thread priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to object the KThread is waiting on- can be a timer, event, session, etc.&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| Result&lt;br /&gt;
| Status for object above&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| KObjectMutex*&lt;br /&gt;
| Locking kernel mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| u32&lt;br /&gt;
| Arbitration address&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of objects this thread is waiting on&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of objects this thread is &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| [[KMutex|KMutexLinkedList]] *&lt;br /&gt;
| Set in some very specific circumstances&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KMutex objects this thread is using&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KMutex objects this thread is using&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KMutex objects this thread is using&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| s32&lt;br /&gt;
| Dynamic thread priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| s32&lt;br /&gt;
| Processor that created the thread&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KResourceLimit]]+0x60, which holds the amount of CPU time available in ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| u8&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D&lt;br /&gt;
| u8&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7E&lt;br /&gt;
| u8&lt;br /&gt;
| Thread affinity mask - set differently depending on whether the thread is created via svc call or from inside the kernel&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| KProcess*&lt;br /&gt;
| Process the thread belongs to (virtual address)&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| u32&lt;br /&gt;
| Thread id&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| u32*&lt;br /&gt;
| Ptr to svc mode register storage for KThread inside the thread context.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| u32*&lt;br /&gt;
| End-address of the page for this thread context allocated in the [[Memory_layout|0xFF4XX000]] region. Thus, if the beginning of this mapped page is 0xFF401000, this ptr would be 0xFF402000.  Thread context page - used for thread svc stack, preserving svc mode registers and VFP exception register for thread.&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| s32&lt;br /&gt;
| Ideal processor (processorid value from [[SVC|svcCreateThread]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| void*&lt;br /&gt;
| Ptr to [[Thread Local Storage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| void*&lt;br /&gt;
| Ptr to [[Thread Local Storage]] in FCRAM via kernel vmem&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| KThreadLinkedListNode&lt;br /&gt;
| Previous and next scheduled threads&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| KThreadLinkedList *&lt;br /&gt;
| Pointer to linked list of scheduled threads that has stolen it, or 0 if in normal list&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| s32&lt;br /&gt;
| Priority field used for priority inheritance when needed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
With the following declarations: &amp;lt;code&amp;gt;struct KThreadLinkedList { KThread *first, *last; };&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;struct KThreadLinkedListNode { KThread *prev, *next; };&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Thread Affinity Mask=&lt;br /&gt;
&lt;br /&gt;
If the thread is created via a call to SVC 8(CreateThread), which uses thread creation type 3, and the CPU ID is -2(meaning use the core specified in the exheader), the mask is just the affinity mask from the thread&#039;s owner KProcess.  If the CPU ID is -1(meaning any core), the affinity mask is set to 0xF on the New3DS and 0x3 on the Old3DS.  Otherwise, the affinity mask is (1 &amp;lt;&amp;lt; cpu_id) | 1.&lt;br /&gt;
&lt;br /&gt;
If the thread is created via a call by the kernel, which uses thread creation types 0-2, the checks for -1 and -2 are skipped and the mask is always (1 &amp;lt;&amp;lt; cpu_id) | 1.&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KResourceLimit&amp;diff=18851</id>
		<title>KResourceLimit</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KResourceLimit&amp;diff=18851"/>
		<updated>2016-12-11T21:18:39Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel auto objects]]&lt;br /&gt;
class [[KResourceLimit]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x74 bytes &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| s32&lt;br /&gt;
| Max Priority&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| s32&lt;br /&gt;
| Max commit&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| s32&lt;br /&gt;
| Max thread&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| s32&lt;br /&gt;
| Max event&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| s32&lt;br /&gt;
| Max mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| s32&lt;br /&gt;
| Max semaphore&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| s32&lt;br /&gt;
| Max timer&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| s32&lt;br /&gt;
| Max shared memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| s32&lt;br /&gt;
| Max address arbiter&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| s32&lt;br /&gt;
| Max CPU time&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| s32&lt;br /&gt;
| Current Priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| s32&lt;br /&gt;
| Current commit&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| s32&lt;br /&gt;
| Current thread&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| s32&lt;br /&gt;
| Current event&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| s32&lt;br /&gt;
| Current mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| s32&lt;br /&gt;
| Current semaphore&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| s32&lt;br /&gt;
| Current timer&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| s32&lt;br /&gt;
| Current shared memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| s32&lt;br /&gt;
| Current address arbiter&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| s32&lt;br /&gt;
| Current CPU time&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| KObjectMutex&lt;br /&gt;
| Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| u32&lt;br /&gt;
| CPU time available in ticks&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 KResourceLimit objects created on the kernel heap.  Each is used for a different category specified by the exheader&#039;s resource limit category specifier in the exheader [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|ARM11 Local System Capabilities]].&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KClassToken&amp;diff=18846</id>
		<title>KClassToken</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KClassToken&amp;diff=18846"/>
		<updated>2016-12-10T19:18:30Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Size : 0x5 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| char*&lt;br /&gt;
| Pointer to kernel type string&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Kernel object descriptive bitflags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each type of kernel object has a token that describes it.  The token is used to make sure that a kernel object of a certain type is able to perform a function requested by the kernel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bitflags =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Can synchronize&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Is interruptible&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bitflags and their corresponding objects ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;8&amp;quot;|Bits&lt;br /&gt;
! Value&lt;br /&gt;
! Associated class&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0x59&lt;br /&gt;
| [[KDmaObject]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0x55&lt;br /&gt;
| [[KServerPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0xC5&lt;br /&gt;
| [[KProcess]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0x35&lt;br /&gt;
| [[KTimer]]&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0xB0&lt;br /&gt;
| [[KSharedMemory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0xC8&lt;br /&gt;
| [[KResourceLimit]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0x01&lt;br /&gt;
| [[KSynchronizationObject]]&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0x70&lt;br /&gt;
| [[KSession]]&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0xA8&lt;br /&gt;
| [[KPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0x2F&lt;br /&gt;
| [[KSemaphore]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0x4D&lt;br /&gt;
| [[KDebug]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0x8D&lt;br /&gt;
| [[KThread]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0x95&lt;br /&gt;
| [[KServerSession]]&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0x98&lt;br /&gt;
| [[KAddressArbiter]]&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0x68&lt;br /&gt;
| [[KCodeSet]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0x1F&lt;br /&gt;
| [[KEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0x65&lt;br /&gt;
| [[KClientPort]]&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0x00&lt;br /&gt;
| [[KAutoObject]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0xA5&lt;br /&gt;
| [[KClientSession]]&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0x39&lt;br /&gt;
| [[KMutex]]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KClassToken&amp;diff=18844</id>
		<title>KClassToken</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KClassToken&amp;diff=18844"/>
		<updated>2016-12-10T18:57:44Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Size : 0x5 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| char*&lt;br /&gt;
| Pointer to kernel type string&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Kernel object descriptive bitflags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each type of kernel object has a token that describes it.  The token is used to make sure that a kernel object of a certain type is able to perform a function requested by the kernel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bitflags =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Can synchronize&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Is interruptible&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bitflags and their corresponding objects ==&lt;br /&gt;
0 1 0 1 1 0 0 1 | 0x59 - KDmaObject&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 1 0 1 1 1 1 | 0x2F - KSemaphore&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 0 0 0 0 0 | 0x00 - KAutoObject&amp;lt;br&amp;gt;&lt;br /&gt;
0 1 1 0 0 1 0 1 | 0x65 - KClientPort&amp;lt;br&amp;gt;&lt;br /&gt;
0 1 0 1 0 1 0 1 | 0x55 - KServerPort&amp;lt;br&amp;gt;&lt;br /&gt;
1 0 1 1 0 0 0 0 | 0xB0 - KSharedMemory&amp;lt;br&amp;gt;&lt;br /&gt;
1 0 1 0 0 1 0 1 | 0xA5 - KClientSession&amp;lt;br&amp;gt;&lt;br /&gt;
1 1 0 0 1 0 0 0 | 0xC8 - KResourceLimit&amp;lt;br&amp;gt;&lt;br /&gt;
1 0 0 1 0 1 0 1 | 0x95 - KServerSession&amp;lt;br&amp;gt;&lt;br /&gt;
1 0 0 1 1 0 0 0 | 0x98 - KAddressArbiter&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 0 0 0 0 1 | 0x01 - KSynchronizationObject&amp;lt;br&amp;gt;&lt;br /&gt;
1 0 1 0 1 0 0 0 | 0xA8 - KPort&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 0 1 1 1 1 1 | 0x1F - KEvent&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 1 1 1 0 0 1 | 0x39 - KMutex&amp;lt;br&amp;gt;&lt;br /&gt;
0 0 1 1 0 1 0 1 | 0x35 - KTimer&amp;lt;br&amp;gt;&lt;br /&gt;
0 1 0 0 1 1 0 1 | 0x4D - KDebug&amp;lt;br&amp;gt;&lt;br /&gt;
1 0 0 0 1 1 0 1 | 0x8D - KThread&amp;lt;br&amp;gt;&lt;br /&gt;
0 1 1 0 1 0 0 0 | 0x68 - KCodeSet&amp;lt;br&amp;gt;&lt;br /&gt;
1 1 0 0 0 1 0 1 | 0xC5 - KProcess&amp;lt;br&amp;gt;&lt;br /&gt;
0 1 1 1 0 0 0 0 | 0x70 - KSession&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KClassToken&amp;diff=18841</id>
		<title>KClassToken</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KClassToken&amp;diff=18841"/>
		<updated>2016-12-10T18:06:19Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Size : 0x5 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| char*&lt;br /&gt;
| Pointer to kernel type string&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Kernel object descriptive bitflags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each type of kernel object has a token that describes it.  The token is used to make sure that a kernel object of a certain type is able to perform a function requested by the kernel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bitflags =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Can synchronize&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Is interruptible&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KClassToken&amp;diff=18840</id>
		<title>KClassToken</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KClassToken&amp;diff=18840"/>
		<updated>2016-12-10T18:04:45Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Created page with &amp;quot;Category:Kernel objects   Size : 0x5 bytes  {| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; |- ! Offset ! Type ! Description |- | 0x0 | char* | Pointer to kernel type string |- | 0x4 | u8...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Size : 0x5 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| char*&lt;br /&gt;
| Pointer to kernel type string&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Kernel object descriptive bitflags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Each type of kernel object has a token that describes it.  The token is used to make sure that a kernel object of a certain type is able to perform a function requested by the kernel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Bitflags =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Can synchronize&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Is interruptible&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KResourceLimit&amp;diff=18780</id>
		<title>KResourceLimit</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KResourceLimit&amp;diff=18780"/>
		<updated>2016-12-05T18:40:00Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel auto objects]]&lt;br /&gt;
class [[KResourceLimit]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x74 bytes &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| s32&lt;br /&gt;
| Max Priority&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| s32&lt;br /&gt;
| Max commit&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| s32&lt;br /&gt;
| Max thread&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| s32&lt;br /&gt;
| Max event&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| s32&lt;br /&gt;
| Max mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| s32&lt;br /&gt;
| Max semaphore&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| s32&lt;br /&gt;
| Max timer&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| s32&lt;br /&gt;
| Max shared memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| s32&lt;br /&gt;
| Max address arbiter&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| s32&lt;br /&gt;
| Max CPU time&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| s32&lt;br /&gt;
| Current Priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| s32&lt;br /&gt;
| Current commit&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| s32&lt;br /&gt;
| Current thread&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| s32&lt;br /&gt;
| Current event&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| s32&lt;br /&gt;
| Current mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| s32&lt;br /&gt;
| Current semaphore&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| s32&lt;br /&gt;
| Current timer&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| s32&lt;br /&gt;
| Current shared memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| s32&lt;br /&gt;
| Current address arbiter&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| s32&lt;br /&gt;
| Current CPU time&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| KObjectMutex&lt;br /&gt;
| Mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 4 KResourceLimit objects created on the kernel heap.  Each is used for a different category specified by the exheader&#039;s resource limit category specifier in the exheader [[NCCH/Extended_Header#ARM11_Local_System_Capabilities|ARM11 Local System Capabilities]].&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KThread&amp;diff=18735</id>
		<title>KThread</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KThread&amp;diff=18735"/>
		<updated>2016-12-04T22:35:05Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KThread]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0xB0 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KThreads that sync with this object - number of nodes in the linked list below&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KTimeableInterruptEvent|KThreadInterruptEvent]]&lt;br /&gt;
| Used to suspend threads &lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| u32&lt;br /&gt;
| Start of 0x8 byte unnamed kernel object in KThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Start of unnamed kernel object of undetermined size in KThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u8&lt;br /&gt;
| Whether the thread is in the scheduler&#039;s queue and is ready to run&lt;br /&gt;
|-&lt;br /&gt;
| 0x35&lt;br /&gt;
| u8&lt;br /&gt;
| Used in syncing&lt;br /&gt;
|-&lt;br /&gt;
| 0x36&lt;br /&gt;
| s8&lt;br /&gt;
| Indicates that the thread shall terminate&lt;br /&gt;
|-&lt;br /&gt;
| 0x37&lt;br /&gt;
| u8&lt;br /&gt;
| Used in syncing&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| KDebugThread*&lt;br /&gt;
| Pointer to KDebugThread object used with the current KThread&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| u32&lt;br /&gt;
| Base thread priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to object the KThread is waiting on- can be a timer, event, session, etc.&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| Result&lt;br /&gt;
| Status for object above&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| KObjectMutex*&lt;br /&gt;
| Locking kernel mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| u32&lt;br /&gt;
| Arbitration address&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of objects this thread is waiting on&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of objects this thread is &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| [[KSchedulableInterruptEvent|KMutexInterruptEvent]] *&lt;br /&gt;
| Set in some very specific circumstances&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KMutex objects this thread is using&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KMutex objects this thread is using&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KMutex objects this thread is using&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| s32&lt;br /&gt;
| Dynamic thread priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| s32&lt;br /&gt;
| Processor that created the thread&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| u32&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| u8&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D&lt;br /&gt;
| u8&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x7E&lt;br /&gt;
| u8&lt;br /&gt;
| Thread affinity mask - set differently depending on whether the thread is created via svc call or from inside the kernel&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| KProcess*&lt;br /&gt;
| Process the thread belongs to (virtual address)&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| u32&lt;br /&gt;
| Thread id&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| u32*&lt;br /&gt;
| Ptr to svc mode register storage for KThread inside the thread context.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| u32*&lt;br /&gt;
| End-address of the page for this thread context allocated in the [[Memory_layout|0xFF4XX000]] region. Thus, if the beginning of this mapped page is 0xFF401000, this ptr would be 0xFF402000.  Thread context page - used for thread svc stack, preserving svc mode registers and VFP exception register for thread.&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| s32&lt;br /&gt;
| Ideal processor (processorid value from [[SVC|svcCreateThread]])&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| void*&lt;br /&gt;
| Ptr to [[Thread Local Storage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| void*&lt;br /&gt;
| Ptr to [[Thread Local Storage]] in FCRAM via kernel vmem&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| KThread*&lt;br /&gt;
| Previous (virtual address)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| KThread*&lt;br /&gt;
| Next (virtual address)&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| struct { KThread* first; KThread* last; } * ptr&lt;br /&gt;
| Pointer to linked list that has stolen it, or 0 if in normal list&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| s32&lt;br /&gt;
| Priority field used for priority inheritance when needed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Thread Affinity Mask=&lt;br /&gt;
&lt;br /&gt;
If the thread is created via a call to SVC 8(CreateThread), which uses thread creation type 3, and the CPU ID is -2(meaning use the core specified in the exheader), the mask is just the affinity mask from the thread&#039;s owner KProcess.  If the CPU ID is -1(meaning any core), the affinity mask is set to 0xF on the New3DS and 0x3 on the Old3DS.  Otherwise, the affinity mask is (1 &amp;lt;&amp;lt; cpu_id) | 1.&lt;br /&gt;
&lt;br /&gt;
If the thread is created via a call by the kernel, which uses thread creation types 0-2, the checks for -1 and -2 are skipped and the mask is always (1 &amp;lt;&amp;lt; cpu_id) | 1.&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KBaseInterruptEvent&amp;diff=18734</id>
		<title>KBaseInterruptEvent</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KBaseInterruptEvent&amp;diff=18734"/>
		<updated>2016-12-04T21:24:54Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
Abstract base class for all interrupt events.&lt;br /&gt;
&lt;br /&gt;
Size: 0x4 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| void **&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This abstract base class defines &amp;lt;code&amp;gt;virtual KSchedulableInterruptEvent* handleInterruptAndGetKSchedulableInterruptEvent(u32 interruptID) = 0&amp;lt;/code&amp;gt;. It&#039;s actually the function called by the IRQ handler, which returns a [[KSchedulableInterruptEvent|KSchedulableInterruptEvent]] to call the second virtual method of (which signals the object) after a reschedule.&lt;br /&gt;
&lt;br /&gt;
If either NULL or 1 is returned, nothing will be signaled. If NULL is returned, no post-interrupt rescheduling will be done.&lt;br /&gt;
&lt;br /&gt;
The kernel uses the [[KSchedulableInterruptEvent|KEventInterruptEvent]] field of a [[KEvent|KEvent]] when binding public interrupts per svcBindInterrupt request.&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=18502</id>
		<title>KSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=18502"/>
		<updated>2016-10-27T18:03:58Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KSession]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| X ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Y ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Z ?&lt;br /&gt;
|}&lt;br /&gt;
It seems X=Y=Z. X, Y and Z can be NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Structure for [[7.0.0-13]] NATIVE_FIRM upward:&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes ([[KAutoObject]], [[KServerSession]], [[KClientSession]], sequentially):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[KAutoObject]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
|rowspan=&amp;quot;9&amp;quot;|[[KServerSession]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| KLinkedListNode count for sync threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]* &lt;br /&gt;
| Last stolen KThread during sync request- current thread when KServerSession code is running during svc - noted in KThread+0xA8 as well&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| First stolen KThread during sync request&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| KThread that originated the session&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|[[KClientSession]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32 &lt;br /&gt;
| KLinkedListNode count for sync threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32 &lt;br /&gt;
| Session status&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| [[KClientPort]]* &lt;br /&gt;
| Pointer to associated client port inside parent KPort&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Session status:&lt;br /&gt;
&lt;br /&gt;
1: open&amp;lt;br&amp;gt;&lt;br /&gt;
2: closed by client&amp;lt;br&amp;gt;&lt;br /&gt;
3: closed by server?&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=18501</id>
		<title>KSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=18501"/>
		<updated>2016-10-27T17:29:52Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KSession]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| X ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Y ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Z ?&lt;br /&gt;
|}&lt;br /&gt;
It seems X=Y=Z. X, Y and Z can be NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Structure for [[7.0.0-13]] NATIVE_FIRM upward:&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes ([[KAutoObject]], [[KServerSession]], [[KClientSession]], sequentially):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[KAutoObject]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
|rowspan=&amp;quot;9&amp;quot;|[[KServerSession]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]* &lt;br /&gt;
| Last stolen KThread during sync request- current thread when KServerSession code is running during svc - noted in KThread+0xA8 as well&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| First stolen KThread during sync request&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| KThread that originated the session&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|[[KClientSession]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32 &lt;br /&gt;
| KLinkedListNode count for object&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32 &lt;br /&gt;
| Session status&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| [[KClientPort]]* &lt;br /&gt;
| Pointer to associated client port inside parent KPort&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Session status:&lt;br /&gt;
&lt;br /&gt;
1: open&amp;lt;br&amp;gt;&lt;br /&gt;
2: closed by client&amp;lt;br&amp;gt;&lt;br /&gt;
3: closed by server?&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=18483</id>
		<title>KSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=18483"/>
		<updated>2016-10-25T16:39:11Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KSession]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| X ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Y ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Z ?&lt;br /&gt;
|}&lt;br /&gt;
It seems X=Y=Z. X, Y and Z can be NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Structure for [[7.0.0-13]] NATIVE_FIRM upward:&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes ([[KAutoObject]], [[KServerSession]], [[KClientSession]], sequentially):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;|Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
|rowspan=&amp;quot;2&amp;quot;|[[KAutoObject]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
|rowspan=&amp;quot;9&amp;quot;|[[KServerSession]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]* &lt;br /&gt;
| Last stolen KThread during sync request- current thread when KServerSession code is running during svc - noted in KThread+0xA8 as well&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| First stolen KThread during sync request&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| KThread that originated the session&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
|rowspan=&amp;quot;8&amp;quot;|[[KClientSession]]&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32 &lt;br /&gt;
| KLinkedListNode count for object&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32 &lt;br /&gt;
| Session status&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| KClientPort* &lt;br /&gt;
| Pointer to associated client port inside parent KPort&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Session status:&lt;br /&gt;
&lt;br /&gt;
1: open&amp;lt;br&amp;gt;&lt;br /&gt;
2: closed by client&amp;lt;br&amp;gt;&lt;br /&gt;
3: closed by server?&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=18482</id>
		<title>ARM11 Interrupts</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=18482"/>
		<updated>2016-10-25T16:01:41Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interrupts ==&lt;br /&gt;
&lt;br /&gt;
Interrupt priority is 0-0xF&lt;br /&gt;
&lt;br /&gt;
= Private Interrupts =&lt;br /&gt;
&lt;br /&gt;
Each CPU core has 32 software interrupts that are private and belong to that core.  These interrupts are numbers 0-0x1F for each core.  The hardware interrupts are not core-specific and start at interrupt ID 0x20.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-0x5&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used for scheduling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x9-0xE&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| dmnt/debugger&lt;br /&gt;
| MPCore software-interrupt. Used to abstract FIQ (debug).&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore timer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore watchdog - set when the watchdog counter reaches 0 in timer mode, causes interrupt 30 to set as pending.  Only set on core 1 as core 1&#039;s timer is used for everything.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Hardware Interrupts =&lt;br /&gt;
&lt;br /&gt;
There are 0x60 hardware interrupts starting at 0x20 and continuing up to 0x7F.  These are not private and are accessible from any core.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x29&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC1?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC1?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PPF?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| Kernel&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| nwm&lt;br /&gt;
| WIFI SDIO Controller @ 0x10122000&lt;br /&gt;
|-&lt;br /&gt;
| 0x41&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| nwm_dev?&lt;br /&gt;
| WIFI SDIO Controller @ 0x10100000&lt;br /&gt;
|-&lt;br /&gt;
| 0x45&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x49&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A&lt;br /&gt;
| dsp&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B&lt;br /&gt;
| camera&lt;br /&gt;
| Y2R Conversion Finished&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Sync&lt;br /&gt;
|-&lt;br /&gt;
| 0x51&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x52&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Send Fifo Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x53&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Receive Fifo Not Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x55&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x56&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x57&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| Kernel&lt;br /&gt;
| PDN&lt;br /&gt;
|-&lt;br /&gt;
| 0x59&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A&lt;br /&gt;
| mic&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Asserted when shell is opened?&lt;br /&gt;
|-&lt;br /&gt;
| 0x62&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Asserted when shell is closed?&lt;br /&gt;
|-&lt;br /&gt;
| 0x63&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Touchscreen&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Headphone jack plugged in&lt;br /&gt;
|-&lt;br /&gt;
| 0x66&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| IR?&lt;br /&gt;
|-&lt;br /&gt;
| 0x69&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6E&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6F&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Headphone jack plugged out&lt;br /&gt;
|-&lt;br /&gt;
| 0x71&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| MCU (HOME/POWER pressed)&lt;br /&gt;
|-&lt;br /&gt;
| 0x72&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x73&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard related&lt;br /&gt;
|-&lt;br /&gt;
| 0x75&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard inserted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 2 tables in the ARM11 kernel: the first has 32 * 2(or 32 * 4) 8-byte entries.  This table is for the private interrupts that belong to each core.  The data for each interrupt can be found by doing table_base + (core_num * 0x100) + (intr_num * 8).  The second table is for public hardware interrupts and the data for each interrupt can be retrieved by doing table_base + (intr_num * 8).&lt;br /&gt;
&lt;br /&gt;
= InterruptData =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to interrupt data object for interrupt number &lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt is pending&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt is enabled, about to execute&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| u8&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The interrupt data pointer is a pointer to the object that handles that interrupt.  The first first word in the object is a pointer to the object&#039;s vtable and the first function in the vtable is the interrupt handler for that interrupt number.  When an interrupt runs, the function is passed its object in r0 and the interrupt number in r1.&lt;br /&gt;
&lt;br /&gt;
= Interrupt Table (New3DS) =&lt;br /&gt;
(0xFFF318F4 in 10.3)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| InterruptEvent[224]&lt;br /&gt;
| Table of interrupt event objects for all hardware and software interrupts&lt;br /&gt;
|-&lt;br /&gt;
| 0x700&lt;br /&gt;
| KThread*&lt;br /&gt;
| Thread currently acting on the interrupt table&lt;br /&gt;
|-&lt;br /&gt;
| 0x704&lt;br /&gt;
| s16&lt;br /&gt;
| Error tracker for thread above&lt;br /&gt;
|-&lt;br /&gt;
| 0x706&lt;br /&gt;
| u16&lt;br /&gt;
| Alignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= InterruptEvent =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to interrupt event object &lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Interrupt flags&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=18481</id>
		<title>ARM11 Interrupts</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=ARM11_Interrupts&amp;diff=18481"/>
		<updated>2016-10-25T15:57:56Z</updated>

		<summary type="html">&lt;p&gt;Bond697: /* Private Interrupts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Interrupts ==&lt;br /&gt;
&lt;br /&gt;
Interrupt priority is 0-0xF&lt;br /&gt;
&lt;br /&gt;
= Private Interrupts =&lt;br /&gt;
&lt;br /&gt;
Each CPU core has 32 software interrupts that are private and belong to that core.  These interrupts are numbers 0-0x1F for each core.  The hardware interrupts are not core-specific and start at interrupt ID 0x20.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0-0x5&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore software-interrupt. Used for scheduling.&lt;br /&gt;
|-&lt;br /&gt;
| 0x9-0xE&lt;br /&gt;
| &lt;br /&gt;
| MPCore software-interrupt.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF&lt;br /&gt;
| dmnt/debugger&lt;br /&gt;
| MPCore software-interrupt. Used to abstract FIQ (debug).&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore timer.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E&lt;br /&gt;
| Kernel&lt;br /&gt;
| MPCore watchdog - set when the watchdog counter reaches 0 in timer mode, causes interrupt 30 to set as pending&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Hardware Interrupts =&lt;br /&gt;
&lt;br /&gt;
There are 0x60 hardware interrupts starting at 0x20 and continuing up to 0x7F.  These are not private and are accessible from any core.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  IRQ&lt;br /&gt;
!  Listener&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x29&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PSC1?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PDC1?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| PPF?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D&lt;br /&gt;
| gsp, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| Kernel&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x39&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x3B&lt;br /&gt;
| Kernel&lt;br /&gt;
| DMA&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| nwm&lt;br /&gt;
| WIFI SDIO Controller @ 0x10122000&lt;br /&gt;
|-&lt;br /&gt;
| 0x41&lt;br /&gt;
| nwm&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| nwm_dev?&lt;br /&gt;
| WIFI SDIO Controller @ 0x10100000&lt;br /&gt;
|-&lt;br /&gt;
| 0x45&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x49&lt;br /&gt;
| camera&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A&lt;br /&gt;
| dsp&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B&lt;br /&gt;
| camera&lt;br /&gt;
| Y2R Conversion Finished&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F&lt;br /&gt;
| mvd (New3DS)&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Sync&lt;br /&gt;
|-&lt;br /&gt;
| 0x51&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x52&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Send Fifo Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x53&lt;br /&gt;
| pxi, TwlBg&lt;br /&gt;
| Receive Fifo Not Empty&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x55&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x56&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x57&lt;br /&gt;
| spi, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| Kernel&lt;br /&gt;
| PDN&lt;br /&gt;
|-&lt;br /&gt;
| 0x59&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A&lt;br /&gt;
| mic&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| i2c, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Asserted when shell is opened?&lt;br /&gt;
|-&lt;br /&gt;
| 0x62&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Asserted when shell is closed?&lt;br /&gt;
|-&lt;br /&gt;
| 0x63&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Touchscreen&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Headphone jack plugged in&lt;br /&gt;
|-&lt;br /&gt;
| 0x66&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| IR?&lt;br /&gt;
|-&lt;br /&gt;
| 0x69&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6E&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x6F&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| Headphone jack plugged out&lt;br /&gt;
|-&lt;br /&gt;
| 0x71&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| MCU (HOME/POWER pressed)&lt;br /&gt;
|-&lt;br /&gt;
| 0x72&lt;br /&gt;
| gpio, TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x73&lt;br /&gt;
| TwlBg&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard related&lt;br /&gt;
|-&lt;br /&gt;
| 0x75&lt;br /&gt;
| ?&lt;br /&gt;
| Gamecard inserted&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are 2 tables in the ARM11 kernel: the first has 32 * 2(or 32 * 4) 8-byte entries.  This table is for the private interrupts that belong to each core.  The data for each interrupt can be found by doing table_base + (core_num * 0x100) + (intr_num * 8).  The second table is for public hardware interrupts and the data for each interrupt can be retrieved by doing table_base + (intr_num * 8).&lt;br /&gt;
&lt;br /&gt;
= InterruptData =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to interrupt data object for interrupt number &lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt is pending&lt;br /&gt;
|-&lt;br /&gt;
| 0x5&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt is enabled, about to execute&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| u8&lt;br /&gt;
| Interrupt priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x7&lt;br /&gt;
| u8&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The interrupt data pointer is a pointer to the object that handles that interrupt.  The first first word in the object is a pointer to the object&#039;s vtable and the first function in the vtable is the interrupt handler for that interrupt number.  When an interrupt runs, the function is passed its object in r0 and the interrupt number in r1.&lt;br /&gt;
&lt;br /&gt;
= Interrupt Table (New3DS) =&lt;br /&gt;
(0xFFF318F4 in 10.3)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| InterruptEvent[224]&lt;br /&gt;
| Table of interrupt event objects for all hardware and software interrupts&lt;br /&gt;
|-&lt;br /&gt;
| 0x700&lt;br /&gt;
| KThread*&lt;br /&gt;
| Thread currently acting on the interrupt table&lt;br /&gt;
|-&lt;br /&gt;
| 0x704&lt;br /&gt;
| s16&lt;br /&gt;
| Error tracker for thread above&lt;br /&gt;
|-&lt;br /&gt;
| 0x706&lt;br /&gt;
| u16&lt;br /&gt;
| Alignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= InterruptEvent =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to interrupt event object &lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Interrupt flags&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=18441</id>
		<title>KSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=18441"/>
		<updated>2016-10-20T19:32:17Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Undo revision 18440 by Neobrain (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KSession]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| X ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Y ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Z ?&lt;br /&gt;
|}&lt;br /&gt;
It seems X=Y=Z. X, Y and Z can be NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Structure for [[7.0.0-13]] NATIVE_FIRM upward:&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]* &lt;br /&gt;
| Last stolen KThread during sync request- current thread when KServerSession code is running during svc - noted in KThread+0xA8 as well&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| First stolen KThread during sync request&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| KThread that originated the session&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32 &lt;br /&gt;
| KLinkedListNode count for object&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32 &lt;br /&gt;
| Session status&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| KClientPort* &lt;br /&gt;
| Pointer to associated client port inside parent KPort&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Memory_Management&amp;diff=18415</id>
		<title>Memory Management</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Memory_Management&amp;diff=18415"/>
		<updated>2016-10-12T17:19:19Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Types and structures =&lt;br /&gt;
&lt;br /&gt;
== enum MemoryOperation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Memory operation&lt;br /&gt;
!  Id&lt;br /&gt;
|-&lt;br /&gt;
| FREE&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| RESERVE&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| COMMIT&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| MAP&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| UNMAP&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| PROTECT&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| REGION APP&lt;br /&gt;
| 0x100&lt;br /&gt;
|-&lt;br /&gt;
| REGION SYSTEM&lt;br /&gt;
| 0x200&lt;br /&gt;
|-&lt;br /&gt;
| REGION BASE&lt;br /&gt;
| 0x300&lt;br /&gt;
|-&lt;br /&gt;
| LINEAR&lt;br /&gt;
| 0x10000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The LINEAR memory-operation indicates that the mapped physical address is always MappedVAddr+0x0C000000, thus this memory can be used for hardware devices&#039; DMA(such as the [[GPU]]). Addr0+size for this must be within the 0x14000000-0x1C000000 range when Addr0 is non-zero(Addr1 must be zero), Addr0 isn&#039;t actually used by svcControlMemory for mapping memory: Addr0 is not used by the kernel after doing address-range checks. The kernel determines what physical-address to use by allocating memory from FCRAM(about the same way as other memory), which is then used to determine the virtual-address.&lt;br /&gt;
&lt;br /&gt;
[[8.0.0-18]] added a new memory mapping(0x30000000-0x38000000) for LINEAR memory, this replaces the original mapping for newer titles. The kernel uses the new mapping when the process memory-region is BASE, or when the process kernel-release-version field is &amp;gt;=0x022c(2.44 / system-version [[8.0.0-18]]).&lt;br /&gt;
&lt;br /&gt;
The input mem-region value for svcControlMemory is only used(when non-zero) when the PID is value 1, for the [[FIRM]] ARM11 &amp;quot;loader&amp;quot; module.&lt;br /&gt;
&lt;br /&gt;
== enum MemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Memory permission&lt;br /&gt;
!  Id&lt;br /&gt;
|-&lt;br /&gt;
| NONE&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| R&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| W&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| RW&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| X&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| RX&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| WX&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| RWX&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| DONTCARE&lt;br /&gt;
| 0x10000000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== enum MemoryState ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Memory state flags&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| FREE&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| RESERVED&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| IO&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| STATIC&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| CODE&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| PRIVATE&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| SHARED&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| CONTINUOUS&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| ALIASED&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| ALIAS&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| ALIAS CODE&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED&lt;br /&gt;
| 11&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== struct MemoryInfo ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Base process virtual address&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Size&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Permission&lt;br /&gt;
|-&lt;br /&gt;
| enum MemoryState&lt;br /&gt;
| State&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== enum PageFlags ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Page flags&lt;br /&gt;
!  Bit&lt;br /&gt;
|-&lt;br /&gt;
| LOCKED&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| CHANGED&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== struct PageInfo ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| PageFlags (u32)&lt;br /&gt;
| Flags&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Memory Mapping =&lt;br /&gt;
ControlMemory and MapMemoryBlock can be used to map memory pages, these two SVCs only support mapping execute-never R/W pages. The input permissions parameter for these SVCs must therefore be &amp;lt;=3, where value zero is used when un-mapping memory. Furthermore it appears that only regular heap pages can be mirrored (it won&#039;t work for TLS, stack, .data, .text, for example).&lt;br /&gt;
&lt;br /&gt;
Bitmask 0xF00 for ControlMemory parameter MemoryType is the memory-type, when this is zero the memory-type is loaded from the kernel flags stored in the exheader ARM11 kernel descriptors, for the process using the SVC.&lt;br /&gt;
&lt;br /&gt;
ControlMemory parameter MemoryType with value 0x10003 is used for mapping the GSP [[Memory_layout|heap]]. The low 8-bits are the type: 1 is for un-mapping memory, 3 for mapping memory. Type4 is used to mirror the RW memory at Addr1, to Addr0. Type4 will return an error if Addr1 is located in read-only memory. Addr1 is not used for type1 and type3.&lt;br /&gt;
&lt;br /&gt;
The ARM11 kernel does not allow processes to create shared memory blocks via svcCreateMemoryBlock, when the process memorytype (from the kernel flags stored in the exheader kernel descriptor) is the application memorytype, and when addr=0. When the memorytype is not the application memorytype and addr=0, the kernel allocates new memory for the calling process and turns it into a shared memory block. When addr is non-zero, it must be located in memory which is already mapped. Furthermore, it appears that only regular heap pages (allocated using svcControlMemory op=COMMIT) are accepted as valid addrs.&lt;br /&gt;
&lt;br /&gt;
ControlProcessMemory maps memory in the specified process, this is the only SVC which allows mapping executable memory. Format of the permissions field for memory mapping SVCs: bit0=R, bit1=W, bit2=X. Type6 sets the Addr0 memory permissions to the input permissions, for already mapped memory. Type is the MemoryOperation enum, without the memory-type/memory-region. ControlProcessMemory only supports type4, type5, and type6. ControlProcessMemory does not support using the current KProcess handle alias.&lt;br /&gt;
&lt;br /&gt;
Note that with the MAP MemoryOperation, the kernel will refuse to MAP memory for the specified addr1, when addr1 was already used with another MAP operation as addr1. The kernel also doesn&#039;t allow memory to be freed via the FREE MemoryOperation, when other virtual-memory is mapped to this same memory(when the MAP MemoryOperation was used with this memory with addr1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;&#039;&#039;MapProcessMemory&#039;&#039;&#039;(Handle process, u32 destAddr, u32 limit)&amp;lt;/code&amp;gt; maps memory from the given process into the current process. First &amp;lt;code&amp;gt;min(limit, 0x3F00000)&amp;lt;/code&amp;gt; bytes are mapped starting from &amp;lt;code&amp;gt;0x00100000&amp;lt;/code&amp;gt; in the source process to &amp;lt;code&amp;gt;destAddr&amp;lt;/code&amp;gt; in the current process. Then &amp;lt;code&amp;gt;min(limit - 0x7F00000, 0x6000000)&amp;lt;/code&amp;gt; bytes (if more than 0) are mapped from &amp;lt;code&amp;gt;0x08000000&amp;lt;/code&amp;gt; in the source process to &amp;lt;code&amp;gt;destAddr + 0x7F00000&amp;lt;/code&amp;gt; in the current process. Another way to view this is that it is overlaying the two ranges &amp;lt;code&amp;gt;[0x0010_0000; 0x0400_0000]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[0x0800_0000; 0x0E00_0000]&amp;lt;/code&amp;gt; from the source process onto &amp;lt;code&amp;gt;[destAddr - 0x100000; destAddr + limit]&amp;lt;/code&amp;gt; in the current process, truncating whatever part of the mapping that doesn&#039;t fit.  This system call is used by [[RO Services]] to map the program&#039;s code and heap into ro. Memory mapped by MapProcessMemory is unmapped by UnmapProcessMemory.&lt;br /&gt;
&lt;br /&gt;
= How The Kernel Allocates And Tracks Memory =&lt;br /&gt;
&lt;br /&gt;
== MemoryBlockHeader ==&lt;br /&gt;
&lt;br /&gt;
Size: 0xC-bytes(?) pre-v11.0, 0x18-bytes starting with v11.0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset&lt;br /&gt;
! Type&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Size in pages&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| MemoryBlockHeader*&lt;br /&gt;
| Next&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| MemoryBlockHeader*&lt;br /&gt;
| Prev&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| MemoryBlockHeader*&lt;br /&gt;
| Pointer to the current memchunk. Added with v11.0?&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Nonce, doesn&#039;t seem to be read at all except during MAC calculation. Added with v11.0. Used with the new heap [[11.0.0-33|security]] feature. A kernel state field is copied to this field before calculating the MAC. Once done, that kernel state field is subtracted by the value of the calculated MAC stored below. Since this kernel state field is initially 0x0, this field for the FCRAM APPLICATION+0 MemoryBlockHeader during kernel boot is set to 0x0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| u32&lt;br /&gt;
| MAC calculated over rest of struct. Added with v11.0. Used with the new heap [[11.0.0-33|security]] feature.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== RegionDescriptor ==&lt;br /&gt;
&lt;br /&gt;
Size: 0x10-bytes pre-[[11.0.0-33|11.0.0-X]], 0x20-bytes starting with [[11.0.0-33|11.0.0-X]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| MemoryBlockHeader*&lt;br /&gt;
| First&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| MemoryBlockHeader*&lt;br /&gt;
| Last&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Region start&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| Region size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| 0x10-byte block.&lt;br /&gt;
| This is the &amp;quot;key&amp;quot; used with the kernel heap MAC implemented with [[11.0.0-33|11.0.0-X]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== FCRAM Region Descriptor ==&lt;br /&gt;
&lt;br /&gt;
Size: 0x50-bytes pre-[[11.0.0-33|11.0.0-X]], 0x80-bytes starting with [[11.0.0-33|11.0.0-X]].&lt;br /&gt;
&lt;br /&gt;
X = RegionDescriptor_size*3.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| RegionDescriptor &lt;br /&gt;
| RegionDescriptor for app memory&lt;br /&gt;
|-&lt;br /&gt;
| RegionDescriptor_size*1&lt;br /&gt;
| RegionDescriptor&lt;br /&gt;
| RegionDescriptor for sys memory&lt;br /&gt;
|-&lt;br /&gt;
| RegionDescriptor_size*2&lt;br /&gt;
| RegionDescriptor&lt;br /&gt;
| RegionDescriptor for base memory&lt;br /&gt;
|-&lt;br /&gt;
| X + 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Ptr to start of FCRAM region descriptor&lt;br /&gt;
|-&lt;br /&gt;
| X + 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| FCRAM start&lt;br /&gt;
|-&lt;br /&gt;
| X + 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| FCRAM size in pages&lt;br /&gt;
|-&lt;br /&gt;
| X + 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| Base memory start in FCRAM&lt;br /&gt;
|-&lt;br /&gt;
| X + 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Count of physical FCRAM used by the kernel, in bytes. (used by [[SVC|svcGetSystemInfo]])&lt;br /&gt;
|-&lt;br /&gt;
| X + 0x14&lt;br /&gt;
| u32&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| X + 0x18&lt;br /&gt;
| KThread*&lt;br /&gt;
| Thread operating on region data&lt;br /&gt;
|-&lt;br /&gt;
| X + 0x1C&lt;br /&gt;
| s16&lt;br /&gt;
| Error info for thread listed above&lt;br /&gt;
|-&lt;br /&gt;
| X + 0x1E&lt;br /&gt;
| u16&lt;br /&gt;
| Alignment&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Kernel Region Descriptor ==&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KServerPort&amp;diff=18316</id>
		<title>KServerPort</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KServerPort&amp;diff=18316"/>
		<updated>2016-09-29T02:05:08Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KServerPort]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x24 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of KServerSessions associated with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of KServerSessions associated with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KPort]]* &lt;br /&gt;
| Pointer to parent KPort&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Memory_layout&amp;diff=18297</id>
		<title>Memory layout</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Memory_layout&amp;diff=18297"/>
		<updated>2016-09-25T23:34:19Z</updated>

		<summary type="html">&lt;p&gt;Bond697: /* Memory map by firmware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Physical Memory =&lt;br /&gt;
&lt;br /&gt;
== ARM11 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Old 3DS&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x00000000&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Bootrom (super secret code/data @ 0x8000)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Bootrom mirror&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x10000000&lt;br /&gt;
|?&lt;br /&gt;
| [[IO]] memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x17E00000&lt;br /&gt;
| 0x00002000&lt;br /&gt;
| MPCore private memory region&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x17E10000&lt;br /&gt;
| 0x00001000&lt;br /&gt;
| L2C-310 Level 2 Cache Controller (2MB)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x18000000&lt;br /&gt;
| 0x00600000&lt;br /&gt;
| VRAM (divided in two banks, VRAM and VRAMB)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x1F000000&lt;br /&gt;
| 0x00400000&lt;br /&gt;
| [[New_3DS]] additional memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| DSP memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| AXI WRAM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| FCRAM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x28000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| [[New_3DS]] FCRAM extension&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Bootrom mirror&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===0x17E10000===&lt;br /&gt;
The 32-bit register at &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt; only has bit 0 set when, on New 3DS, [[PTMSYSM:ConfigureNew3DSCPU]] was used with bit 1 set for the input value (the L2 cache flag). All other bits in this register are normally all-zero. Therefore, bit 0 set = new cache hardware enabled, bit 0 clear = new cache hardware disabled. This bit is how the ARM11 kernel checks whether the additional cache hardware is enabled).&lt;br /&gt;
&lt;br /&gt;
To enable the additional cache hardware, the following is used by the ARM11 kernel:&lt;br /&gt;
* Sets bit 0 in 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To disable the additional cache hardware, the following is used by the ARM11 kernel:&lt;br /&gt;
* Writes value &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt; to 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x77C&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Waits for bit 0 in 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x730&amp;lt;/code&amp;gt; to become clear.&lt;br /&gt;
* Writes value &amp;lt;code&amp;gt;0x0&amp;lt;code&amp;gt; to 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Clears bit 0 in 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;0x1F000000&amp;lt;/code&amp;gt; ([[New 3DS]] only) ===&lt;br /&gt;
This area is used by [[QTM Services]],starting at offset &amp;lt;code&amp;gt;0x200000&amp;lt;/code&amp;gt;, size &amp;lt;code&amp;gt;0x180000&amp;lt;/code&amp;gt;. This area is not accessible to the GPU on the old 3DS. The old 3DS and New 3DS GSP module has &amp;lt;code&amp;gt;vaddr-&amp;amp;gt;physaddr&amp;lt;/code&amp;gt; conversion code for this entire region. On the New 3DS, only the first &amp;lt;code&amp;gt;0x200000&amp;lt;/code&amp;gt; bytes (half of this memory) are accessible to the GPU.&lt;br /&gt;
&lt;br /&gt;
== ARM9 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Old 3DS&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x00000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| Instruction TCM, repeating each 0x8000 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| 0x00008000&lt;br /&gt;
| Instruction TCM (Accessed by the kernel and process by this address)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x07FF8000&lt;br /&gt;
| 0x00008000&lt;br /&gt;
| Instruction TCM (Accessed by bootrom by this address)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| ARM9-only internal memory (ARM7&#039;s internal regions are mapped here as well)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x08100000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| [[New_3DS]] ARM9-only extension, only enabled when a certain [[CONFIG_Registers|CONFIG]] register is set.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| [[IO]] memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x18000000&lt;br /&gt;
| 0x00600000&lt;br /&gt;
| VRAM (divided in two banks, VRAM and VRAMB) &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| DSP memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| AXI WRAM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| FCRAM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x28000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| [[New_3DS]] FCRAM extension&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0xFFF00000&lt;br /&gt;
| 0x00004000&lt;br /&gt;
| Data TCM (Mapped during bootrom)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Bootrom, the main region is at +0x8000, which is disabled during system boot.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==ARM9 MPU Regions==&lt;br /&gt;
For the below instruction permissions: RO = memory is executable, while None = not-executable.&lt;br /&gt;
&lt;br /&gt;
===NATIVE_FIRM/SAFE_MODE_FIRM ARM9 kernel===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Region&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Privileged-mode data permissions&lt;br /&gt;
!  User-mode data permissions&lt;br /&gt;
!  Privileged-mode instruction permissions&lt;br /&gt;
!  User-mode instruction permissions&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 1MB/0x100000. &amp;gt;=[[8.0.0-18|8.0.0-X]]: 2MB/0x200000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x10100000&lt;br /&gt;
| 512KB/0x80000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 128MB/0x8000000. &amp;gt;=[[8.0.0-18|8.0.0-X]]: 256MB/0x10000000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x08020000&lt;br /&gt;
| &amp;lt;[[3.0.0-5]]: 64KB/0x10000. &amp;gt;=[[3.0.0-5]]: 32KB/0x8000.&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above is the MPU region settings setup by the ARM9-kernel in the crt0.&lt;br /&gt;
&lt;br /&gt;
The New3DS ARM9-kernel MPU region settings are the same as the Old3DS MPU region settings for &amp;gt;=[[8.0.0-18|8.0.0-X]].&lt;br /&gt;
&lt;br /&gt;
At the start of the Process9 function executed in kernel-mode via svc7b during firm-launching, it changes some MPU region settings. At the end of that function, before it uses the ARM9/ARM11 entrypoint fields, it disables MPU.&lt;br /&gt;
&lt;br /&gt;
===New3DS [[FIRM|ARM9-loader]]===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Region&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Privileged-mode data permissions&lt;br /&gt;
!  User-mode data permissions&lt;br /&gt;
!  Privileged-mode instruction permissions&lt;br /&gt;
!  User-mode instruction permissions&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 2MB/0x200000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MPU regions 4-7 are disabled. Note that the entire ARM9-loader runs in SVC-mode.&lt;br /&gt;
&lt;br /&gt;
===TWL_FIRM/AGB_FIRM ARM9 kernel===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Region&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Privileged-mode data permissions&lt;br /&gt;
!  User-mode data permissions&lt;br /&gt;
!  Privileged-mode instruction permissions&lt;br /&gt;
!  User-mode instruction permissions&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 1MB/0x100000. New3DS: 2MB/0x200000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| 2MB/0x200000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 512KB/0x80000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 128MB/0x8000000. New3DS: 256MB/0x10000000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| &amp;lt;[[3.0.0-5|3.0.0-X]]: 256KB/0x40000. &amp;gt;=[[3.0.0-5|3.0.0-X]]: 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x08080000&lt;br /&gt;
| 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==ARM9 ITCM==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ITCM mirror address&lt;br /&gt;
!  ITCM bootrom mirror address&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| &lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x3700&lt;br /&gt;
| Uninitialized memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB700&lt;br /&gt;
| 0x07FFB700&lt;br /&gt;
| 0x3700&lt;br /&gt;
| 0x100&lt;br /&gt;
| The unprotected ARM9-bootrom code copies code from unprotected bootrom to 0x07FFB700(ITCM mirror) size 0x100, then calls the code at 0x07FFB700. The code located here is the code used for disabling access to the bootroms.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB800&lt;br /&gt;
| &lt;br /&gt;
| 0x3800&lt;br /&gt;
| 0x4&lt;br /&gt;
| This is always 0xDEADB00F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB804&lt;br /&gt;
| &lt;br /&gt;
| 0x3804&lt;br /&gt;
| 0x4&lt;br /&gt;
| This is the u32 DeviceId.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB808&lt;br /&gt;
| &lt;br /&gt;
| 0x3808&lt;br /&gt;
| 0x10&lt;br /&gt;
| This is the fall-back keyY used for movable.sed keyY when movable.sed doesn&#039;t exist in NAND(the last two words here are used on retail for generating console-unique TWL keydata/etc). This is also used for &amp;quot;LocalFriendCodeSeed&amp;quot;, etc.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB818&lt;br /&gt;
| &lt;br /&gt;
| 0x3818&lt;br /&gt;
| 0x1&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB819&lt;br /&gt;
| &lt;br /&gt;
| 0x3819&lt;br /&gt;
| 0x1&lt;br /&gt;
| This is the [[CTCert]] issuer type: 0 = retail &amp;quot;Nintendo CA - G3_NintendoCTR2prod&amp;quot;, non-zero = dev &amp;quot;Nintendo CA - G3_NintendoCTR2dev&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB81A&lt;br /&gt;
| &lt;br /&gt;
| 0x381A&lt;br /&gt;
| 0x6&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB820&lt;br /&gt;
| &lt;br /&gt;
| 0x3820&lt;br /&gt;
| 0x4&lt;br /&gt;
| This is the CTCert ECDSA exponent, this is byte-swapped when *((u8*)(0x01FFB800+0x18)) is &amp;gt;=5.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB824&lt;br /&gt;
| &lt;br /&gt;
| 0x3824&lt;br /&gt;
| 0x2&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB826&lt;br /&gt;
| &lt;br /&gt;
| 0x3826&lt;br /&gt;
| 0x1E&lt;br /&gt;
| This is the CTCert ECDSA privk.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB844&lt;br /&gt;
| &lt;br /&gt;
| 0x3844&lt;br /&gt;
| 0x3C&lt;br /&gt;
| This is the CTCert ECDSA signature.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB880&lt;br /&gt;
| &lt;br /&gt;
| 0x3880&lt;br /&gt;
| 0x80&lt;br /&gt;
| This is all-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB900&lt;br /&gt;
| &lt;br /&gt;
| 0x3900&lt;br /&gt;
| 0x200&lt;br /&gt;
| This is the 0x200-bytes from NAND sector0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFBB00&lt;br /&gt;
| &lt;br /&gt;
| 0x3B00&lt;br /&gt;
| 0x200&lt;br /&gt;
| This is the 0x200-bytes from the plaintext NAND firm partition FIRM header, read by bootrom.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFBD00&lt;br /&gt;
| &lt;br /&gt;
| 0x3D00&lt;br /&gt;
| 0x100&lt;br /&gt;
| This is the RSA-2048 modulus for [[RSA_Registers|RSA]]-engine slot0 set by bootrom.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFBE00&lt;br /&gt;
| &lt;br /&gt;
| 0x3E00&lt;br /&gt;
| 0x100&lt;br /&gt;
| This is the RSA-2048 modulus for RSA-engine slot1 set by bootrom.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFBF00&lt;br /&gt;
| &lt;br /&gt;
| 0x3F00&lt;br /&gt;
| 0x100&lt;br /&gt;
| This is the RSA-2048 modulus for RSA-engine slot2.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFC000&lt;br /&gt;
| &lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x100&lt;br /&gt;
| This is the RSA-2048 modulus for RSA-engine slot3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFC100&lt;br /&gt;
| &lt;br /&gt;
| 0x4100&lt;br /&gt;
| 0x800&lt;br /&gt;
| These are RSA-2048 keys: 4 slots, each slot is 0x200-bytes. Slot+0 is the modulus, slot+0x100 is the private exponent. This can be confirmed by RSA-decrypting a message into a signature, then RSA-encrypting the signature back into a message, and comparing the original message with the output from the last operation.&lt;br /&gt;
&lt;br /&gt;
[[FIRM]] doesn&#039;t seem to ever use these. None of these are related to RSA-keyslot0 used for v6.0/v7.0 key generation. These moduli are separate from all other moduli used elsewhere.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFC900&lt;br /&gt;
| 0x07FFC900&lt;br /&gt;
| 0x4900&lt;br /&gt;
| 0x400&lt;br /&gt;
| The unprotected ARM9-bootrom copies data to 0x07FFC900(mirror of 0x01FFC900) size 0x400. This data is copied from AXI WRAM, initialized by ARM11-bootrom(the addr used for the src is determined by [[CONFIG_Registers|REG_UNITINFO]]). These are RSA moduli: retailsrcptr = 0x1FFFD000, devsrvptr = 0x1FFFD400.&lt;br /&gt;
* The first 0x100-bytes here is the RSA-2048 modulus for the CFA NCCH header, and for the gamecard NCSD header.&lt;br /&gt;
* 0x01FFCA00 is the RSA-2048 modulus for the CXI accessdesc signature, written to rsaengine keyslot1 by NATIVE_FIRM.&lt;br /&gt;
* 0x01FFCB00 size 0x200 is unknown, probably RSA related, these aren&#039;t used by [[FIRM]](these are not console-unique).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFCD00&lt;br /&gt;
| &lt;br /&gt;
| 0x4D00&lt;br /&gt;
| 0x80&lt;br /&gt;
| Unknown, not used by [[FIRM]]. This isn&#039;t console-unique.&lt;br /&gt;
The first 0x10-bytes are checked by the v6.0/v7.0 NATIVE_FIRM keyinit function, when non-zero it clears this block and continues to do the key generation. Otherwise when this block was already all-zero, it immediately returns. This memclear was probably an attempt at destroying the RSA slot0 modulus, that missed (exactly 0x1000-bytes away). Even though they &amp;quot;failed&amp;quot; here, one would still need to derive the private exponent, which would require obtaining a ciphertext and plaintext.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFCD80&lt;br /&gt;
| &lt;br /&gt;
| 0x4D80&lt;br /&gt;
| 0x64&lt;br /&gt;
| 0x01FFCD84 size 0x10-bytes is the NAND CID(the 0x64-byte region at 0x01FFCD80 is initialized by Process9 + ARM9-bootrom). The u32 at 0x01FFCDC4 is the total number of NAND sectors, read from a MMC command.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFCDE4&lt;br /&gt;
| &lt;br /&gt;
| 0x4DE4&lt;br /&gt;
| 0x21C&lt;br /&gt;
| Uninitialized memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFD000&lt;br /&gt;
| 0x07FFD000&lt;br /&gt;
| 0x5000&lt;br /&gt;
| 0x2470&lt;br /&gt;
| The unprotected ARM9-bootrom copies 0x1FFFA000(AXIWRAM mem initialized by ARM11-bootrom) size 0x2470 to 0x07FFD000(mirror of 0x01FFD000). This block contains DSi keys.&lt;br /&gt;
* 0x01FFD000 is the RSA-1024 modulus for the retail System Menu&lt;br /&gt;
* 0x01FFD080 is the RSA-1024 modulus for DSi Wifi firmware and DSi Sound&lt;br /&gt;
* 0x01FFD100 is the RSA-1024 modulus for base DSi apps (Settings, Shop, etc.)&lt;br /&gt;
* 0x01FFD180 is the RSA-1024 modulus for DSiWare and RSA-signed cartridge headers&lt;br /&gt;
* 0x01FFD210 is the keyY for per-console-encrypted ES blocks&lt;br /&gt;
* 0x01FFD220 is the keyY for fixed-keyX ES blocks&lt;br /&gt;
* 0x01FFD300 is the DSi common (normal)key&lt;br /&gt;
* 0x01FFD350 is a normalkey set on keyslot 0x02, and is likely only used during boot&lt;br /&gt;
* 0x01FFD380 is the keyslot 0x00 keyX and the first half of the retail keyX for modcrypt crypto &amp;quot;Nintendo&amp;quot;&lt;br /&gt;
* 0x01FFD398 is the keyX used for &#039;Tad&#039; crypto, usually in keyslot 0x02 &amp;quot;Nintendo DS&amp;quot;, ..&lt;br /&gt;
* 0x01FFD3A8 is set as the middle two words of keyslot 0x03&#039;s keyX, before being overwritten &amp;quot;NINTENDO&amp;quot;&lt;br /&gt;
* 0x01FFD3BC is the keyY for keyslot 0x01, see below&lt;br /&gt;
* 0x01FFD3C8 is the fixed keyY used for eMMC partition crypto on retail DSi, see below (keyslot 0x03)&lt;br /&gt;
* 0x01FFD3E0 is the 0x1048-byte Blowfish data for DSi cart crypto&lt;br /&gt;
* 0x01FFE428 is the 0x1048-byte Blowfish data for DS cart crypto&lt;br /&gt;
On the 3DS, keyslots 0x01 and 0x03 have the last word set as 0xE1A00005 instead of the next word in ITCM. This is consistent with retail DSis.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFF470&lt;br /&gt;
| &lt;br /&gt;
| 0x7470&lt;br /&gt;
| 0xB90&lt;br /&gt;
| Uninitialized memory.&lt;br /&gt;
0x01FFFC00 size 0x100-bytes starting with [[9.5.0-22|9.5.0-X]] is the FIRM header used during FIRM-launching.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Memory map by firmware=&lt;br /&gt;
* [[Virtual address mapping FW0B]]&lt;br /&gt;
* [[Virtual address mapping FW1F]]&lt;br /&gt;
* [[Virtual address mapping FW25]]&lt;br /&gt;
* [[Virtual address mapping FW2E]]&lt;br /&gt;
* [[Virtual address mapping FW37]]&lt;br /&gt;
* [[Virtual address mapping FW38‎]]&lt;br /&gt;
* [[Virtual address mapping FW3F]]&lt;br /&gt;
* FW49([[9.6.0-24|9.6.0-X]]) and [[10.0.0-27|10.0.0-X]] ARM11-kernel vmem mapping is identical to FW40([[9.5.0-22|9.5.0-X]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Virtual address mapping TWLFIRM04]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Virtual address mapping New3DS v8.1]]&lt;br /&gt;
* [[Virtual address mapping New3DS v9.0]]&lt;br /&gt;
* [[Virtual address mapping New3DS v9.2]]&lt;br /&gt;
* [[Virtual address mapping New3DS v11.1]]&lt;br /&gt;
&lt;br /&gt;
=ARM11 Detailed physical memory map=&lt;br /&gt;
 18000000 - 18600000: VRAM&lt;br /&gt;
 &lt;br /&gt;
 1FF80000 - 1FFAB000: Kernel code&lt;br /&gt;
 1FFAB000 - 1FFF0000: SlabHeap [temporarily contains boot processes]&lt;br /&gt;
 1FFF0000 - 1FFF1000: ?&lt;br /&gt;
 1FFF1000 - 1FFF2000: ?&lt;br /&gt;
 1FFF2000 - 1FFF3000: ?&lt;br /&gt;
 1FFF3000 - 1FFF4000: ?&lt;br /&gt;
 1FFF4000 - 1FFF5000: Exception vectors&lt;br /&gt;
 1FFF5000 - 1FFF5800: Unused?&lt;br /&gt;
 1FFF5800 - 1FFF5C00: 256-entry L2 MMU table for VA FF4xx000&lt;br /&gt;
 1FFF5C00 - 1FFF6000: 256-entry L2 MMU table for VA FF5xx000&lt;br /&gt;
 1FFF6000 - 1FFF6400: 256-entry L2 MMU table for VA FF6xx000&lt;br /&gt;
 1FFF6400 - 1FFF6800: 256-entry L2 MMU table for VA FF7xx000&lt;br /&gt;
 1FFF6800 - 1FFF6C00: 256-entry L2 MMU table for VA FF8xx000&lt;br /&gt;
 1FFF6C00 - 1FFF7000: 256-entry L2 MMU table for VA FF9xx000&lt;br /&gt;
 1FFF7000 - 1FFF7400: 256-entry L2 MMU table for VA FFAxx000&lt;br /&gt;
 1FFF7400 - 1FFF7800: 256-entry L2 MMU table for VA FFBxx000&lt;br /&gt;
 1FFF7800 - 1FFF7C00: MMU table but unused?&lt;br /&gt;
 1FFF7C00 - 1FFF8000: 256-entry L2 MMU table for VA FFFxx000 &lt;br /&gt;
 1FFF8000 - 1FFFC000: 4096-entry L1 MMU table for VA xxx00000 (CPU 0)&lt;br /&gt;
 1FFFC000 - 20000000: 4096-entry L1 MMU table for VA xxx00000 (CPU 1)&lt;br /&gt;
 20000000 - 28000000: Main memory&lt;br /&gt;
&lt;br /&gt;
The entire FCRAM is cleared during NATIVE_FIRM boot. This is done by the ARM11 kernel in order by region as it initializes after loading [[FIRM]] launch parameters from FCRAM.&lt;br /&gt;
&lt;br /&gt;
== FCRAM memory-regions layout ==&lt;br /&gt;
FCRAM is partitioned into three regions of memory (APPLICATION, SYSTEM, and BASE). Most applications can only allocate memory from one of these regions (which is encoded in the [[NCCH/Extended_Header#ARM11_Kernel_Flags|process kernel flags]]). There is a fixed set of possible size of each memory region, determined by the APPMEMTYPE value in [[Configuration_Memory#APPMEMTYPE|configuration memory]] (which in turn is set up according to the [[FIRM#FIRM_Launch_Parameters|firmware launch parameters]]).&lt;br /&gt;
&lt;br /&gt;
Support for APPMEMTYPEs 6 and 7 was implemented in [[NS]] with [[8.0.0-18]]. These configurations are only supported in the [[New_3DS]] ARM11-kernel, and are in fact the only ones supported there at all. Applications only get access to the larger memory regions when this is specified in their [[NCCH/Extended Header#New3DS System Mode|extended header]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  APPMEMTYPE&lt;br /&gt;
!  APPLICATION starting address (relative to FCRAM)&lt;br /&gt;
!  APPLICATION region size&lt;br /&gt;
!  SYSTEM starting address (relative to FCRAM)&lt;br /&gt;
!  SYSTEM region size&lt;br /&gt;
!  BASE starting address (relative to FCRAM)&lt;br /&gt;
!  BASE region size&lt;br /&gt;
|-&lt;br /&gt;
| 0 (default with regular 3DS kernel, used when the type is not 2-5)&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x04000000(64MB)&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| 0x02C00000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x06000000(96MB)&lt;br /&gt;
| 0x06000000&lt;br /&gt;
| 0x00C00000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x05000000(80MB)&lt;br /&gt;
| 0x05000000&lt;br /&gt;
| 0x01C00000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x04800000(72MB)&lt;br /&gt;
| 0x04800000&lt;br /&gt;
| 0x02400000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x02000000(32MB)&lt;br /&gt;
| 0x02000000&lt;br /&gt;
| 0x04C00000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 6 (This is the default on New3DS. With [[New_3DS]] kernel this is the type used when the value is not 7)&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x07C00000(124MB)&lt;br /&gt;
| 0x07C00000&lt;br /&gt;
| 0x06400000&lt;br /&gt;
| 0x0E000000&lt;br /&gt;
| 0x02000000&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0B200000(178MB)&lt;br /&gt;
| 0x0B200000&lt;br /&gt;
| 0x02E00000&lt;br /&gt;
| 0x0E000000&lt;br /&gt;
| 0x02000000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The SYSTEM mem-region size is calculated with: size = FCRAMTOTALSIZE - (APPLICATION_MEMREGIONSIZE + BASE_MEMREGIONSIZE).&lt;br /&gt;
&lt;br /&gt;
All memory allocated by the kernel itself for kernel use is located under BASE. Most system-modules run under the BASE memregion too.&lt;br /&gt;
&lt;br /&gt;
Free/used memory on [[4.5.0-10]] with Home Menu / Internet Browser, with the default APPMEMTYPE on retail:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Region&lt;br /&gt;
!  Base address relative to FCRAM+0&lt;br /&gt;
!  Region size&lt;br /&gt;
!  Used memory once [[Home Menu]] finishes loading for system boot, on [[4.5.0-10]]&lt;br /&gt;
!  Used memory with [[Internet Browser]] running instead of [[Home Menu]], on [[4.5.0-10]]&lt;br /&gt;
!  Free memory once [[Home Menu]] finishes loading for system boot, on [[4.5.0-10]]&lt;br /&gt;
!  Free memory with [[Internet Browser]] running instead of [[Home Menu]], on [[4.5.0-10]]&lt;br /&gt;
|-&lt;br /&gt;
| APPLICATION&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| 0x0&lt;br /&gt;
| &lt;br /&gt;
| 0x04000000&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SYSTEM&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| 0x02C00000&lt;br /&gt;
| 0x01488000&lt;br /&gt;
| 0x02A50000&lt;br /&gt;
| 0x01778000&lt;br /&gt;
| 0x001B0000&lt;br /&gt;
|-&lt;br /&gt;
| BASE&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
| 0x01202000&lt;br /&gt;
| 0x01236000&lt;br /&gt;
| 0x001FE000&lt;br /&gt;
| 0x001CA000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=ARM11 Detailed virtual memory map=&lt;br /&gt;
(valid only for FW0B, see [[#Memory map by firmware|Memory map by firmware]] for subsequent versions)&lt;br /&gt;
&lt;br /&gt;
 E8000000 - E8600000: mapped VRAM (18000000 - 18600000)&lt;br /&gt;
 &lt;br /&gt;
 EFF00000 - F0000000: mapped Internal memory (1FF00000 - 20000000)&lt;br /&gt;
 F0000000 - F8000000: mapped Main memory&lt;br /&gt;
 &lt;br /&gt;
 FF401000 - FF402000: mapped ? (27FC7000 - 27FC8000)&lt;br /&gt;
 &lt;br /&gt;
 FF403000 - FF404000: mapped ? (27FC2000 - 27FC3000)&lt;br /&gt;
 &lt;br /&gt;
 FF405000 - FF406000: mapped ? (27FBB000 - 27FBC000)&lt;br /&gt;
 &lt;br /&gt;
 FF407000 - FF408000: mapped ? (27FB3000 - 27FB4000)&lt;br /&gt;
 &lt;br /&gt;
 FF409000 - FF40A000: mapped ? (27F8E000 - 27F8F000)&lt;br /&gt;
 &lt;br /&gt;
 FFF00000 - FFF45000: mapped SlabHeap &lt;br /&gt;
 &lt;br /&gt;
 FFF60000 - FFF8B000: mapped Kernel code&lt;br /&gt;
 &lt;br /&gt;
 FFFCC000 - FFFCD000: mapped IO [[I2C|I2C]] second bus (10144000 - 10145000)&lt;br /&gt;
 &lt;br /&gt;
 FFFCE000 - FFFCF000: mapped IO PDC([[LCD]]) (10400000 - 10401000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD0000 - FFFD1000: mapped IO PDN (10141000 - 10142000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD2000 - FFFD3000: mapped IO PXI (10163000 - 10164000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD4000 - FFFD5000: mapped IO PAD (10146000 - 10147000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD6000 - FFFD7000: mapped IO LCD (10202000 - 10203000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD8000 - FFFD9000: mapped IO DSP (10140000 - 10141000)&lt;br /&gt;
 &lt;br /&gt;
 FFFDA000 - FFFDB000: mapped IO XDMA (10200000 - 10201000)&lt;br /&gt;
 &lt;br /&gt;
 FFFDC000 - FFFE0000: mapped ? (1FFF8000 - 1FFFC000)&lt;br /&gt;
 &lt;br /&gt;
 FFFE1000 - FFFE2000: mapped ? (1FFF0000 - 1FFF1000)&lt;br /&gt;
 &lt;br /&gt;
 FFFE3000 - FFFE4000: mapped ? (1FFF2000 - 1FFF3000)&lt;br /&gt;
 &lt;br /&gt;
 FFFE5000 - FFFE9000: mapped L1 MMU table for VA xxx00000&lt;br /&gt;
 &lt;br /&gt;
 FFFEA000 - FFFEB000: mapped ? (1FFF1000 - 1FFF2000)&lt;br /&gt;
 &lt;br /&gt;
 FFFEC000 - FFFED000: mapped ? (1FFF3000 - 1FFF4000)&lt;br /&gt;
 &lt;br /&gt;
 FFFEE000 - FFFF0000: mapped IO IRQ (17E00000 - 17E02000)&lt;br /&gt;
 &lt;br /&gt;
 FFFF0000 - FFFF1000: mapped Exception vectors&lt;br /&gt;
 &lt;br /&gt;
 FFFF2000 - FFFF6000: mapped L1 MMU table for VA xxx00000&lt;br /&gt;
 &lt;br /&gt;
 FFFF7000 - FFFF8000: mapped ? (1FFF1000 - 1FFF2000)&lt;br /&gt;
 &lt;br /&gt;
 FFFF9000 - FFFFA000: mapped ? (1FFF3000 - 1FFF4000)&lt;br /&gt;
 &lt;br /&gt;
 FFFFB000 - FFFFE000: mapped L2 MMU tables (1FFF5000 - 1FFF8000)&lt;br /&gt;
&lt;br /&gt;
==0xFF4XX000==&lt;br /&gt;
Each [[KThread|thread]] is allocated a 0x1000-byte page in this region for the [[KThreadContext|thread context]]: the first page at 0xFF401000 is for the first created thread, 0xFF403000 for the second thread. This region is used to store the SVC-mode stack for the thread, and thread context data used for context switching. When the IRQ handler, prefetch/data abort handlers, and undefined instruction handler are entered where the SPSR-mode=user, these handlers then store LR+SPSR for the current mode on the SVC-mode stack, then these handlers switch to SVC-mode.&lt;br /&gt;
&lt;br /&gt;
This page does not contain a dedicated block for storing R0-PC(etc). For user-mode, the user-mode regs are instead saved on the SVC-mode stack when IRQs such as timers for context switching are triggered.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For NATIVE_FIRM the memory pages for this region are located in FCRAM, however for TWL_FIRM these are located in AXI WRAM. For TWL_FIRM v6704 the first thread&#039;s page for this region is located at physical address 0x1FF93000, the next one at 0x1FF92000, etc.&lt;br /&gt;
&lt;br /&gt;
== IO Process virtual addressing equivalence ==&lt;br /&gt;
It seems an IO register&#039;s process virtual address can be calculated by adding 0xEB00000 to its physical address. However for kernel mappings there is no fixed address equivalence.&lt;br /&gt;
&lt;br /&gt;
=ARM11 User-land memory regions=&lt;br /&gt;
==NATIVE_FIRM/SAFE_MODE_FIRM Userland Memory==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Virtual Address Base&lt;br /&gt;
!  Physical Address Base&lt;br /&gt;
!  Region Max Size&lt;br /&gt;
!  Address-range available for svcMapMemoryBlock&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000 / 0x14000000&lt;br /&gt;
| &lt;br /&gt;
| 0x03F00000&lt;br /&gt;
| No&lt;br /&gt;
| The [[ExeFS]]:/.code is loaded here, executables must be loaded to the 0x00100000 region when the exheader &amp;quot;special memory&amp;quot; flag is clear. The 0x03F00000-byte size restriction only applies when this flag is clear. Executables are usually loaded to 0x14000000 when the exheader &amp;quot;special memory&amp;quot; flag is set, however this address can be arbitrary.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| No&lt;br /&gt;
| Used for mapping buffers during IPC, see [[IPC Command Structure]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| Main stack physaddr - &amp;lt;heap size for the allocated vaddr 0x08000000 memory&amp;gt;&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| Yes&lt;br /&gt;
| Heap mapped by [[SVC|ControlMemory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10000000-StackSize&lt;br /&gt;
| .bss physical address - total stack pages&lt;br /&gt;
| StackSize from process exheader&lt;br /&gt;
| &lt;br /&gt;
| Stack for the main-thread, initialized by the ARM11 kernel. The StackSize from the exheader is usually 0x4000, therefore the stack-bottom is usually 0x0FFFC000. The stack for the other threads is normally located in the process .data section however this can be arbitrary.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| &lt;br /&gt;
| 0x04000000&lt;br /&gt;
| Yes&lt;br /&gt;
| [[SVC|Shared]] memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x14000000&lt;br /&gt;
| FCRAM+0&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| No&lt;br /&gt;
| Can be mapped by [[SVC|ControlMemory]], this is used for processes&#039; [[SVC|LINEAR]]/GSP heap.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E800000&lt;br /&gt;
| 0x1F000000&lt;br /&gt;
| 0x00400000&lt;br /&gt;
| No&lt;br /&gt;
| [[New_3DS]] additional memory, access to this is specified by the exheader. Added with [[8.0.0-18]], see above section regarding this memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1EC00000&lt;br /&gt;
| 0x10100000&lt;br /&gt;
| 0x00400000&lt;br /&gt;
| No&lt;br /&gt;
| [[IO]] registers, the mapped IO pages which each process can access is specified in the [[NCCH/Extended_Header|exheader]]. (Applications normally don&#039;t have access to registers in this range)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000000&lt;br /&gt;
| 0x18000000&lt;br /&gt;
| 0x00600000&lt;br /&gt;
| No&lt;br /&gt;
| VRAM, access to this is specified by the exheader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| No&lt;br /&gt;
| DSP memory, access to this is specified by the exheader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| FCRAM memory page allocated by the ARM11 kernel.&lt;br /&gt;
| 0x1000&lt;br /&gt;
| No&lt;br /&gt;
| [[Configuration Memory]], all processes have read-only access to this.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF81000&lt;br /&gt;
| FCRAM memory page allocated by the ARM11 kernel.&lt;br /&gt;
| 0x1000&lt;br /&gt;
| No&lt;br /&gt;
| [[Configuration Memory|Shared]] page, all processes have read-access to this. Write access to this is specified by the exheader &amp;quot;Shared page writing&amp;quot; kernel flag.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF82000&lt;br /&gt;
| Dynamically taken from the BASE region of FCRAM&lt;br /&gt;
| Number of threads * 0x1000 / 8&lt;br /&gt;
| No&lt;br /&gt;
| [[Thread Local Storage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x30000000&lt;br /&gt;
| FCRAM+0&lt;br /&gt;
| 0x08000000(Old3DS) / 0x10000000([[New_3DS]])&lt;br /&gt;
| No&lt;br /&gt;
| This LINEAR memory mapping was added with [[8.0.0-18]], see [[SVC#enum_MemoryOperation|here]]. This replaces the original 0x14000000 mapping, for system(memory-region=BASE)/newer titles. The Old3DS kernel uses size 0x08000000 for LINEAR-memory address range checks, while the New3DS kernel uses size 0x10000000 for those range checks. Old3DS/New3DS system-module code doing vaddr-&amp;gt;phys-addr conversion uses size 0x10000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20000000 / 0x40000000&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| This is the end-address of userland memory, memory under this address is process-unique. Memory starting at this address is only accessible in privileged-mode. This address was changed from 0x20000000 to 0x40000000 with [[8.0.0-18]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All executable pages are read-only, and data pages have the execute-never permission set. Normally .text from the loaded ExeFS:/.code is the only mapped executable memory. Executable [[RO Services|CROs]] can be loaded into memory, once loaded the CRO .text section memory page permissions are changed via [[SVC|ControlProcessMemory]] from RW- to R-X. The address and size of each ExeFS:/.code section is stored in the exheader, the permissions for each section is: .text R-X, .rodata R--, .data RW-, and .bss RW-. The loaded .code is mapped to the addresses specified in the exheader by the ARM11 kernel. The stack permissions is initialized by the ARM11 kernel: RW-. The heap permissions is normally RW-.&lt;br /&gt;
&lt;br /&gt;
All userland memory is mapped with RW permissions for privileged-mode. However, normally the ARM11 kernel only uses userland read/write instructions(or checks that the memory can be written from userland first) for accessing memory specified by [[SVC|SVCs]].&lt;br /&gt;
&lt;br /&gt;
Processes can&#039;t directly access memory for other processes. When service [[Services API|commands]] are used, the kernel maps memory in the destination process for input/output buffers, where the addresses in the command received by the process is replaced by this mapped memory. When this is an input buffer, the buffer data is copied to the mapped memory. When this is an output buffer, the data stored in the mapped memory is copied to the destination buffer specified in the command.&lt;br /&gt;
&lt;br /&gt;
The physical address which memory for the application memory-type is mapped to begins at FCRAM+0, the total memory allocated for this memory-type is stored in [[Configuration_Memory]]. Applications&#039; .text + .rodata + .data under the application memory-type is mapped at FCRAM + APPMEMALLOC - (aligned page-size for .text + .rodata + .data). The application .bss is mapped at CODEADDR - .bss size aligned down to the page size.&lt;br /&gt;
&lt;br /&gt;
==TWL_FIRM Userland Memory==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Virtual Address Base&lt;br /&gt;
!  Physical Address Base&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| 0x1FFAB000 (with newer TWL_FIRM such as v6704 this is located at 0x1FFAC000)&lt;br /&gt;
| 0x00055000&lt;br /&gt;
| Code + .(ro)data copied from the process 0x00300000 region is located here(.bss is located here as well).&lt;br /&gt;
|-&lt;br /&gt;
| 0x00155000&lt;br /&gt;
| 0x18555000&lt;br /&gt;
| 0x000AB000&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x00200000&lt;br /&gt;
| 0x18500000&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x00300000&lt;br /&gt;
| 0x24000000&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| The beginning of the ARM11 process .text is located here.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 0x07E00000&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x1EC00000&lt;br /&gt;
| 0x10100000&lt;br /&gt;
| 0x00400000&lt;br /&gt;
| [[IO]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000000&lt;br /&gt;
| 0x18000000&lt;br /&gt;
| 0x00600000&lt;br /&gt;
| VRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| This is mapped to the DSP memory.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above regions are mapped by the ARM11 kernel. Later when the ARM11 process uses [[SVC|svcKernelSetState]] with type4, the kernel unmaps(?) the following regions: 0x00300000..0x04300000, 0x08000000..0x0FE00000, and 0x10000000..0xF8000000.&lt;br /&gt;
&lt;br /&gt;
=== Detailed TWL_FIRM ARM11 Memory ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Process Virtual Address&lt;br /&gt;
!  Physical Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 0x01000000*4&lt;br /&gt;
| DS(i) 0x02000000 RAM. Vaddr = (DSRAMOffset*4) + 0x08000000, where DSRAMOffset is DSRAMAddr-0x02000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0FC00000&lt;br /&gt;
| 0x27C00000&lt;br /&gt;
| &lt;br /&gt;
| Loaded SRL binary, initially the dev DSi launcher SRL is located here(copied here by the ARM11 process).&lt;br /&gt;
|-&lt;br /&gt;
| 0x0FD00000&lt;br /&gt;
| 0x27D00000&lt;br /&gt;
| &lt;br /&gt;
| The data located here is copied to here by the ARM11 process. The data located here is a TWL NAND [http://dsibrew.org/wiki/Bootloader bootloader] image, using the same format+encryption/verification methods as the DSi NAND bootloader(stage2). The keyX for this bootloader keyslot is initially set to the retail DSi key-data, however when TWL_FIRM is launched this keyX key-data is replaced with a separate keyX. TWL_FIRM can use either the retail DSi bootloader RSA-1024 modulus, or a seperate modulus: normally only the latter is used(the former is only used when loading the image from FS instead of FCRAM). When using the image from FCRAM(default code-path), TWL_FIRM will not calculate+check the hashes for the bootloader code binaries(this is done when loading from FS however).&lt;br /&gt;
|-&lt;br /&gt;
| 0x0FDF7000&lt;br /&gt;
| 0x27DF7000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| SRL header&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= System memory details  =&lt;br /&gt;
 0xFFFF9000 Pointer to the current KThread instance&lt;br /&gt;
 0xFFFF9004 Pointer to the current KProcess instance&lt;br /&gt;
 0xFFFF9008 Pointer to the current KScheduler instance&lt;br /&gt;
 0xFFFF9010 Pointer to the last KThread to encounter an exception&lt;br /&gt;
&lt;br /&gt;
 0x8000040 Pointer to the current KThread instance on the ARM9&lt;br /&gt;
 0x8000044 Pointer to the current KProcess instance on the ARM9&lt;br /&gt;
 0x8000048 Pointer to the current KScheduler instance on the ARM9&lt;br /&gt;
&lt;br /&gt;
= VRAM Map While Running System Applets =&lt;br /&gt;
*0x1E6000-0x22C500 -- top screen 3D left framebuffer 0(240x400x3) (The &amp;quot;3D right first-framebuf&amp;quot; addr stored in the LCD register is set to this, when the 3D is set to &amp;quot;off&amp;quot;)&lt;br /&gt;
*0x22C800-0x272D00 -- top screen 3D right framebuffer 0(240x400x3)&lt;br /&gt;
*0x273000-0x2B9500 -- top screen 3D left framebuffer 1(240x400x3)&lt;br /&gt;
*0x2B9800-0x2FFD00 -- top screen 3D right framebuffer 1(240x400x3)&lt;br /&gt;
*0x48F000-0x4C7400 -- bottom screen framebuffer 0(240x320x3)&lt;br /&gt;
*0x4C7800-0x4FF800 -- bottom screen framebuffer 1(240x320x3)&lt;br /&gt;
&lt;br /&gt;
These LCD framebuffer addresses are not changed by the system when launching regular applications, the application itself handles that if needed. These VRAM framebuffers are cleared when launching regular applications.&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Virtual_address_mapping_New3DS_v11.1&amp;diff=18296</id>
		<title>Virtual address mapping New3DS v11.1</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Virtual_address_mapping_New3DS_v11.1&amp;diff=18296"/>
		<updated>2016-09-25T23:33:06Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Created page with &amp;quot; [L1 ] VA 1f300000..1f400000 -&amp;gt; PA 1f300000..1f400000 [  X ] [ Priv: RW, User: -- ]  [L1 ] VA d8000000..d8600000 -&amp;gt; PA 18000000..18600000 [ XN ] [ Priv: RW, User: -- ]  [L1 ]...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [L1 ] VA 1f300000..1f400000 -&amp;gt; PA 1f300000..1f400000 [  X ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L1 ] VA d8000000..d8600000 -&amp;gt; PA 18000000..18600000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L1 ] VA df000000..df400000 -&amp;gt; PA 1f000000..1f400000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L1 ] VA dff00000..e0000000 -&amp;gt; PA 1ff00000..20000000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L1 ] VA e0000000..f0000000 -&amp;gt; PA 20000000..30000000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
  ...&lt;br /&gt;
 [L2L] VA fff00000..fff20000 -&amp;gt; PA 1ff80000..1ffa0000 [  X ] [ Priv: R-, User: -- ]&lt;br /&gt;
 [L2S] VA fff20000..fff2e000 -&amp;gt; PA 1ffde000..1ffec000 [  X ] [ Priv: R-, User: -- ]&lt;br /&gt;
 [L2S] VA fff2e000..fff2f000 -&amp;gt; PA 1ffec000..1ffed000 [ XN ] [ Priv: R-, User: -- ]&lt;br /&gt;
 [L2S] VA fff2f000..fff34000 -&amp;gt; PA 1ffed000..1fff2000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2L] VA fff70000..fffa0000 -&amp;gt; PA 1ffa0000..1ffd0000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffa0000..fffae000 -&amp;gt; PA 1ffd0000..1ffde000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffaf000..fffb0000 -&amp;gt; PA 1f3f1000..1f3f2000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffb8000..fffb9000 -&amp;gt; PA 17e10000..17e11000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffba000..fffbb000 -&amp;gt; PA 10144000..10145000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffbc000..fffbd000 -&amp;gt; PA 10400000..10401000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffbe000..fffbf000 -&amp;gt; PA 10141000..10142000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffc0000..fffc1000 -&amp;gt; PA 10163000..10164000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffc2000..fffc3000 -&amp;gt; PA 10146000..10147000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffc4000..fffc5000 -&amp;gt; PA 10202000..10203000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffc6000..fffc7000 -&amp;gt; PA 10140000..10141000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffc8000..fffc9000 -&amp;gt; PA 10206000..10207000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffca000..fffce000 -&amp;gt; PA 1fff8000..1fffc000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffcf000..fffd0000 -&amp;gt; PA 1fff2000..1fff3000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffd1000..fffd2000 -&amp;gt; PA 1fff3000..1fff4000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffd3000..fffd7000 -&amp;gt; PA 1fffc000..20000000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffd8000..fffd9000 -&amp;gt; PA 1f3f2000..1f3f3000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffda000..fffdb000 -&amp;gt; PA 1f3f5000..1f3f6000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffdc000..fffe0000 -&amp;gt; PA 1f3f8000..1f3fc000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffe1000..fffe2000 -&amp;gt; PA 1f3f3000..1f3f4000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffe3000..fffe4000 -&amp;gt; PA 1f3f6000..1f3f7000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffe5000..fffe9000 -&amp;gt; PA 1f3fc000..1f400000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffea000..fffeb000 -&amp;gt; PA 1f3f4000..1f3f5000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffec000..fffed000 -&amp;gt; PA 1f3f7000..1f3f8000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA fffee000..ffff0000 -&amp;gt; PA 17e00000..17e02000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA ffff0000..ffff1000 -&amp;gt; PA 1fff4000..1fff5000 [  X ] [ Priv: R-, User: -- ]&lt;br /&gt;
 [L2S] VA ffff2000..ffff6000 -&amp;gt; PA 1fff8000..1fffc000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA ffff7000..ffff8000 -&amp;gt; PA 1fff2000..1fff3000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA ffff9000..ffffa000 -&amp;gt; PA 1fff3000..1fff4000 [ XN ] [ Priv: RW, User: -- ]&lt;br /&gt;
 [L2S] VA ffffb000..ffffe000 -&amp;gt; PA 1fff5000..1fff8000 [ XN ] [ Priv: RW, User: -- ]&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Main_Page/Navigation&amp;diff=18295</id>
		<title>Main Page/Navigation</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Main_Page/Navigation&amp;diff=18295"/>
		<updated>2016-09-25T14:51:21Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Main page box|Navigation|Main Page/Navigation}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: -.3em -1em -1em -1em;&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; bgcolor=&amp;quot;#fff&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2px&amp;quot; cellspacing=&amp;quot;2px&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#e7eef6&amp;quot;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;General&#039;&#039;&#039; &amp;lt;!-- Stuff not directly related to reverse-engineering, system documentation, and homebrew --&amp;gt;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;Homebrew&#039;&#039;&#039; &amp;lt;!-- Homebrew and exploitation --&amp;gt;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;3DS hardware&#039;&#039;&#039; &amp;lt;!-- 3DS Hardware and its interfaces --&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; style=&amp;quot;background: #F5FAFF;&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
*[[Glossary]]&lt;br /&gt;
*[[Friend code]]&lt;br /&gt;
*[[Games]]&lt;br /&gt;
*[[Serials]]&lt;br /&gt;
*[[:Category:PC utilities|PC Utilities]]&lt;br /&gt;
|&lt;br /&gt;
*[[Homebrew Exploits]]&lt;br /&gt;
*[[Homebrew Applications]]&lt;br /&gt;
*[[Homebrew Libraries and Tools]]&lt;br /&gt;
*[[3DS System Flaws]]&lt;br /&gt;
*[[3DS Userland Flaws]]&lt;br /&gt;
|&lt;br /&gt;
*[[Hardware|Overview]] ([[IO|IO registers]])&lt;br /&gt;
*[[GPU]]&lt;br /&gt;
*[[:Category:DSP|DSP]]&lt;br /&gt;
*[[Peripherals]]&lt;br /&gt;
*[[Gamecards]]&lt;br /&gt;
*[[Video Capture]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: -.3em -1em -1em -1em; margin-top: +1em&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; bgcolor=&amp;quot;#fff&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2px&amp;quot; cellspacing=&amp;quot;2px&amp;quot; style=&amp;quot;margin:auto;&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot; bgcolor=&amp;quot;#e7eef6&amp;quot;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;3DS operating system&#039;&#039;&#039;  &amp;lt;!-- Content related to FIRM data --&amp;gt;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;3DS software stack&#039;&#039;&#039; &amp;lt;!-- Generic system software built on top of the kernel interfaces --&amp;gt;&lt;br /&gt;
! width=&amp;quot;33%&amp;quot; | &#039;&#039;&#039;3DS content&#039;&#039;&#039; &amp;lt;!-- Files used commonly within the system --&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; style=&amp;quot;background: #F5FAFF;&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
*[[Memory layout]] &lt;br /&gt;
*[[Services API]]&lt;br /&gt;
*[[CTR API]]&lt;br /&gt;
*[[Kernel]] ([[SVC|system calls]], [[:Category:Kernel_objects|objects]])&lt;br /&gt;
*[[Bootloader]]&lt;br /&gt;
|&lt;br /&gt;
*[[Nintendo Software]]&lt;br /&gt;
*[[3DS Development Unit Software]]&lt;br /&gt;
*[[Titles]] ([[Title list|list]], [[Title metadata|metadata]], [[Ticket|tickets]])&lt;br /&gt;
*[[Update Data]]&lt;br /&gt;
|&lt;br /&gt;
*[[SD Filesystem]]&lt;br /&gt;
*[[Flash Filesystem]]&lt;br /&gt;
*[[Savegames]]&lt;br /&gt;
*[[:Category:File_formats|File Formats]] ([[NCSD|CCI]]/[[NCCH#CXI|CXI]]/[[CIA]])&lt;br /&gt;
* [[PRUDP|PRUDP (network protocol)]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{box-footer-empty}}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KAutoObject&amp;diff=18011</id>
		<title>KAutoObject</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KAutoObject&amp;diff=18011"/>
		<updated>2016-08-31T12:45:45Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
KAutoObject represents a reference counted object that destroys itself when there are no more references to it.&lt;br /&gt;
&lt;br /&gt;
Size : 0x8 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Class Definition=&lt;br /&gt;
&lt;br /&gt;
    class KAutoObject {&amp;lt;br&amp;gt;&lt;br /&gt;
    public:&lt;br /&gt;
        u32 m_referenceCount;       // 0x4&amp;lt;br&amp;gt;&lt;br /&gt;
    protected:&lt;br /&gt;
        virtual ~KAutoObject() { }&lt;br /&gt;
    };&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Multi-threading&amp;diff=18010</id>
		<title>Multi-threading</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Multi-threading&amp;diff=18010"/>
		<updated>2016-08-31T12:29:05Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents all kernel functionality for managing multiple processes and threads as well as handling synchronization between them.&lt;br /&gt;
&lt;br /&gt;
= Processes =&lt;br /&gt;
&lt;br /&gt;
Each process is given an array of [[NCCH/Extended_Header#ARM11_Kernel_Capabilities|kernel capability descriptors]] upon creation (see CreateProcess). Official software forwards the descriptors specified in the [[NCCH#Extended_Header|NCCH exheader]].&lt;br /&gt;
&lt;br /&gt;
Any process can only use SVCs which are enabled in its kernel capability descriptors. This is enforced by the ARM11 kernel SVC handler by checking the syscall access control mask stored on the SVC-mode stack. If the SVC isn&#039;t enabled, a kernelpanic() is triggered. Each process has a separate SVC-mode stack; this stack and the syscall access mask stored here are initialized when the process is started. Applications normally only have access to SVCs &amp;lt;=0x3D, however not all SVCs &amp;lt;=0x3D are accessible to the application. The majority of the SVCs accessible to applications are unused by the application.&lt;br /&gt;
&lt;br /&gt;
Each process has a separate handle-table, the size of which is stored in the kernel capability descriptor. The handles in a handle-table can&#039;t be used in the context of other processes, since those handles don&#039;t exist in other handle-tables.&lt;br /&gt;
&lt;br /&gt;
0xFFFF8001 is a handle alias for the current process.&lt;br /&gt;
&lt;br /&gt;
Calling svcBreak on retail will only terminate the process which called this SVC.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== CreateCodeSet ===&lt;br /&gt;
(behavior unconfirmed)&lt;br /&gt;
&lt;br /&gt;
Allocates memory for a process according to the given CodeSetInfo contents and copies the segment data from the given memory locations to the allocated memory.&lt;br /&gt;
&lt;br /&gt;
=== CreateProcess ===&lt;br /&gt;
(behavior unconfirmed)&lt;br /&gt;
&lt;br /&gt;
Sets up a process using the segments managed by the given CodeSet handle.&lt;br /&gt;
&lt;br /&gt;
This system call furthermore processes the [[NCCH/Extended_Header#ARM11_Kernel_Capabilities|kernel capabilities]] from the [[NCCH/Extended_Header|ExHeader]], hence setting up virtual address mappings, CPU clock frequency/L2 cache configuration, and other things.&lt;br /&gt;
&lt;br /&gt;
=== Run ===&lt;br /&gt;
(behavior unconfirmed)&lt;br /&gt;
&lt;br /&gt;
Sets up the main process thread and appends it to the scheduler queue.&lt;br /&gt;
&lt;br /&gt;
The argc, argv, and envp fields from the given StartupInfo structure are ignored.&lt;br /&gt;
&lt;br /&gt;
== struct CodeSetInfo ==&lt;br /&gt;
All addresses are given virtual for the process to be created.&lt;br /&gt;
All sizes are given in 0x1000-pages.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u8[8]&lt;br /&gt;
| Codeset Name&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| Unknown, this is written to field 0x5A of KCodeSet&lt;br /&gt;
|-&lt;br /&gt;
| u16&lt;br /&gt;
| Unknown/padding&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown/padding&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| .text addr&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| .text size&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| .rodata start&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| .rodata size&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| RW addr (.data + .bss)&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| RW size (.data + .bss)&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Total .text pages&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Total .rodata pages&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Total RW pages (.data + .bss)&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown/padding&lt;br /&gt;
|-&lt;br /&gt;
| u8[8]&lt;br /&gt;
| Program ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Threads =&lt;br /&gt;
&lt;br /&gt;
For Kernel implementation details, see [[KThread]].&lt;br /&gt;
&lt;br /&gt;
Though it is possible to run multi-threaded programs, running those on different cores is not possible &amp;quot;as-is&amp;quot;. One core is always dedicated to the OS, hence you will never get 100% of both cores.&lt;br /&gt;
&lt;br /&gt;
Using CloseHandle() with a KThread handle will terminate the specified thread only if the reference count reaches 0.&lt;br /&gt;
&lt;br /&gt;
Lower priority values give the thread higher priority. For userland apps, priorities between 0x18 and 0x3F are allowed. The priority of the app&#039;s main thread seems to be 0x30.&lt;br /&gt;
&lt;br /&gt;
The thread scheduler is cooperative, therefore if a thread takes up all the CPU time (for example if it enters an endless loop), all the other threads that run on the same CPU core won&#039;t get a chance to run. The main way of yielding another thread is using an address arbiter.&lt;br /&gt;
&lt;br /&gt;
0xFFFF8000 is a handle alias for the currently active thread.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== CreateThread ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x08&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result CreateThread(Handle* thread, func entrypoint, u32 arg, u32 stacktop, s32 threadpriority, s32 processorid);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Configuration&#039;&#039;&#039;&lt;br /&gt;
 R0=s32 threadpriority&lt;br /&gt;
 R1=func entrypoint&lt;br /&gt;
 R2=u32 arg&lt;br /&gt;
 R3=u32 stacktop&lt;br /&gt;
 R4=s32 processorid&lt;br /&gt;
&lt;br /&gt;
 Result result=R0&lt;br /&gt;
 Handle* thread=R1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Details&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Creates a new thread in the current process which will begin execution at the given entrypoint. The SP CPU register will be initialized to stacktop, while r0 will be initialized to the given arg.&lt;br /&gt;
&lt;br /&gt;
The input address used for Entrypoint_Param and StackTop are normally the same, but they may be chosen arbitrarily. For the main thread (created in svcRun), the Entrypoint_Param is value 0.&lt;br /&gt;
&lt;br /&gt;
The stacktop must be aligned to 0x8-bytes, otherwise when not aligned to 0x8-bytes the ARM11 kernel clears the low 3-bits of the stacktop address.&lt;br /&gt;
&lt;br /&gt;
The processorid parameter specifies which processor the thread can run on. Non-negative values correspond to a specific CPU. (e.g. 0 for the Appcore and 1 for the Syscore on Old3DS) Special value -1 means all CPUs, and -2 means the default CPU for the process (Read from the [[NCCH/Extended Header|Exheader]], usually 0 for applications, 1 for system services). Games usually create threads using -2.&lt;br /&gt;
&lt;br /&gt;
The thread priority value must be in the range 0x0..0x3F. Otherwise, error 0xE0E01BFD is returned.&lt;br /&gt;
&lt;br /&gt;
With the Old3DS kernel, the s32 processorid must be &amp;lt;=2 (for the processorid validation check in the kernel). With the New3DS kernel, the processorid validation check requires processorid to be less than or equal to &amp;lt;total cores(MPCore &amp;quot;SCU Configuration Register&amp;quot; CPU number value + 1)&amp;gt;, and a number of additional constraints apply: When processorid==0x2 and the process is not a BASE mem-region process, exheader kernel-flags bitmask 0x2000 must be set (otherwise error 0xD9001BEA is returned). When processorid==0x3 and the process is not a BASE mem-region process, error 0xD9001BEA is returned. These are the only restriction checks done by the kernel for processorid.&lt;br /&gt;
&lt;br /&gt;
=== ExitThread  ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x09&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 void ExitThread(void);&lt;br /&gt;
&lt;br /&gt;
=== SleepThread  ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x0A&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 void SleepThread(s64 nanoseconds);&lt;br /&gt;
&lt;br /&gt;
=== GetThreadPriority ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x0B&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result GetThreadPriority(s32* priority, Handle thread);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;asm&#039;&#039;&#039;&lt;br /&gt;
 .global svcGetThreadPriority&lt;br /&gt;
 .type svcGetThreadPriority, %function&lt;br /&gt;
 svcGetThreadPriority:&lt;br /&gt;
 	str r0, [sp, #-0x4]!&lt;br /&gt;
 	svc 0x0B&lt;br /&gt;
 	ldr r3, [sp], #4&lt;br /&gt;
 	str r1, [r3]&lt;br /&gt;
 	bx  lr&lt;br /&gt;
&lt;br /&gt;
=== SetThreadPriority ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x0C&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result SetThreadPriority(Handle thread, s32 priority);&lt;br /&gt;
&lt;br /&gt;
=== OpenThread ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x34&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result OpenThread(Handle* thread, Handle process, u32 threadId);&lt;br /&gt;
&lt;br /&gt;
=== GetProcessIdOfThread ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x36&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result GetProcessIdOfThread(u32* processId, Handle thread);&lt;br /&gt;
&lt;br /&gt;
=== GetThreadId ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x37&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result GetThreadId(u32* threadId, Handle thread);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Details&#039;&#039;&#039;&lt;br /&gt;
It seems that only the thread itself or one of its parent can get the ID. Calling this on the handle of a sibling or parent seems to always yield the ID 0.&lt;br /&gt;
&lt;br /&gt;
=== GetThreadInfo ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x2C&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result GetThreadInfo(s64* out, Handle thread, ThreadInfoType type);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Details &#039;&#039;&#039;&lt;br /&gt;
This requests always return an error when called, it only checks if the handle is a thread or not. &lt;br /&gt;
Hence, it will return 0xD8E007ED (BAD_ENUM) if the Handle is a Thread Handle, 0xD8E007F7 (BAD_HANDLE) if it isn&#039;t.&lt;br /&gt;
&lt;br /&gt;
=== GetThreadContext ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x3B&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result GetThreadContext(ThreadContext* context, Handle thread);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Details&#039;&#039;&#039;&lt;br /&gt;
Stubbed?&lt;br /&gt;
&lt;br /&gt;
== Core affinity == &lt;br /&gt;
&lt;br /&gt;
The cores are numbered from 0 to 1 for Old 3DS and 0 to 3 for the new 3DS.&lt;br /&gt;
&lt;br /&gt;
=== GetThreadAffinityMask ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x0D&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result GetThreadAffinityMask(u8* affinitymask, Handle thread, s32 processorcount);&lt;br /&gt;
&lt;br /&gt;
=== SetThreadAffinityMask ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x0E&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result SetThreadAffinityMask(Handle thread, u8* affinitymask, s32 processorcount);&lt;br /&gt;
&lt;br /&gt;
=== GetThreadIdealProcessor ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x0F&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Signature&#039;&#039;&#039;&lt;br /&gt;
 Result GetThreadIdealProcessor(s32* processorid, Handle thread);&lt;br /&gt;
&lt;br /&gt;
=== SetThreadIdealProcessor ===&lt;br /&gt;
&#039;&#039;&#039;svc&#039;&#039;&#039; : 0x10&lt;br /&gt;
&lt;br /&gt;
=== APT:SetApplicationCpuTimeLimit ===&lt;br /&gt;
&lt;br /&gt;
See [[APT:SetApplicationCpuTimeLimit]].&lt;br /&gt;
&lt;br /&gt;
You are not able to use the system core (core1) by default. You have to first assign the amount of time dedicated to the system.&lt;br /&gt;
The value is in percent, the higher it is, the more the system will be available for your application. &lt;br /&gt;
&lt;br /&gt;
For example if you set this value to 25%, it means that your application will be able to use 25% of the system core at most, even if you never issue system calls.&lt;br /&gt;
&lt;br /&gt;
If you set the value to a non-zero value, you will not be able to set it back to 0%.&lt;br /&gt;
Keep in mind that if your application is heavily dependant on the system, setting a high value for your application might yield poorer performance than if you had set a low value.&lt;br /&gt;
&lt;br /&gt;
=== APT:GetApplicationCpuTimeLimit ===&lt;br /&gt;
&lt;br /&gt;
See [[APT:GetApplicationCpuTimeLimit]].&lt;br /&gt;
&lt;br /&gt;
== Debug == &lt;br /&gt;
&lt;br /&gt;
=== GetThreadList ===&lt;br /&gt;
&lt;br /&gt;
=== GetDebugThreadContext ===&lt;br /&gt;
&lt;br /&gt;
=== SetDebugThreadContext ===&lt;br /&gt;
&lt;br /&gt;
=== GetDebugThreadParam ===&lt;br /&gt;
&lt;br /&gt;
= Synchronization =&lt;br /&gt;
&lt;br /&gt;
Synchronization can be performed via WaitSynchronization on any handles deriving from [[KSynchronizationObject]]. The semantic meaning of the call depends on the particular object type referred to by the given handle:&lt;br /&gt;
&lt;br /&gt;
* KClientPort: Wakes if max sessions not reached (free session available)&lt;br /&gt;
* KClientSession: Always false?&lt;br /&gt;
* KDebug: ???&lt;br /&gt;
* KDmaObject: ???&lt;br /&gt;
* KEvent: Waits until the event is signaled&lt;br /&gt;
* KInterruptEvent: ???&lt;br /&gt;
* KMutex: Acquires a lock on the mutex (blocks until this succeeds)&lt;br /&gt;
* KProcess: Waits until the process exits&lt;br /&gt;
* KSemaphore: This consumes a value from the semaphore count, if possible, otherwise continues to wait&lt;br /&gt;
* KServerPort: Waits for a new client connection, upon which svcAcceptSession is ready to be called&lt;br /&gt;
* KServerSession: Waits for an IPC command to be submitted to the server process&lt;br /&gt;
* KThread: Waits until the thread terminates&lt;br /&gt;
* KTimer: Wakes when timer activates (this also clears the timer if it is oneshot)&lt;br /&gt;
&lt;br /&gt;
Most synchronization systems seem to have both a &amp;quot;normal&amp;quot; and &amp;quot;light-weight&amp;quot; version&lt;br /&gt;
&lt;br /&gt;
== Mutex ==&lt;br /&gt;
&lt;br /&gt;
For Kernel implementation details, see [[KMutex]]&lt;br /&gt;
&lt;br /&gt;
===  CreateMutex ===&lt;br /&gt;
&lt;br /&gt;
/!\ It seems that the mutex will not be available once the thread that created it is destroyed &lt;br /&gt;
&lt;br /&gt;
=== ReleaseMutex ===&lt;br /&gt;
&lt;br /&gt;
== Critical Section (light-weight mutex) ==&lt;br /&gt;
&lt;br /&gt;
Similar to a mutex, but faster and no priority inheritance. Therefore problems such as priority inversion may occur.&lt;br /&gt;
&lt;br /&gt;
=== CriticalSection::Initialize ===&lt;br /&gt;
&lt;br /&gt;
Creates an object&lt;br /&gt;
&lt;br /&gt;
=== CriticalSection::Enter ===&lt;br /&gt;
&lt;br /&gt;
Locks out threads from accessing a critical section.&lt;br /&gt;
&lt;br /&gt;
=== CriticalSection::Leave ===&lt;br /&gt;
&lt;br /&gt;
Unlocks and allows for access to a critical section.&lt;br /&gt;
&lt;br /&gt;
== Semaphore ==&lt;br /&gt;
&lt;br /&gt;
== Light Semaphore ==&lt;br /&gt;
&lt;br /&gt;
== Event ==&lt;br /&gt;
&lt;br /&gt;
== Light Event ==&lt;br /&gt;
&lt;br /&gt;
== Address Arbiters ==&lt;br /&gt;
&lt;br /&gt;
Address arbiters are a low-level primitive to implement synchronization based on a counter stored at some user-specified virtual memory address. Address arbiters are used to put the current thread to sleep until the counter is signaled. Both of these tasks are implemented in ArbitrateAddress.&lt;br /&gt;
&lt;br /&gt;
Address arbiters are implemented by [[KAddressArbiter]].&lt;br /&gt;
&lt;br /&gt;
===CreateAddressArbiter===&lt;br /&gt;
 Result CreateAddressArbiter(Handle* arbiter)&lt;br /&gt;
&lt;br /&gt;
Creates an address arbiter handle for use with ArbitrateAddress.&lt;br /&gt;
&lt;br /&gt;
=== ArbitrateAddress ===&lt;br /&gt;
 Result ArbitrateAddress(Handle arbiter, u32 addr, ArbitrationType type, s32 value, s64 nanoseconds)&lt;br /&gt;
&lt;br /&gt;
if &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; is SIGNAL, the ArbitrateAddress call will resume up to &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; of the threads waiting on &amp;lt;code&amp;gt;addr&amp;lt;/code&amp;gt; using an arbiter, starting with the highest-priority threads. If &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; is negative, all of these threads are released. &amp;lt;code&amp;gt;nanoseconds&amp;lt;/code&amp;gt; remains unused in this mode.&lt;br /&gt;
&lt;br /&gt;
The other modes are used to (conditionally) put the current thread to sleep based on the memory word at virtual address &amp;lt;code&amp;gt;addr&amp;lt;/code&amp;gt; until another thread signals that address using ArbitrateAddress with the &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; SIGNAL. WAIT_IF_LESS_THAN will put the current thread to sleep if that word is smaller than &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt;. DECREMENT_AND_WAIT_IF_LESS_THAN will furthermore decrement the memory value before the comparison. WAIT_IF_LESS_THAN_TIMEOUT and DECREMENT_AND_WAIT_IF_LESS_THAN_TIMEOUT will do the same as their counterparts, but will have thread execution resume if &amp;lt;code&amp;gt;nanoseconds&amp;lt;/code&amp;gt; nanoseconds pass without &amp;lt;code&amp;gt;addr&amp;lt;/code&amp;gt; being signaled.&lt;br /&gt;
&lt;br /&gt;
=== enum ArbitrationType ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Address arbitration type&lt;br /&gt;
!  Value&lt;br /&gt;
|-&lt;br /&gt;
| SIGNAL&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| WAIT_IF_LESS_THAN&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| DECREMENT_AND_WAIT_IF_LESS_THAN&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| WAIT_IF_LESS_THAN_TIMEOUT&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| DECREMENT_AND_WAIT_IF_LESS_THAN_TIMEOUT&lt;br /&gt;
| 4&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=18009</id>
		<title>KThreadContext</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=18009"/>
		<updated>2016-08-31T03:23:33Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
Size : 0x1000 bytes (1 page)&lt;br /&gt;
&lt;br /&gt;
Each [[KThread|thread]] is allocated a 0x1000-byte page in this region for the [[KThreadContext|thread context]].  Each thread has its context address stored as 2 members:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| u32*&lt;br /&gt;
| Ptr to svc mode register storage for KThread inside the thread context.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| u32*&lt;br /&gt;
| End-address of the page for this thread context allocated in the [[Memory_layout|0xFF4XX000]] region. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
KThread offset 0x88 points to offset 0xF50 in the thread context and 0x8C points to the end of the thread context page.  The kernel refers to the thread context page by subtracting from the end instead of adding from the beginning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xF38 (page_end - 0xC8)&lt;br /&gt;
| u32[4]&lt;br /&gt;
| SVC access control data copied from KThread&#039;s owner process&lt;br /&gt;
|-&lt;br /&gt;
| 0xF50 (page_end - 0xB0)&lt;br /&gt;
| u32[10]&lt;br /&gt;
| SVC mode registers, r4-r11, r13, r14&lt;br /&gt;
|-&lt;br /&gt;
| 0xF78 &lt;br /&gt;
| f64[16]&lt;br /&gt;
| VFP registers aliased as 16 double precision, 64-bit registers&lt;br /&gt;
|-&lt;br /&gt;
| 0xFF8&lt;br /&gt;
| u32&lt;br /&gt;
| FPEXC, floating point exception register for thread- stored and loaded on context switches&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFC&lt;br /&gt;
| u32&lt;br /&gt;
| FPSCR, floating point status and control register&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When switching thread contexts the kernel does, in order:&lt;br /&gt;
&lt;br /&gt;
* Load FPEXC&lt;br /&gt;
* Save the LR to r1- this LR is the return back to the main scheduling and context switching function&lt;br /&gt;
* Load r4-r11, SP, LR&lt;br /&gt;
* Branch back to r1, preserving the LR which was just reloaded, back to the main scheduling function, but in the context of the newly switched-to thread&lt;br /&gt;
* Disable Interrupts&lt;br /&gt;
* Check if that core&#039;s KScheduler object indicates that it needs switching again and exit if it does not&lt;br /&gt;
* Otherwise, run the thread scheduler again and repeat all the steps to switch contexts again&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=18007</id>
		<title>KThreadContext</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=18007"/>
		<updated>2016-08-30T01:22:59Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
Size : 0x1000 bytes (1 page)&lt;br /&gt;
&lt;br /&gt;
Each [[KThread|thread]] is allocated a 0x1000-byte page in this region for the [[KThreadContext|thread context]].  Each thread has its context address stored as 2 members:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| u32*&lt;br /&gt;
| Ptr to svc mode register storage for KThread inside the thread context.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| u32*&lt;br /&gt;
| End-address of the page for this thread context allocated in the [[Memory_layout|0xFF4XX000]] region. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
KThread offset 0x88 points to offset 0xF50 in the thread context and 0x8C points to the end of the thread context page.  The kernel refers to the thread context page by subtracting from the end instead of adding from the beginning.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xF38 (page_end - 0xC8)&lt;br /&gt;
| u32[4]&lt;br /&gt;
| SVC access control data copied from KThread&#039;s owner process&lt;br /&gt;
|-&lt;br /&gt;
| 0xF50 (page_end - 0xB0)&lt;br /&gt;
| u32[10]&lt;br /&gt;
| SVC mode registers, r4-r11, r13, r14&lt;br /&gt;
|-&lt;br /&gt;
| 0xFF8&lt;br /&gt;
| u32&lt;br /&gt;
| FPEXC, floating point exception register for thread- stored and loaded on context switches&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When switching thread contexts the kernel does, in order:&lt;br /&gt;
&lt;br /&gt;
* Load FPEXC&lt;br /&gt;
* Save the LR to r1- this LR is the return back to the main scheduling and context switching function&lt;br /&gt;
* Load r4-r11, SP, LR&lt;br /&gt;
* Branch back to r1, preserving the LR which was just reloaded, back to the main scheduling function, but in the context of the newly switched-to thread&lt;br /&gt;
* Disable Interrupts&lt;br /&gt;
* Check if that core&#039;s KScheduler object indicates that it needs switching again and exit if it does not&lt;br /&gt;
* Otherwise, run the thread scheduler again and repeat all the steps to switch contexts again&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=18006</id>
		<title>KThreadContext</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=18006"/>
		<updated>2016-08-29T14:24:42Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
Size : 0x1000 bytes (1 page)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xF38 (page_end - 0xC8)&lt;br /&gt;
| u32[4]&lt;br /&gt;
| SVC access control data copied from KThread&#039;s owner process&lt;br /&gt;
|-&lt;br /&gt;
| 0xF50 (page_end - 0xB0)&lt;br /&gt;
| u32[10]&lt;br /&gt;
| SVC mode registers, r4-r11, r13, r14&lt;br /&gt;
|-&lt;br /&gt;
| 0xFF8&lt;br /&gt;
| u32&lt;br /&gt;
| FPEXC, floating point exception register for thread- stored and loaded on context switches&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When switching thread contexts the kernel does, in order:&lt;br /&gt;
&lt;br /&gt;
* Load FPEXC&lt;br /&gt;
* Save the LR to r1- this LR is the return back to the main scheduling and context switching function&lt;br /&gt;
* Load r4-r11, SP, LR&lt;br /&gt;
* Branch back to r1, preserving the LR which was just reloaded, back to the main scheduling function, but in the context of the newly switched-to thread&lt;br /&gt;
* Disable Interrupts&lt;br /&gt;
* Check if that core&#039;s KScheduler object indicates that it needs switching again and exit if it does not&lt;br /&gt;
* Otherwise, run the thread scheduler again and repeat all the steps to switch contexts again&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=Memory_layout&amp;diff=18005</id>
		<title>Memory layout</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=Memory_layout&amp;diff=18005"/>
		<updated>2016-08-29T14:22:25Z</updated>

		<summary type="html">&lt;p&gt;Bond697: /* 0xFF4XX000 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Physical Memory =&lt;br /&gt;
&lt;br /&gt;
== ARM11 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Old 3DS&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x00000000&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Bootrom (super secret code/data @ 0x8000)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Bootrom mirror&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x10000000&lt;br /&gt;
|?&lt;br /&gt;
| [[IO]] memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x17E00000&lt;br /&gt;
| 0x00002000&lt;br /&gt;
| MPCore private memory region&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x17E10000&lt;br /&gt;
| 0x00001000&lt;br /&gt;
| L2C-310 Level 2 Cache Controller (2MB)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x18000000&lt;br /&gt;
| 0x00600000&lt;br /&gt;
| VRAM (divided in two banks, VRAM and VRAMB)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x1F000000&lt;br /&gt;
| 0x00400000&lt;br /&gt;
| [[New_3DS]] additional memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| DSP memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| AXI WRAM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| FCRAM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x28000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| [[New_3DS]] FCRAM extension&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Bootrom mirror&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===0x17E10000===&lt;br /&gt;
The 32-bit register at &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt; only has bit 0 set when, on New 3DS, [[PTMSYSM:ConfigureNew3DSCPU]] was used with bit 1 set for the input value (the L2 cache flag). All other bits in this register are normally all-zero. Therefore, bit 0 set = new cache hardware enabled, bit 0 clear = new cache hardware disabled. This bit is how the ARM11 kernel checks whether the additional cache hardware is enabled).&lt;br /&gt;
&lt;br /&gt;
To enable the additional cache hardware, the following is used by the ARM11 kernel:&lt;br /&gt;
* Sets bit 0 in 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
To disable the additional cache hardware, the following is used by the ARM11 kernel:&lt;br /&gt;
* Writes value &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt; to 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x77C&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Waits for bit 0 in 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x730&amp;lt;/code&amp;gt; to become clear.&lt;br /&gt;
* Writes value &amp;lt;code&amp;gt;0x0&amp;lt;code&amp;gt; to 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x0&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Clears bit 0 in 32-bit register &amp;lt;code&amp;gt;0x17E10000&amp;lt;/code&amp;gt;+&amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;0x1F000000&amp;lt;/code&amp;gt; ([[New 3DS]] only) ===&lt;br /&gt;
This area is used by [[QTM Services]],starting at offset &amp;lt;code&amp;gt;0x200000&amp;lt;/code&amp;gt;, size &amp;lt;code&amp;gt;0x180000&amp;lt;/code&amp;gt;. This area is not accessible to the GPU on the old 3DS. The old 3DS and New 3DS GSP module has &amp;lt;code&amp;gt;vaddr-&amp;amp;gt;physaddr&amp;lt;/code&amp;gt; conversion code for this entire region. On the New 3DS, only the first &amp;lt;code&amp;gt;0x200000&amp;lt;/code&amp;gt; bytes (half of this memory) are accessible to the GPU.&lt;br /&gt;
&lt;br /&gt;
== ARM9 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Old 3DS&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x00000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| Instruction TCM, repeating each 0x8000 bytes.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| 0x00008000&lt;br /&gt;
| Instruction TCM (Accessed by the kernel and process by this address)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x07FF8000&lt;br /&gt;
| 0x00008000&lt;br /&gt;
| Instruction TCM (Accessed by bootrom by this address)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| ARM9-only internal memory (ARM7&#039;s internal regions are mapped here as well)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x08100000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| [[New_3DS]] ARM9-only extension, only enabled when a certain [[CONFIG_Registers|CONFIG]] register is set.&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| [[IO]] memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x18000000&lt;br /&gt;
| 0x00600000&lt;br /&gt;
| VRAM (divided in two banks, VRAM and VRAMB) &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| DSP memory&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| AXI WRAM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| FCRAM&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| 0x28000000&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| [[New_3DS]] FCRAM extension&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0xFFF00000&lt;br /&gt;
| 0x00004000&lt;br /&gt;
| Data TCM (Mapped during bootrom)&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 0x00010000&lt;br /&gt;
| Bootrom, the main region is at +0x8000, which is disabled during system boot.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==ARM9 MPU Regions==&lt;br /&gt;
For the below instruction permissions: RO = memory is executable, while None = not-executable.&lt;br /&gt;
&lt;br /&gt;
===NATIVE_FIRM/SAFE_MODE_FIRM ARM9 kernel===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Region&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Privileged-mode data permissions&lt;br /&gt;
!  User-mode data permissions&lt;br /&gt;
!  Privileged-mode instruction permissions&lt;br /&gt;
!  User-mode instruction permissions&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 1MB/0x100000. &amp;gt;=[[8.0.0-18|8.0.0-X]]: 2MB/0x200000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x10100000&lt;br /&gt;
| 512KB/0x80000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 128MB/0x8000000. &amp;gt;=[[8.0.0-18|8.0.0-X]]: 256MB/0x10000000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x08020000&lt;br /&gt;
| &amp;lt;[[3.0.0-5]]: 64KB/0x10000. &amp;gt;=[[3.0.0-5]]: 32KB/0x8000.&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above is the MPU region settings setup by the ARM9-kernel in the crt0.&lt;br /&gt;
&lt;br /&gt;
The New3DS ARM9-kernel MPU region settings are the same as the Old3DS MPU region settings for &amp;gt;=[[8.0.0-18|8.0.0-X]].&lt;br /&gt;
&lt;br /&gt;
At the start of the Process9 function executed in kernel-mode via svc7b during firm-launching, it changes some MPU region settings. At the end of that function, before it uses the ARM9/ARM11 entrypoint fields, it disables MPU.&lt;br /&gt;
&lt;br /&gt;
===New3DS [[FIRM|ARM9-loader]]===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Region&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Privileged-mode data permissions&lt;br /&gt;
!  User-mode data permissions&lt;br /&gt;
!  Privileged-mode instruction permissions&lt;br /&gt;
!  User-mode instruction permissions&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 2MB/0x200000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
MPU regions 4-7 are disabled. Note that the entire ARM9-loader runs in SVC-mode.&lt;br /&gt;
&lt;br /&gt;
===TWL_FIRM/AGB_FIRM ARM9 kernel===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Region&lt;br /&gt;
!  Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Privileged-mode data permissions&lt;br /&gt;
!  User-mode data permissions&lt;br /&gt;
!  Privileged-mode instruction permissions&lt;br /&gt;
!  User-mode instruction permissions&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0xFFFF0000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| 32KB/0x8000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 1MB/0x100000. New3DS: 2MB/0x200000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| 2MB/0x200000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 512KB/0x80000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 128MB/0x8000000. New3DS: 256MB/0x10000000.&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| &amp;lt;[[3.0.0-5|3.0.0-X]]: 256KB/0x40000. &amp;gt;=[[3.0.0-5|3.0.0-X]]: 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| None&lt;br /&gt;
| RO&lt;br /&gt;
| None&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x08080000&lt;br /&gt;
| 128KB/0x20000&lt;br /&gt;
| RW&lt;br /&gt;
| RW&lt;br /&gt;
| RO&lt;br /&gt;
| RO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==ARM9 ITCM==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  ITCM mirror address&lt;br /&gt;
!  ITCM bootrom mirror address&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FF8000&lt;br /&gt;
| &lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x3700&lt;br /&gt;
| Uninitialized memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB700&lt;br /&gt;
| 0x07FFB700&lt;br /&gt;
| 0x3700&lt;br /&gt;
| 0x100&lt;br /&gt;
| The unprotected ARM9-bootrom code copies code from unprotected bootrom to 0x07FFB700(ITCM mirror) size 0x100, then calls the code at 0x07FFB700. The code located here is the code used for disabling access to the bootroms.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB800&lt;br /&gt;
| &lt;br /&gt;
| 0x3800&lt;br /&gt;
| 0x4&lt;br /&gt;
| This is always 0xDEADB00F.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB804&lt;br /&gt;
| &lt;br /&gt;
| 0x3804&lt;br /&gt;
| 0x4&lt;br /&gt;
| This is the u32 DeviceId.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB808&lt;br /&gt;
| &lt;br /&gt;
| 0x3808&lt;br /&gt;
| 0x10&lt;br /&gt;
| This is the fall-back keyY used for movable.sed keyY when movable.sed doesn&#039;t exist in NAND(the last two words here are used on retail for generating console-unique TWL keydata/etc). This is also used for &amp;quot;LocalFriendCodeSeed&amp;quot;, etc.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB818&lt;br /&gt;
| &lt;br /&gt;
| 0x3818&lt;br /&gt;
| 0x1&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB819&lt;br /&gt;
| &lt;br /&gt;
| 0x3819&lt;br /&gt;
| 0x1&lt;br /&gt;
| This is the [[CTCert]] issuer type: 0 = retail &amp;quot;Nintendo CA - G3_NintendoCTR2prod&amp;quot;, non-zero = dev &amp;quot;Nintendo CA - G3_NintendoCTR2dev&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB81A&lt;br /&gt;
| &lt;br /&gt;
| 0x381A&lt;br /&gt;
| 0x6&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB820&lt;br /&gt;
| &lt;br /&gt;
| 0x3820&lt;br /&gt;
| 0x4&lt;br /&gt;
| This is the CTCert ECDSA exponent, this is byte-swapped when *((u8*)(0x01FFB800+0x18)) is &amp;gt;=5.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB824&lt;br /&gt;
| &lt;br /&gt;
| 0x3824&lt;br /&gt;
| 0x2&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB826&lt;br /&gt;
| &lt;br /&gt;
| 0x3826&lt;br /&gt;
| 0x1E&lt;br /&gt;
| This is the CTCert ECDSA privk.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB844&lt;br /&gt;
| &lt;br /&gt;
| 0x3844&lt;br /&gt;
| 0x3C&lt;br /&gt;
| This is the CTCert ECDSA signature.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB880&lt;br /&gt;
| &lt;br /&gt;
| 0x3880&lt;br /&gt;
| 0x80&lt;br /&gt;
| This is all-zero.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFB900&lt;br /&gt;
| &lt;br /&gt;
| 0x3900&lt;br /&gt;
| 0x200&lt;br /&gt;
| This is the 0x200-bytes from NAND sector0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFBB00&lt;br /&gt;
| &lt;br /&gt;
| 0x3B00&lt;br /&gt;
| 0x200&lt;br /&gt;
| This is the 0x200-bytes from the plaintext NAND firm partition FIRM header, read by bootrom.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFBD00&lt;br /&gt;
| &lt;br /&gt;
| 0x3D00&lt;br /&gt;
| 0x100&lt;br /&gt;
| This is the RSA-2048 modulus for [[RSA_Registers|RSA]]-engine slot0 set by bootrom.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFBE00&lt;br /&gt;
| &lt;br /&gt;
| 0x3E00&lt;br /&gt;
| 0x100&lt;br /&gt;
| This is the RSA-2048 modulus for RSA-engine slot1 set by bootrom.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFBF00&lt;br /&gt;
| &lt;br /&gt;
| 0x3F00&lt;br /&gt;
| 0x100&lt;br /&gt;
| This is the RSA-2048 modulus for RSA-engine slot2.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFC000&lt;br /&gt;
| &lt;br /&gt;
| 0x4000&lt;br /&gt;
| 0x100&lt;br /&gt;
| This is the RSA-2048 modulus for RSA-engine slot3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFC100&lt;br /&gt;
| &lt;br /&gt;
| 0x4100&lt;br /&gt;
| 0x800&lt;br /&gt;
| These are RSA-2048 keys: 4 slots, each slot is 0x200-bytes. Slot+0 is the modulus, slot+0x100 is the private exponent. This can be confirmed by RSA-decrypting a message into a signature, then RSA-encrypting the signature back into a message, and comparing the original message with the output from the last operation.&lt;br /&gt;
&lt;br /&gt;
[[FIRM]] doesn&#039;t seem to ever use these. None of these are related to RSA-keyslot0 used for v6.0/v7.0 key generation. These moduli are separate from all other moduli used elsewhere.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFC900&lt;br /&gt;
| 0x07FFC900&lt;br /&gt;
| 0x4900&lt;br /&gt;
| 0x400&lt;br /&gt;
| The unprotected ARM9-bootrom copies data to 0x07FFC900(mirror of 0x01FFC900) size 0x400. This data is copied from AXI WRAM, initialized by ARM11-bootrom(the addr used for the src is determined by [[CONFIG_Registers|REG_UNITINFO]]). These are RSA moduli: retailsrcptr = 0x1FFFD000, devsrvptr = 0x1FFFD400.&lt;br /&gt;
* The first 0x100-bytes here is the RSA-2048 modulus for the CFA NCCH header, and for the gamecard NCSD header.&lt;br /&gt;
* 0x01FFCA00 is the RSA-2048 modulus for the CXI accessdesc signature, written to rsaengine keyslot1 by NATIVE_FIRM.&lt;br /&gt;
* 0x01FFCB00 size 0x200 is unknown, probably RSA related, these aren&#039;t used by [[FIRM]](these are not console-unique).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFCD00&lt;br /&gt;
| &lt;br /&gt;
| 0x4D00&lt;br /&gt;
| 0x80&lt;br /&gt;
| Unknown, not used by [[FIRM]]. This isn&#039;t console-unique.&lt;br /&gt;
The first 0x10-bytes are checked by the v6.0/v7.0 NATIVE_FIRM keyinit function, when non-zero it clears this block and continues to do the key generation. Otherwise when this block was already all-zero, it immediately returns. This memclear was probably an attempt at destroying the RSA slot0 modulus, that missed (exactly 0x1000-bytes away). Even though they &amp;quot;failed&amp;quot; here, one would still need to derive the private exponent, which would require obtaining a ciphertext and plaintext.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFCD80&lt;br /&gt;
| &lt;br /&gt;
| 0x4D80&lt;br /&gt;
| 0x64&lt;br /&gt;
| 0x01FFCD84 size 0x10-bytes is the NAND CID(the 0x64-byte region at 0x01FFCD80 is initialized by Process9 + ARM9-bootrom). The u32 at 0x01FFCDC4 is the total number of NAND sectors, read from a MMC command.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFCDE4&lt;br /&gt;
| &lt;br /&gt;
| 0x4DE4&lt;br /&gt;
| 0x21C&lt;br /&gt;
| Uninitialized memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFD000&lt;br /&gt;
| 0x07FFD000&lt;br /&gt;
| 0x5000&lt;br /&gt;
| 0x2470&lt;br /&gt;
| The unprotected ARM9-bootrom copies 0x1FFFA000(AXIWRAM mem initialized by ARM11-bootrom) size 0x2470 to 0x07FFD000(mirror of 0x01FFD000). This block contains DSi keys.&lt;br /&gt;
* 0x01FFD000 is the RSA-1024 modulus for the retail System Menu&lt;br /&gt;
* 0x01FFD080 is the RSA-1024 modulus for DSi Wifi firmware and DSi Sound&lt;br /&gt;
* 0x01FFD100 is the RSA-1024 modulus for base DSi apps (Settings, Shop, etc.)&lt;br /&gt;
* 0x01FFD180 is the RSA-1024 modulus for DSiWare and RSA-signed cartridge headers&lt;br /&gt;
* 0x01FFD210 is the keyY for per-console-encrypted ES blocks&lt;br /&gt;
* 0x01FFD220 is the keyY for fixed-keyX ES blocks&lt;br /&gt;
* 0x01FFD300 is the DSi common (normal)key&lt;br /&gt;
* 0x01FFD350 is a normalkey set on keyslot 0x02, and is likely only used during boot&lt;br /&gt;
* 0x01FFD380 is the keyslot 0x00 keyX and the first half of the retail keyX for modcrypt crypto &amp;quot;Nintendo&amp;quot;&lt;br /&gt;
* 0x01FFD398 is the keyX used for &#039;Tad&#039; crypto, usually in keyslot 0x02 &amp;quot;Nintendo DS&amp;quot;, ..&lt;br /&gt;
* 0x01FFD3A8 is set as the middle two words of keyslot 0x03&#039;s keyX, before being overwritten &amp;quot;NINTENDO&amp;quot;&lt;br /&gt;
* 0x01FFD3BC is the keyY for keyslot 0x01, see below&lt;br /&gt;
* 0x01FFD3C8 is the fixed keyY used for eMMC partition crypto on retail DSi, see below (keyslot 0x03)&lt;br /&gt;
* 0x01FFD3E0 is the 0x1048-byte Blowfish data for DSi cart crypto&lt;br /&gt;
* 0x01FFE428 is the 0x1048-byte Blowfish data for DS cart crypto&lt;br /&gt;
On the 3DS, keyslots 0x01 and 0x03 have the last word set as 0xE1A00005 instead of the next word in ITCM. This is consistent with retail DSis.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01FFF470&lt;br /&gt;
| &lt;br /&gt;
| 0x7470&lt;br /&gt;
| 0xB90&lt;br /&gt;
| Uninitialized memory.&lt;br /&gt;
0x01FFFC00 size 0x100-bytes starting with [[9.5.0-22|9.5.0-X]] is the FIRM header used during FIRM-launching.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Memory map by firmware=&lt;br /&gt;
* [[Virtual address mapping FW0B]]&lt;br /&gt;
* [[Virtual address mapping FW1F]]&lt;br /&gt;
* [[Virtual address mapping FW25]]&lt;br /&gt;
* [[Virtual address mapping FW2E]]&lt;br /&gt;
* [[Virtual address mapping FW37]]&lt;br /&gt;
* [[Virtual address mapping FW38‎]]&lt;br /&gt;
* [[Virtual address mapping FW3F]]&lt;br /&gt;
* FW49([[9.6.0-24|9.6.0-X]]) and [[10.0.0-27|10.0.0-X]] ARM11-kernel vmem mapping is identical to FW40([[9.5.0-22|9.5.0-X]]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Virtual address mapping TWLFIRM04]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Virtual address mapping New3DS v8.1]]&lt;br /&gt;
* [[Virtual address mapping New3DS v9.0]]&lt;br /&gt;
* [[Virtual address mapping New3DS v9.2]]&lt;br /&gt;
&lt;br /&gt;
=ARM11 Detailed physical memory map=&lt;br /&gt;
 18000000 - 18600000: VRAM&lt;br /&gt;
 &lt;br /&gt;
 1FF80000 - 1FFAB000: Kernel code&lt;br /&gt;
 1FFAB000 - 1FFF0000: SlabHeap [temporarily contains boot processes]&lt;br /&gt;
 1FFF0000 - 1FFF1000: ?&lt;br /&gt;
 1FFF1000 - 1FFF2000: ?&lt;br /&gt;
 1FFF2000 - 1FFF3000: ?&lt;br /&gt;
 1FFF3000 - 1FFF4000: ?&lt;br /&gt;
 1FFF4000 - 1FFF5000: Exception vectors&lt;br /&gt;
 1FFF5000 - 1FFF5800: Unused?&lt;br /&gt;
 1FFF5800 - 1FFF5C00: 256-entry L2 MMU table for VA FF4xx000&lt;br /&gt;
 1FFF5C00 - 1FFF6000: 256-entry L2 MMU table for VA FF5xx000&lt;br /&gt;
 1FFF6000 - 1FFF6400: 256-entry L2 MMU table for VA FF6xx000&lt;br /&gt;
 1FFF6400 - 1FFF6800: 256-entry L2 MMU table for VA FF7xx000&lt;br /&gt;
 1FFF6800 - 1FFF6C00: 256-entry L2 MMU table for VA FF8xx000&lt;br /&gt;
 1FFF6C00 - 1FFF7000: 256-entry L2 MMU table for VA FF9xx000&lt;br /&gt;
 1FFF7000 - 1FFF7400: 256-entry L2 MMU table for VA FFAxx000&lt;br /&gt;
 1FFF7400 - 1FFF7800: 256-entry L2 MMU table for VA FFBxx000&lt;br /&gt;
 1FFF7800 - 1FFF7C00: MMU table but unused?&lt;br /&gt;
 1FFF7C00 - 1FFF8000: 256-entry L2 MMU table for VA FFFxx000 &lt;br /&gt;
 1FFF8000 - 1FFFC000: 4096-entry L1 MMU table for VA xxx00000 (CPU 0)&lt;br /&gt;
 1FFFC000 - 20000000: 4096-entry L1 MMU table for VA xxx00000 (CPU 1)&lt;br /&gt;
 20000000 - 28000000: Main memory&lt;br /&gt;
&lt;br /&gt;
The entire FCRAM is cleared during NATIVE_FIRM boot. This is done by the ARM11 kernel in order by region as it initializes after loading [[FIRM]] launch parameters from FCRAM.&lt;br /&gt;
&lt;br /&gt;
== FCRAM memory-regions layout ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  [[Configuration_Memory#APPMEMTYPE|Configmem-APPMEMTYPE]] Value&lt;br /&gt;
!  Base address relative to FCRAM+0, for APPLICATION mem-region&lt;br /&gt;
!  Region size, for APPLICATION mem-region&lt;br /&gt;
!  Base address relative to FCRAM+0, for SYSTEM mem-region&lt;br /&gt;
!  Region size, for SYSTEM mem-region&lt;br /&gt;
!  Base address relative to FCRAM+0, for BASE mem-region&lt;br /&gt;
!  Region size, for BASE mem-region&lt;br /&gt;
|-&lt;br /&gt;
| 0 (default with regular 3DS kernel, used when the type is not 2-5)&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x04000000(64MB)&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| 0x02C00000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x06000000(96MB)&lt;br /&gt;
| 0x06000000&lt;br /&gt;
| 0x00C00000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x05000000(80MB)&lt;br /&gt;
| 0x05000000&lt;br /&gt;
| 0x01C00000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x04800000(72MB)&lt;br /&gt;
| 0x04800000&lt;br /&gt;
| 0x02400000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x02000000(32MB)&lt;br /&gt;
| 0x02000000&lt;br /&gt;
| 0x04C00000&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
|-&lt;br /&gt;
| 6 (This is the default on New3DS. With [[New_3DS]] kernel this is the type used when the value is not 7)&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x07C00000(124MB)&lt;br /&gt;
| 0x07C00000&lt;br /&gt;
| 0x06400000&lt;br /&gt;
| 0x0E000000&lt;br /&gt;
| 0x02000000&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x0B200000(178MB)&lt;br /&gt;
| 0x0B200000&lt;br /&gt;
| 0x02E00000&lt;br /&gt;
| 0x0E000000&lt;br /&gt;
| 0x02000000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The SYSTEM mem-region size is calculated with: size = FCRAMTOTALSIZE - (APPLICATION_MEMREGIONSIZE + BASE_MEMREGIONSIZE).&lt;br /&gt;
&lt;br /&gt;
Support for type6/7 was [[NCCH/Extended Header|implemented]] in [[NS]] with [[8.0.0-18]], these are only supported in the [[New_3DS]] ARM11-kernel not the regular 3DS kernel. These two types are the only ones supported by the New3DS kernel.&lt;br /&gt;
&lt;br /&gt;
All memory allocated by the kernel itself for kernel use is located under BASE. Most system-modules run under the BASE memregion too.&lt;br /&gt;
&lt;br /&gt;
Free/used memory on [[4.5.0-10]] with Home Menu / Internet Browser, with the default APPMEMTYPE on retail:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Region&lt;br /&gt;
!  Base address relative to FCRAM+0&lt;br /&gt;
!  Region size&lt;br /&gt;
!  Used memory once [[Home Menu]] finishes loading for system boot, on [[4.5.0-10]]&lt;br /&gt;
!  Used memory with [[Internet Browser]] running instead of [[Home Menu]], on [[4.5.0-10]]&lt;br /&gt;
!  Free memory once [[Home Menu]] finishes loading for system boot, on [[4.5.0-10]]&lt;br /&gt;
!  Free memory with [[Internet Browser]] running instead of [[Home Menu]], on [[4.5.0-10]]&lt;br /&gt;
|-&lt;br /&gt;
| APPLICATION&lt;br /&gt;
| 0x0&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| 0x0&lt;br /&gt;
| &lt;br /&gt;
| 0x04000000&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| SYSTEM&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| 0x02C00000&lt;br /&gt;
| 0x01488000&lt;br /&gt;
| 0x02A50000&lt;br /&gt;
| 0x01778000&lt;br /&gt;
| 0x001B0000&lt;br /&gt;
|-&lt;br /&gt;
| BASE&lt;br /&gt;
| 0x06C00000&lt;br /&gt;
| 0x01400000&lt;br /&gt;
| 0x01202000&lt;br /&gt;
| 0x01236000&lt;br /&gt;
| 0x001FE000&lt;br /&gt;
| 0x001CA000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=ARM11 Detailed virtual memory map=&lt;br /&gt;
(valid only for FW0B, see [[#Memory map by firmware|Memory map by firmware]] for subsequent versions)&lt;br /&gt;
&lt;br /&gt;
 E8000000 - E8600000: mapped VRAM (18000000 - 18600000)&lt;br /&gt;
 &lt;br /&gt;
 EFF00000 - F0000000: mapped Internal memory (1FF00000 - 20000000)&lt;br /&gt;
 F0000000 - F8000000: mapped Main memory&lt;br /&gt;
 &lt;br /&gt;
 FF401000 - FF402000: mapped ? (27FC7000 - 27FC8000)&lt;br /&gt;
 &lt;br /&gt;
 FF403000 - FF404000: mapped ? (27FC2000 - 27FC3000)&lt;br /&gt;
 &lt;br /&gt;
 FF405000 - FF406000: mapped ? (27FBB000 - 27FBC000)&lt;br /&gt;
 &lt;br /&gt;
 FF407000 - FF408000: mapped ? (27FB3000 - 27FB4000)&lt;br /&gt;
 &lt;br /&gt;
 FF409000 - FF40A000: mapped ? (27F8E000 - 27F8F000)&lt;br /&gt;
 &lt;br /&gt;
 FFF00000 - FFF45000: mapped SlabHeap &lt;br /&gt;
 &lt;br /&gt;
 FFF60000 - FFF8B000: mapped Kernel code&lt;br /&gt;
 &lt;br /&gt;
 FFFCC000 - FFFCD000: mapped IO [[I2C|I2C]] second bus (10144000 - 10145000)&lt;br /&gt;
 &lt;br /&gt;
 FFFCE000 - FFFCF000: mapped IO PDC([[LCD]]) (10400000 - 10401000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD0000 - FFFD1000: mapped IO PDN (10141000 - 10142000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD2000 - FFFD3000: mapped IO PXI (10163000 - 10164000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD4000 - FFFD5000: mapped IO PAD (10146000 - 10147000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD6000 - FFFD7000: mapped IO LCD (10202000 - 10203000)&lt;br /&gt;
 &lt;br /&gt;
 FFFD8000 - FFFD9000: mapped IO DSP (10140000 - 10141000)&lt;br /&gt;
 &lt;br /&gt;
 FFFDA000 - FFFDB000: mapped IO XDMA (10200000 - 10201000)&lt;br /&gt;
 &lt;br /&gt;
 FFFDC000 - FFFE0000: mapped ? (1FFF8000 - 1FFFC000)&lt;br /&gt;
 &lt;br /&gt;
 FFFE1000 - FFFE2000: mapped ? (1FFF0000 - 1FFF1000)&lt;br /&gt;
 &lt;br /&gt;
 FFFE3000 - FFFE4000: mapped ? (1FFF2000 - 1FFF3000)&lt;br /&gt;
 &lt;br /&gt;
 FFFE5000 - FFFE9000: mapped L1 MMU table for VA xxx00000&lt;br /&gt;
 &lt;br /&gt;
 FFFEA000 - FFFEB000: mapped ? (1FFF1000 - 1FFF2000)&lt;br /&gt;
 &lt;br /&gt;
 FFFEC000 - FFFED000: mapped ? (1FFF3000 - 1FFF4000)&lt;br /&gt;
 &lt;br /&gt;
 FFFEE000 - FFFF0000: mapped IO IRQ (17E00000 - 17E02000)&lt;br /&gt;
 &lt;br /&gt;
 FFFF0000 - FFFF1000: mapped Exception vectors&lt;br /&gt;
 &lt;br /&gt;
 FFFF2000 - FFFF6000: mapped L1 MMU table for VA xxx00000&lt;br /&gt;
 &lt;br /&gt;
 FFFF7000 - FFFF8000: mapped ? (1FFF1000 - 1FFF2000)&lt;br /&gt;
 &lt;br /&gt;
 FFFF9000 - FFFFA000: mapped ? (1FFF3000 - 1FFF4000)&lt;br /&gt;
 &lt;br /&gt;
 FFFFB000 - FFFFE000: mapped L2 MMU tables (1FFF5000 - 1FFF8000)&lt;br /&gt;
&lt;br /&gt;
==0xFF4XX000==&lt;br /&gt;
Each [[KThread|thread]] is allocated a 0x1000-byte page in this region for the [[KThreadContext|thread context]]: the first page at 0xFF401000 is for the first created thread, 0xFF403000 for the second thread. This region is used to store the SVC-mode stack for the thread, and thread context data used for context switching. When the IRQ handler, prefetch/data abort handlers, and undefined instruction handler are entered where the SPSR-mode=user, these handlers then store LR+SPSR for the current mode on the SVC-mode stack, then these handlers switch to SVC-mode.&lt;br /&gt;
&lt;br /&gt;
This page does not contain a dedicated block for storing R0-PC(etc). For user-mode, the user-mode regs are instead saved on the SVC-mode stack when IRQs such as timers for context switching are triggered.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For NATIVE_FIRM the memory pages for this region are located in FCRAM, however for TWL_FIRM these are located in AXI WRAM. For TWL_FIRM v6704 the first thread&#039;s page for this region is located at physical address 0x1FF93000, the next one at 0x1FF92000, etc.&lt;br /&gt;
&lt;br /&gt;
== IO Process virtual addressing equivalence ==&lt;br /&gt;
It seems an IO register&#039;s process virtual address can be calculated by adding 0xEB00000 to its physical address. However for kernel mappings there is no fixed address equivalence.&lt;br /&gt;
&lt;br /&gt;
=ARM11 User-land memory regions=&lt;br /&gt;
==NATIVE_FIRM/SAFE_MODE_FIRM Userland Memory==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Virtual Address Base&lt;br /&gt;
!  Physical Address Base&lt;br /&gt;
!  Region Max Size&lt;br /&gt;
!  Address-range available for svcMapMemoryBlock&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000 / 0x14000000&lt;br /&gt;
| &lt;br /&gt;
| 0x03F00000&lt;br /&gt;
| No&lt;br /&gt;
| The [[ExeFS]]:/.code is loaded here, executables must be loaded to the 0x00100000 region when the exheader &amp;quot;special memory&amp;quot; flag is clear. The 0x03F00000-byte size restriction only applies when this flag is clear. Executables are usually loaded to 0x14000000 when the exheader &amp;quot;special memory&amp;quot; flag is set, however this address can be arbitrary.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
| No&lt;br /&gt;
| Used for mapping buffers during IPC, see [[IPC Command Structure]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| Main stack physaddr - &amp;lt;heap size for the allocated vaddr 0x08000000 memory&amp;gt;&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| Yes&lt;br /&gt;
| Heap mapped by [[SVC|ControlMemory]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10000000-StackSize&lt;br /&gt;
| .bss physical address - total stack pages&lt;br /&gt;
| StackSize from process exheader&lt;br /&gt;
| &lt;br /&gt;
| Stack for the main-thread, initialized by the ARM11 kernel. The StackSize from the exheader is usually 0x4000, therefore the stack-bottom is usually 0x0FFFC000. The stack for the other threads is normally located in the process .data section however this can be arbitrary.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10000000&lt;br /&gt;
| &lt;br /&gt;
| 0x04000000&lt;br /&gt;
| Yes&lt;br /&gt;
| [[SVC|Shared]] memory&lt;br /&gt;
|-&lt;br /&gt;
| 0x14000000&lt;br /&gt;
| FCRAM+0&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| No&lt;br /&gt;
| Can be mapped by [[SVC|ControlMemory]], this is used for processes&#039; [[SVC|LINEAR]]/GSP heap.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E800000&lt;br /&gt;
| 0x1F000000&lt;br /&gt;
| 0x00400000&lt;br /&gt;
| No&lt;br /&gt;
| [[New_3DS]] additional memory, access to this is specified by the exheader. Added with [[8.0.0-18]], see above section regarding this memory.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1EC00000&lt;br /&gt;
| 0x10100000&lt;br /&gt;
| 0x00400000&lt;br /&gt;
| No&lt;br /&gt;
| [[IO]] registers, the mapped IO pages which each process can access is specified in the [[NCCH/Extended_Header|exheader]]. (Applications normally don&#039;t have access to registers in this range)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000000&lt;br /&gt;
| 0x18000000&lt;br /&gt;
| 0x00600000&lt;br /&gt;
| No&lt;br /&gt;
| VRAM, access to this is specified by the exheader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| No&lt;br /&gt;
| DSP memory, access to this is specified by the exheader.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF80000&lt;br /&gt;
| FCRAM memory page allocated by the ARM11 kernel.&lt;br /&gt;
| 0x1000&lt;br /&gt;
| No&lt;br /&gt;
| [[Configuration Memory]], all processes have read-only access to this.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF81000&lt;br /&gt;
| FCRAM memory page allocated by the ARM11 kernel.&lt;br /&gt;
| 0x1000&lt;br /&gt;
| No&lt;br /&gt;
| [[Configuration Memory|Shared]] page, all processes have read-access to this. Write access to this is specified by the exheader &amp;quot;Shared page writing&amp;quot; kernel flag.&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF82000&lt;br /&gt;
| Dynamically taken from the BASE region of FCRAM&lt;br /&gt;
| Number of threads * 0x1000 / 8&lt;br /&gt;
| No&lt;br /&gt;
| [[Thread Local Storage]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x30000000&lt;br /&gt;
| FCRAM+0&lt;br /&gt;
| 0x08000000(Old3DS) / 0x10000000([[New_3DS]])&lt;br /&gt;
| No&lt;br /&gt;
| This LINEAR memory mapping was added with [[8.0.0-18]], see [[SVC#enum_MemoryOperation|here]]. This replaces the original 0x14000000 mapping, for system(memory-region=BASE)/newer titles. The Old3DS kernel uses size 0x08000000 for LINEAR-memory address range checks, while the New3DS kernel uses size 0x10000000 for those range checks. Old3DS/New3DS system-module code doing vaddr-&amp;gt;phys-addr conversion uses size 0x10000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20000000 / 0x40000000&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| This is the end-address of userland memory, memory under this address is process-unique. Memory starting at this address is only accessible in privileged-mode. This address was changed from 0x20000000 to 0x40000000 with [[8.0.0-18]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
All executable pages are read-only, and data pages have the execute-never permission set. Normally .text from the loaded ExeFS:/.code is the only mapped executable memory. Executable [[RO Services|CROs]] can be loaded into memory, once loaded the CRO .text section memory page permissions are changed via [[SVC|ControlProcessMemory]] from RW- to R-X. The address and size of each ExeFS:/.code section is stored in the exheader, the permissions for each section is: .text R-X, .rodata R--, .data RW-, and .bss RW-. The loaded .code is mapped to the addresses specified in the exheader by the ARM11 kernel. The stack permissions is initialized by the ARM11 kernel: RW-. The heap permissions is normally RW-.&lt;br /&gt;
&lt;br /&gt;
All userland memory is mapped with RW permissions for privileged-mode. However, normally the ARM11 kernel only uses userland read/write instructions(or checks that the memory can be written from userland first) for accessing memory specified by [[SVC|SVCs]].&lt;br /&gt;
&lt;br /&gt;
Processes can&#039;t directly access memory for other processes. When service [[Services API|commands]] are used, the kernel maps memory in the destination process for input/output buffers, where the addresses in the command received by the process is replaced by this mapped memory. When this is an input buffer, the buffer data is copied to the mapped memory. When this is an output buffer, the data stored in the mapped memory is copied to the destination buffer specified in the command.&lt;br /&gt;
&lt;br /&gt;
The physical address which memory for the application memory-type is mapped to begins at FCRAM+0, the total memory allocated for this memory-type is stored in [[Configuration_Memory]]. Applications&#039; .text + .rodata + .data under the application memory-type is mapped at FCRAM + APPMEMALLOC - (aligned page-size for .text + .rodata + .data). The application .bss is mapped at CODEADDR - .bss size aligned down to the page size.&lt;br /&gt;
&lt;br /&gt;
==TWL_FIRM Userland Memory==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Virtual Address Base&lt;br /&gt;
!  Physical Address Base&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| 0x1FFAB000 (with newer TWL_FIRM such as v6704 this is located at 0x1FFAC000)&lt;br /&gt;
| 0x00055000&lt;br /&gt;
| Code + .(ro)data copied from the process 0x00300000 region is located here(.bss is located here as well).&lt;br /&gt;
|-&lt;br /&gt;
| 0x00155000&lt;br /&gt;
| 0x18555000&lt;br /&gt;
| 0x000AB000&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x00200000&lt;br /&gt;
| 0x18500000&lt;br /&gt;
| 0x00100000&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x00300000&lt;br /&gt;
| 0x24000000&lt;br /&gt;
| 0x04000000&lt;br /&gt;
| The beginning of the ARM11 process .text is located here.&lt;br /&gt;
|-&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 0x07E00000&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x1EC00000&lt;br /&gt;
| 0x10100000&lt;br /&gt;
| 0x00400000&lt;br /&gt;
| [[IO]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F000000&lt;br /&gt;
| 0x18000000&lt;br /&gt;
| 0x00600000&lt;br /&gt;
| VRAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x1FF00000&lt;br /&gt;
| 0x00080000&lt;br /&gt;
| This is mapped to the DSP memory.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above regions are mapped by the ARM11 kernel. Later when the ARM11 process uses [[SVC|svcKernelSetState]] with type4, the kernel unmaps(?) the following regions: 0x00300000..0x04300000, 0x08000000..0x0FE00000, and 0x10000000..0xF8000000.&lt;br /&gt;
&lt;br /&gt;
=== Detailed TWL_FIRM ARM11 Memory ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Process Virtual Address&lt;br /&gt;
!  Physical Address&lt;br /&gt;
!  Size&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x08000000&lt;br /&gt;
| 0x20000000&lt;br /&gt;
| 0x01000000*4&lt;br /&gt;
| DS(i) 0x02000000 RAM. Vaddr = (DSRAMOffset*4) + 0x08000000, where DSRAMOffset is DSRAMAddr-0x02000000.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0FC00000&lt;br /&gt;
| 0x27C00000&lt;br /&gt;
| &lt;br /&gt;
| Loaded SRL binary, initially the dev DSi launcher SRL is located here(copied here by the ARM11 process).&lt;br /&gt;
|-&lt;br /&gt;
| 0x0FD00000&lt;br /&gt;
| 0x27D00000&lt;br /&gt;
| &lt;br /&gt;
| The data located here is copied to here by the ARM11 process. The data located here is a TWL NAND [http://dsibrew.org/wiki/Bootloader bootloader] image, using the same format+encryption/verification methods as the DSi NAND bootloader(stage2). The keyX for this bootloader keyslot is initially set to the retail DSi key-data, however when TWL_FIRM is launched this keyX key-data is replaced with a separate keyX. TWL_FIRM can use either the retail DSi bootloader RSA-1024 modulus, or a seperate modulus: normally only the latter is used(the former is only used when loading the image from FS instead of FCRAM). When using the image from FCRAM(default code-path), TWL_FIRM will not calculate+check the hashes for the bootloader code binaries(this is done when loading from FS however).&lt;br /&gt;
|-&lt;br /&gt;
| 0x0FDF7000&lt;br /&gt;
| 0x27DF7000&lt;br /&gt;
| 0x1000&lt;br /&gt;
| SRL header&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= System memory details  =&lt;br /&gt;
 0xFFFF9000 Pointer to the current KThread instance&lt;br /&gt;
 0xFFFF9004 Pointer to the current KProcess instance&lt;br /&gt;
 0xFFFF9008 Pointer to the current KScheduler instance&lt;br /&gt;
 0xFFFF9010 Pointer to the last KThread to encounter an exception&lt;br /&gt;
&lt;br /&gt;
 0x8000040 Pointer to the current KThread instance on the ARM9&lt;br /&gt;
 0x8000044 Pointer to the current KProcess instance on the ARM9&lt;br /&gt;
 0x8000048 Pointer to the current KScheduler instance on the ARM9&lt;br /&gt;
&lt;br /&gt;
= VRAM Map While Running System Applets =&lt;br /&gt;
*0x1E6000-0x22C500 -- top screen 3D left framebuffer 0(240x400x3) (The &amp;quot;3D right first-framebuf&amp;quot; addr stored in the LCD register is set to this, when the 3D is set to &amp;quot;off&amp;quot;)&lt;br /&gt;
*0x22C800-0x272D00 -- top screen 3D right framebuffer 0(240x400x3)&lt;br /&gt;
*0x273000-0x2B9500 -- top screen 3D left framebuffer 1(240x400x3)&lt;br /&gt;
*0x2B9800-0x2FFD00 -- top screen 3D right framebuffer 1(240x400x3)&lt;br /&gt;
*0x48F000-0x4C7400 -- bottom screen framebuffer 0(240x320x3)&lt;br /&gt;
*0x4C7800-0x4FF800 -- bottom screen framebuffer 1(240x320x3)&lt;br /&gt;
&lt;br /&gt;
These LCD framebuffer addresses are not changed by the system when launching regular applications, the application itself handles that if needed. These VRAM framebuffers are cleared when launching regular applications.&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=18003</id>
		<title>KThreadContext</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=18003"/>
		<updated>2016-08-29T12:45:21Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Undo revision 18002 by Neobrain (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
Size : 0x1000 bytes (1 page)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xF38&lt;br /&gt;
| u32[4]&lt;br /&gt;
| SVC access control data copied from KThread&#039;s owner process&lt;br /&gt;
|-&lt;br /&gt;
| 0xF50&lt;br /&gt;
| u32[10]&lt;br /&gt;
| SVC mode registers, r4-r11, r13, r14&lt;br /&gt;
|-&lt;br /&gt;
| 0xFF8&lt;br /&gt;
| u32&lt;br /&gt;
| FPEXC, floating point exception register for thread- stored and loaded on context switches&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When switching thread contexts the kernel does, in order:&lt;br /&gt;
&lt;br /&gt;
* Load FPEXC&lt;br /&gt;
* Save the LR to r1- this LR is the return back to the main scheduling and context switching function&lt;br /&gt;
* Load r4-r11, SP, LR&lt;br /&gt;
* Branch back to r1, preserving the LR which was just reloaded, back to the main scheduling function, but in the context of the newly switched-to thread&lt;br /&gt;
* Disable Interrupts&lt;br /&gt;
* Check if that core&#039;s KScheduler object indicates that it needs switching again and exit if it does not&lt;br /&gt;
* Otherwise, run the thread scheduler again and repeat all the steps to switch contexts again&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=17993</id>
		<title>KThreadContext</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=17993"/>
		<updated>2016-08-28T21:11:09Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
Size : 0x1000 bytes (1 page)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xF38&lt;br /&gt;
| u32[4]&lt;br /&gt;
| SVC access control data copied from KThread&#039;s owner process&lt;br /&gt;
|-&lt;br /&gt;
| 0xF50&lt;br /&gt;
| u32[10]&lt;br /&gt;
| SVC mode registers, r4-r11, r13, r14&lt;br /&gt;
|-&lt;br /&gt;
| 0xFF8&lt;br /&gt;
| u32&lt;br /&gt;
| FPEXC, floating point exception register for thread- stored and loaded on context switches&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When switching thread contexts the kernel does, in order:&lt;br /&gt;
&lt;br /&gt;
* Load FPEXC&lt;br /&gt;
* Save the LR to r1- this LR is the return back to the main scheduling and context switching function&lt;br /&gt;
* Load r4-r11, SP, LR&lt;br /&gt;
* Branch back to r1, preserving the LR which was just reloaded, back to the main scheduling function, but in the context of the newly switched-to thread&lt;br /&gt;
* Disable Interrupts&lt;br /&gt;
* Check if that core&#039;s KScheduler object indicates that it needs switching again and exit if it does not&lt;br /&gt;
* Otherwise, run the thread scheduler again and repeat all the steps to switch contexts again&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=17992</id>
		<title>KThreadContext</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KThreadContext&amp;diff=17992"/>
		<updated>2016-08-28T17:46:22Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
Size : 0x1000 bytes (1 page)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xF50&lt;br /&gt;
| u32[10]&lt;br /&gt;
| SVC mode registers, r4-r11, r13, r14&lt;br /&gt;
|-&lt;br /&gt;
| 0xFF8&lt;br /&gt;
| u32&lt;br /&gt;
| FPEXC, floating point exception register for thread- stored and loaded on context switches&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
When switching thread contexts the kernel does, in order:&lt;br /&gt;
&lt;br /&gt;
* Load FPEXC&lt;br /&gt;
* Save the LR to r1- this LR is the return back to the main scheduling and context switching function&lt;br /&gt;
* Load r4-r11, SP, LR&lt;br /&gt;
* Branch back to r1, preserving the LR which was just reloaded, back to the main scheduling function, but in the context of the newly switched-to thread&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KAddressArbiter&amp;diff=17979</id>
		<title>KAddressArbiter</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KAddressArbiter&amp;diff=17979"/>
		<updated>2016-08-23T11:41:08Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KAddressArbiter]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x14 bytes &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Last&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| First&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| [[KProcess]]*&lt;br /&gt;
| Process&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KSynchronizationObject&amp;diff=17977</id>
		<title>KSynchronizationObject</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KSynchronizationObject&amp;diff=17977"/>
		<updated>2016-08-22T21:53:02Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KSynchronizationObject]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x14 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KThreads that sync with this object - number of nodes in the linked list below&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KSharedMemory&amp;diff=17976</id>
		<title>KSharedMemory</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KSharedMemory&amp;diff=17976"/>
		<updated>2016-08-22T21:43:13Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KSharedMemory]] extends [[KAutoObject]] and [[KLinkedList]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x28 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for [[KBlockInfo]] objects&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of [[KBlockInfo]] objects associated with this KSharedMemory object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of [[KBlockInfo]] objects associated with this KSharedMemory object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KProcess]]*&lt;br /&gt;
| Owner&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| u32&lt;br /&gt;
| Owner permissions&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| u32&lt;br /&gt;
| Other processes&#039; permissions for this block&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| u8&lt;br /&gt;
| Set after KBlockInfo is generated for the KSharedMemory&lt;br /&gt;
|-&lt;br /&gt;
| 0x21&lt;br /&gt;
| s8&lt;br /&gt;
| Set after all KBlockInfo is generated &lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| u8&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| u32&lt;br /&gt;
| Address&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=17975</id>
		<title>KSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=17975"/>
		<updated>2016-08-22T21:39:41Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KSession]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| X ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Y ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Z ?&lt;br /&gt;
|}&lt;br /&gt;
It seems X=Y=Z. X, Y and Z can be NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Structure for [[7.0.0-13]] NATIVE_FIRM upward:&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]* &lt;br /&gt;
| Last stolen KThread during sync request- current thread when KServerSession code is running during svc - noted in KThread+0xA8 as well&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| First stolen KThread during sync request&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| KThread that originated the session&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32 &lt;br /&gt;
| KLinkedListNode count for object&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32 &lt;br /&gt;
| Session status&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| KClientPort* &lt;br /&gt;
| Pointer to associated client port inside parent KPort&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=17974</id>
		<title>KSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KSession&amp;diff=17974"/>
		<updated>2016-08-22T21:38:46Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KSession]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| X ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Y ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Z ?&lt;br /&gt;
|}&lt;br /&gt;
It seems X=Y=Z. X, Y and Z can be NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Structure for [[7.0.0-13]] NATIVE_FIRM upward:&lt;br /&gt;
&lt;br /&gt;
Size : 0x4C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| [[KSession]]* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]* &lt;br /&gt;
| Last stolen KThread during sync request- current thread when KServerSession code is running during svc - noted in KThread+0xA8 as well&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| First stolen KThread during sync request&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| KThread that originated the session&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32 &lt;br /&gt;
| KLinkedListNode count for object&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32 &lt;br /&gt;
| Session status&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| KClientPort* &lt;br /&gt;
| Pointer to associated client port inside parent KPort&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KServerSession&amp;diff=17973</id>
		<title>KServerSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KServerSession&amp;diff=17973"/>
		<updated>2016-08-22T21:24:39Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KServerSession]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x24 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KSession]]* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KThread]]* &lt;br /&gt;
| Last stolen KThread during sync request- current thread when KServerSession code is running during svc - noted in KThread+0xA8 as well&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| First stolen KThread during sync request&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| KThread that originated the session&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KServerPort&amp;diff=17972</id>
		<title>KServerPort</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KServerPort&amp;diff=17972"/>
		<updated>2016-08-22T21:23:05Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KServerPort]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x24 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KPort]]* &lt;br /&gt;
| Pointer to parent KPort&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KProcess&amp;diff=17971</id>
		<title>KProcess</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KProcess&amp;diff=17971"/>
		<updated>2016-08-22T21:19:30Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KProcess]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x260 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KThreads that sync with this object - number of nodes in the linked list below&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| 0 or pointer to the thread the currently does something with the process object.&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| s16&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KMemoryBlocks used by the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KMemoryBlocks used by the process &lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| u32&lt;br /&gt;
| Translation table base&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u8&lt;br /&gt;
| Context ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| u32&lt;br /&gt;
| Size of the MMU table &lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| u32&lt;br /&gt;
| Virtual address of the MMU table for this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| u32&lt;br /&gt;
| Total size of all thread context pages (0xFF4xxxxx) owned by threads that belong to this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| u32&lt;br /&gt;
| Number of [[KThreadLocalPage|KThreadLocalPages]] used by this KProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of KThreadLocalPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of KThreadLocalPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| s32&lt;br /&gt;
| Ideal processor&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to resource limits for process. &lt;br /&gt;
|-&lt;br /&gt;
| 0x79&lt;br /&gt;
| u8&lt;br /&gt;
| Proc affinity mask&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| u32&lt;br /&gt;
| Number of threads which belong to this process.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| 0x10-bytes&lt;br /&gt;
| SVC access control mask from the exheader kernel descriptors. This is copied to the [[Memory_layout#0xFF4XX000|0xFF4XX000]] area when creating threads, which is the actual data the SVC-handler checks for SVC-access-control.&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0x10-bytes&lt;br /&gt;
| Interrupt flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| u32&lt;br /&gt;
| Kernel flags from the exheader kernel descriptors.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| u16&lt;br /&gt;
| Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA6&lt;br /&gt;
| u16&lt;br /&gt;
| Kernel release version field, from the exheader kernel descriptors.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KCodeSet]] instance&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| u32&lt;br /&gt;
| Process id, this always begins at 0x0 for the first process.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0&lt;br /&gt;
| u32&lt;br /&gt;
| Kernel flags from the exheader kernel descriptors. &lt;br /&gt;
|-&lt;br /&gt;
| 0xB8&lt;br /&gt;
| [[KThread]]*&lt;br /&gt;
| Pointer to the process&#039;s main (?) thread.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC&lt;br /&gt;
| KProcessHandleTable &lt;br /&gt;
| Process handle table. until 0x1C4 or longer&lt;br /&gt;
|-&lt;br /&gt;
| 0x224&lt;br /&gt;
| u32&lt;br /&gt;
| ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Structure starting with [[8.0.0-18]] NATIVE_FIRM:&lt;br /&gt;
&lt;br /&gt;
Size : 0x268 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KThreads that sync with this object - number of nodes in the linked list below&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KThread*&lt;br /&gt;
| Thread currently running kernel code to act on this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| s16&lt;br /&gt;
| This is used to record errors that occur when the thread above is set as the thread running code for the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| u16&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| u8&lt;br /&gt;
| TLB entries for process need invalidating on core0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| u8&lt;br /&gt;
| TLB entries for process need invalidating on core1&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KMemoryBlocks owned by the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KMemoryBlocks used by the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KMemoryBlocks used by the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| u32&lt;br /&gt;
| Translation table base&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u8&lt;br /&gt;
| Context ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x46&lt;br /&gt;
| bool&lt;br /&gt;
| Process is the currently loaded game/app&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| u32&lt;br /&gt;
| End of userland virtual memory for the process &lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| u32*&lt;br /&gt;
| [[Memory_layout|LINEAR]] memory virtual address(userland) base for this process.&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| u32&lt;br /&gt;
| Size of the MMU table&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| u32&lt;br /&gt;
| Virtual address of the MMU table for this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| u32&lt;br /&gt;
| Total size of all thread context pages (0xFF4xxxxx) owned by threads that belong to this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| u32&lt;br /&gt;
| Number of [[KThreadLocalPage|KThreadLocalPages]] used by this KProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of KThreadLocalPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of KThreadLocalPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| s32&lt;br /&gt;
| Ideal processor for this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| KDebug*&lt;br /&gt;
| KDebug object created from svc 60 to debug the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| KResourceLimit*&lt;br /&gt;
| Pointer to resource limits for process.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| u8&lt;br /&gt;
| Normally 1 to indicate process is open/available.  Set to 2 to indicate process is exiting/closing and 3 to indicate exited/closed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81&lt;br /&gt;
| u8&lt;br /&gt;
| Process affinity mask&lt;br /&gt;
|-&lt;br /&gt;
| 0x82&lt;br /&gt;
| u16&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| s16&lt;br /&gt;
| Number of threads which belong to this process.&lt;br /&gt;
|-&lt;br /&gt;
| 0x86&lt;br /&gt;
| s16&lt;br /&gt;
| Max number of threads which can belong to this process.&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| 0x10-bytes&lt;br /&gt;
| SVC access control mask from the exheader kernel descriptors. This is copied to the [[Memory_layout#0xFF4XX000|0xFF4XX000]] area when creating threads, which is the actual data the SVC-handler checks for SVC-access-control.&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| u32[4]&lt;br /&gt;
| Interrupt available flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words&lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| u32&lt;br /&gt;
| Kernel flags from the exheader kernel descriptors.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| u16&lt;br /&gt;
| Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM.&lt;br /&gt;
|-&lt;br /&gt;
| 0xAE&lt;br /&gt;
| u16&lt;br /&gt;
| Kernel release version field, from the exheader kernel descriptors.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KCodeSet]] instance&lt;br /&gt;
|-&lt;br /&gt;
| 0xB4&lt;br /&gt;
| u32&lt;br /&gt;
| Process id, this always begins at 0x0 for the first process.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB8&lt;br /&gt;
| s64&lt;br /&gt;
| Process creation time as tick count&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0&lt;br /&gt;
| KThread*&lt;br /&gt;
| Pointer to the process&#039;s main thread.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4&lt;br /&gt;
| u32[4]&lt;br /&gt;
| Interrupt enabled flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words&lt;br /&gt;
|-&lt;br /&gt;
| 0xD4&lt;br /&gt;
| KProcessHandleTable&lt;br /&gt;
| This is the data for tracking and using all of the KProcess&#039;s handles.&lt;br /&gt;
|-&lt;br /&gt;
| 0xEC&lt;br /&gt;
| HandleDescriptor[0x28]&lt;br /&gt;
| These internal HandleDescriptor entries are only used if the exheader&#039;s handle table size is 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x22C&lt;br /&gt;
| u32&lt;br /&gt;
| Unused (From here up, everything is set to 0 on creation, has 0 written to it again during process creation, and is never used again.) &lt;br /&gt;
|-&lt;br /&gt;
| 0x230&lt;br /&gt;
| u64&lt;br /&gt;
| Unused &lt;br /&gt;
|-&lt;br /&gt;
| 0x238&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x240&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x248&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x250&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x258&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x260&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Structure starting with [[8.1.0-0 New3DS]] NATIVE_FIRM:&lt;br /&gt;
&lt;br /&gt;
Size : 0x270 bytes (0x4D8 bytes on ARM9)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KThreads that sync with this object - number of nodes in the linked list below&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in node list of KThreads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KThread*&lt;br /&gt;
| Thread currently running code to act on this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| s16&lt;br /&gt;
| This is used to record errors that occur when the thread above is set as the thread running code for the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x22&lt;br /&gt;
| u16&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| u8&lt;br /&gt;
| TLB entries for process need invalidating on core0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| u8&lt;br /&gt;
| TLB entries for process need invalidating on core1&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u8&lt;br /&gt;
| TLB entries for process need invalidating on core2&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u8&lt;br /&gt;
| TLB entries for process need invalidating on core3&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32&lt;br /&gt;
| Count of KMemoryBlocks owned by the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KMemoryBlocks used by the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KMemoryBlocks used by the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| u32&lt;br /&gt;
| Translation table base&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| u8&lt;br /&gt;
| Context ID&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D&lt;br /&gt;
| u8&lt;br /&gt;
| Something to do with memory allocation&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E&lt;br /&gt;
| bool&lt;br /&gt;
| Process is the currently loaded game/app&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x54&lt;br /&gt;
| u32&lt;br /&gt;
| End of userland virtual memory for the process &lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| u32*&lt;br /&gt;
| [[Memory_layout|LINEAR]] memory virtual address(userland) base for this process.&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x60&lt;br /&gt;
| u32&lt;br /&gt;
| Size of the MMU table&lt;br /&gt;
|-&lt;br /&gt;
| 0x64&lt;br /&gt;
| u32&lt;br /&gt;
| Virtual address of the MMU table for this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x68&lt;br /&gt;
| u32&lt;br /&gt;
| Total size of all [[Memory_layout#0xFF4XX000|Thread Context]] pages owned by threads that belong to this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C&lt;br /&gt;
| u32&lt;br /&gt;
| Number of [[KThreadLocalPage|KThreadLocalPages]] used by this KProcess&lt;br /&gt;
|-&lt;br /&gt;
| 0x70&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of KThreadLocalPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of KThreadLocalPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| u32&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| s32&lt;br /&gt;
| Ideal processor for this process&lt;br /&gt;
|-&lt;br /&gt;
| 0x80&lt;br /&gt;
| KDebug*&lt;br /&gt;
| KDebug object created from [[SVC|svc 0x60]] to debug the process&lt;br /&gt;
|-&lt;br /&gt;
| 0x84&lt;br /&gt;
| KResourceLimit*&lt;br /&gt;
| Pointer to resource limits for process.&lt;br /&gt;
|-&lt;br /&gt;
| 0x88&lt;br /&gt;
| u8&lt;br /&gt;
| Normally 1 to indicate process is open/available.  Set to 2 to indicate process is exiting/closing and 3 to indicate exited/closed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x89&lt;br /&gt;
| u8&lt;br /&gt;
| Process affinity mask&lt;br /&gt;
|-&lt;br /&gt;
| 0x8A&lt;br /&gt;
| u16&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|-&lt;br /&gt;
| 0x8C&lt;br /&gt;
| s16&lt;br /&gt;
| Number of threads which belong to this process.&lt;br /&gt;
|-&lt;br /&gt;
| 0x8E&lt;br /&gt;
| s16&lt;br /&gt;
| Max number of threads which can belong to this process.  This is always 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x90&lt;br /&gt;
| 0x10-bytes&lt;br /&gt;
| SVC access control mask from the exheader kernel descriptors. This is copied to the [[Memory_layout#0xFF4XX000|Thread Context]] area when creating threads, which is the actual data the SVC-handler checks for SVC-access-control.&lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| u32[4]&lt;br /&gt;
| Interrupt flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words&lt;br /&gt;
|-&lt;br /&gt;
| 0xB0&lt;br /&gt;
| u32&lt;br /&gt;
| Kernel flags from the exheader kernel descriptors. &lt;br /&gt;
|-&lt;br /&gt;
| 0xB4&lt;br /&gt;
| u16&lt;br /&gt;
| Handle table size from the exheader kernel descriptors. When this is 0, handle table is stored in WRAM.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB6&lt;br /&gt;
| u16&lt;br /&gt;
| Kernel release version field, from the exheader kernel descriptors.&lt;br /&gt;
|-&lt;br /&gt;
| 0xB8&lt;br /&gt;
| KCodeSet*&lt;br /&gt;
| Pointer to [[KCodeSet]] instance&lt;br /&gt;
|-&lt;br /&gt;
| 0xBC&lt;br /&gt;
| u32&lt;br /&gt;
| Process id, this always begins at 0x0 for the first process.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0&lt;br /&gt;
| s64&lt;br /&gt;
| Process creation time as tick count&lt;br /&gt;
|-&lt;br /&gt;
| 0xC8&lt;br /&gt;
| KThread*&lt;br /&gt;
| Pointer to the process&#039;s main thread.&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC&lt;br /&gt;
| u32[4]&lt;br /&gt;
| Interrupt enabled flags- 32 interrupts per word, 4 words, 0x80 interrupts total divided evenly across 4 words&lt;br /&gt;
|-&lt;br /&gt;
| 0xDC&lt;br /&gt;
| [[KProcess#KProcessHandleTable|KProcessHandleTable]]&lt;br /&gt;
| This is the data for tracking and using all of the KProcess&#039;s handles.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF4&lt;br /&gt;
| HandleDescriptor[0x28]&lt;br /&gt;
| These internal HandleDescriptor entries are only used if the exheader&#039;s handle table size is 0&lt;br /&gt;
|-&lt;br /&gt;
| 0x234&lt;br /&gt;
| u32&lt;br /&gt;
| Unused (From here up, everything is set to 0 on creation, has 0 written to it again during process creation, and is never used again.)&lt;br /&gt;
|-&lt;br /&gt;
| 0x238&lt;br /&gt;
| u64&lt;br /&gt;
| Unused &lt;br /&gt;
|-&lt;br /&gt;
| 0x240&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x248&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x250&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x258&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x260&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|-&lt;br /&gt;
| 0x268&lt;br /&gt;
| u64&lt;br /&gt;
| Unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= KProcessHandleTable =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| HandleDescriptor*&lt;br /&gt;
| Pointer to the process&#039;s handle table.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| s16&lt;br /&gt;
| The max number of handles that can be open at once - usually 0x200.&lt;br /&gt;
|-&lt;br /&gt;
| 0x6&lt;br /&gt;
| s16&lt;br /&gt;
| The highest count of handles that have been open at once&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| HandleDescriptor*&lt;br /&gt;
| Pointer to the next open HandleDescriptor entry in the handle table. &lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| s16&lt;br /&gt;
| Total handles used by this KProcess.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE&lt;br /&gt;
| s16&lt;br /&gt;
| The current number of handles in use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KThread*&lt;br /&gt;
| Thread currently running code acting on this object.&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| s16&lt;br /&gt;
| Track errors for the running thread above. &lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| s16&lt;br /&gt;
| Unused, alignment&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| HandleDescriptor[0x28]&lt;br /&gt;
| This small handle data table, internal to the KProcess, is only used in certain processes that don&#039;t have an external handle descriptor table in FCRAM.  It is all zeros in most processes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= HandleDescriptor =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Handle info&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to the kernel object that the handle references.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The handle info u32 works as such:&lt;br /&gt;
&lt;br /&gt;
The high byte is a remainder from the pointer to the next entry that originally occupied the handle table entry.  It is unused. Byte 2 is either the class type token starting with firmware version 9.0 or the lowest byte of the char* that points to the class type name in firmware versions below 9.0.  The lower halfword is the handle number of the current handle taken from the total handle count for the KProcess that owns the table.&lt;br /&gt;
&lt;br /&gt;
On table creation, each entry in the handle data table is populated with a pointer to the next entry in the table.  When a new handle is created, that pointer is moved into offset 0x8 of the KProcessHandleTable info struct to use for generation of the next handle.&lt;br /&gt;
&lt;br /&gt;
The final handle that gets returned when a handle is created is (handle_index | (handle_total &amp;lt;&amp;lt; 15)), basically they take the index into the handle data table and OR that with the total handle count &amp;lt;&amp;lt; 15.  This returned value is the one that gets passed back to the running application and is used to look up the HandleDescriptor entry in the table.&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KMutex&amp;diff=17970</id>
		<title>KMutex</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KMutex&amp;diff=17970"/>
		<updated>2016-08-22T21:10:27Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KMutex]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x2C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| ?&lt;br /&gt;
| ? &lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| ?&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| u32&lt;br /&gt;
| Threads using this mutex&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KThread]] *&lt;br /&gt;
| Thread that has the KMutex locked&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| u32&lt;br /&gt;
| Priority&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| [[KProcess]]*&lt;br /&gt;
| Owner&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KCodeSet&amp;diff=17968</id>
		<title>KCodeSet</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KCodeSet&amp;diff=17968"/>
		<updated>2016-08-22T20:30:04Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
class [[KCodeSet]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x64 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| KCodeSetMemDescriptor&lt;br /&gt;
| Memory section info for .text&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KCodeSetMemDescriptor&lt;br /&gt;
| Memory section info for .rodata&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| KCodeSetMemDescriptor&lt;br /&gt;
| Memory section info for .data&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32&lt;br /&gt;
| Total .text pages&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| u32&lt;br /&gt;
| Total .rodata pages&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| u32&lt;br /&gt;
| Total RW pages (.bss + .data)&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| u64&lt;br /&gt;
| Process name as 8-byte string&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| u16&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A&lt;br /&gt;
| u16&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| u64&lt;br /&gt;
| TitleID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=KCodeSetMemDescriptor=&lt;br /&gt;
&lt;br /&gt;
Sections too large to fit into any available memory blocks will be split across multiple memory blocks with a [[KBlockInfo]] instance for each. This is described by the memory section info struct:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Start address (virtual)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Total pages&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| [[KBlockInfo]] count &lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of objects&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of objects&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KCodeSet&amp;diff=17967</id>
		<title>KCodeSet</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KCodeSet&amp;diff=17967"/>
		<updated>2016-08-22T20:23:19Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
&lt;br /&gt;
class [[KCodeSet]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x64 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| Struct size is 0x14&lt;br /&gt;
| Memory section info for .text&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| Struct size is 0x14&lt;br /&gt;
| Memory section info for .rodata&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| Struct size is 0x14&lt;br /&gt;
| Memory section info for .data&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| u32&lt;br /&gt;
| Total .text pages&lt;br /&gt;
|-&lt;br /&gt;
| 0x48&lt;br /&gt;
| u32&lt;br /&gt;
| Total .rodata pages&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C&lt;br /&gt;
| u32&lt;br /&gt;
| Total RW pages (.bss + .data)&lt;br /&gt;
|-&lt;br /&gt;
| 0x50&lt;br /&gt;
| u64&lt;br /&gt;
| Process name as 8-byte string&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| u16&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5A&lt;br /&gt;
| u16&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x5C&lt;br /&gt;
| u64&lt;br /&gt;
| TitleID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sections too large to fit into any available memory blocks will be split across multiple memory blocks with a [[KBlockInfo]] instance for each. This is described by the memory section info struct:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
!  Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Start address (virtual)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Total pages&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| [[KLinkedList]]&lt;br /&gt;
| List of [[KBlockInfo]] objects for this section &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KClientPort&amp;diff=17966</id>
		<title>KClientPort</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KClientPort&amp;diff=17966"/>
		<updated>2016-08-22T20:21:37Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KClientPort]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x1C bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| s16 &lt;br /&gt;
| Current connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x16&lt;br /&gt;
| s16 &lt;br /&gt;
| Max connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KPort]]*&lt;br /&gt;
| Pointer to the parent port object;&lt;br /&gt;
|-&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KPort&amp;diff=17965</id>
		<title>KPort</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KPort&amp;diff=17965"/>
		<updated>2016-08-22T20:08:52Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Undo revision 17962 by Neobrain (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KPort]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x48 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KServerPort]] vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| [[KServerPort]] Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of KServerSessions associated with this port&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of KServerSessions associated with this port&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| KPort* &lt;br /&gt;
| Pointer to parent KPort&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KClientPort]] vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| [[KClientPort]] Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| s16 &lt;br /&gt;
| Current connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| s16 &lt;br /&gt;
| Max connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| KPort*&lt;br /&gt;
| Pointer to the parent port object;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KClientSession&amp;diff=17964</id>
		<title>KClientSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KClientSession&amp;diff=17964"/>
		<updated>2016-08-22T20:08:20Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Undo revision 17963 by Neobrain (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KClientSession]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x20 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32 &lt;br /&gt;
| KLinkedListNode count for object&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| u32 &lt;br /&gt;
| Session status&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KClientPort* &lt;br /&gt;
| Pointer to associated client port inside parent KPort&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Session status:&lt;br /&gt;
&lt;br /&gt;
1: open&amp;lt;br&amp;gt;&lt;br /&gt;
2: closed by client&amp;lt;br&amp;gt;&lt;br /&gt;
3: closed by server?&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KPort&amp;diff=17961</id>
		<title>KPort</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KPort&amp;diff=17961"/>
		<updated>2016-08-22T19:53:46Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Undo revision 17939 by Neobrain (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KPort]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x48 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KServerPort]] vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| [[KServerPort]] Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of KServerSessions associated with this port&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of KServerSessions associated with this port&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| KPort* &lt;br /&gt;
| Pointer to parent KPort&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KClientPort]] vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| [[KClientPort]] Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| s16 &lt;br /&gt;
| Current connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| s16 &lt;br /&gt;
| Max connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| KPort*&lt;br /&gt;
| Pointer to the parent port object;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KClientSession&amp;diff=17960</id>
		<title>KClientSession</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KClientSession&amp;diff=17960"/>
		<updated>2016-08-22T19:53:21Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Undo revision 17940 by Neobrain (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KClientSession]] extends [[KSynchronizationObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x20 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32 &lt;br /&gt;
| KLinkedListNode count for object&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to first KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| KLinkedListNode*&lt;br /&gt;
| Pointer to last KLinkedListNode in list of KThreads using this client session&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| KSession* &lt;br /&gt;
| Pointer to parent session&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| u32 &lt;br /&gt;
| Session status&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| KClientPort* &lt;br /&gt;
| Pointer to associated client port inside parent KPort&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Session status:&lt;br /&gt;
&lt;br /&gt;
1: open&amp;lt;br&amp;gt;&lt;br /&gt;
2: closed by client&amp;lt;br&amp;gt;&lt;br /&gt;
3: closed by server?&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=SVC&amp;diff=17933</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=SVC&amp;diff=17933"/>
		<updated>2016-08-10T19:10:53Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= System calls =&lt;br /&gt;
&#039;&#039;&#039;Note: The argument-lists here apply to the official syscall wrapper-functions that are found in userland processes. The actual ordering passed to the kernel via the SVC instruction is documented in [[Kernel_ABI|Kernel ABI]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Id&lt;br /&gt;
!  NF ARM11&lt;br /&gt;
!  NF ARM9&lt;br /&gt;
!  TF ARM11&lt;br /&gt;
!  Description&lt;br /&gt;
! scope=&amp;quot;col&amp;quot; width=&amp;quot;200&amp;quot; |  Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Memory Management|ControlMemory]](u32* outaddr, u32 addr0, u32 addr1, u32 size, [[Memory Management#enum_MemoryOperation|MemoryOperation]] operation, [[Memory Management#enum_MemoryPermission|MemoryPermission]] permissions)&lt;br /&gt;
| Outaddr is usually the same as the input addr0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Memory Management|QueryMemory]]([[Memory Management#struct MemoryInfo|MemoryInfo]]* info, [[Memory Management#struct PageInfo|PageInfo]]* out, u32 Addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| void ExitProcess(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetProcessAffinityMask(u8* affinitymask, Handle process, s32 processorcount)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x05 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SetProcessAffinityMask(Handle process, u8* affinitymask, s32 processorcount)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetProcessIdealProcessor(s32 *idealprocessor, Handle process)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SetProcessIdealProcessor(Handle process, s32 idealprocessor)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#CreateThread|CreateThread]](Handle* thread, func entrypoint, u32 arg, u32 stacktop, s32 threadpriority, s32 processorid)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| void [[Multi-threading#ExitThread|ExitThread]](void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| void [[Multi-threading#SleepThread|SleepThread]](s64 nanoseconds)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x0B &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#GetThreadPriority|GetThreadPriority]](s32* priority, Handle thread)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#SetThreadPriority|SetThreadPriority]](Handle thread, s32 priority)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x0D &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#GetThreadAffinityMask|GetThreadAffinityMask]](u8* affinitymask, Handle thread, s32 processorcount)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x0E &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#SetThreadAffinityMask|SetThreadAffinityMask]](Handle thread, u8* affinitymask, s32 processorcount)&lt;br /&gt;
| Replaced with a stub in ARM11 NATIVE_FIRM kernel beginning with [[8.0.0-18]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0F &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#GetThreadIdealProcessor|GetThreadIdealProcessor]](s32* processorid, Handle thread)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#SetThreadIdealProcessor|SetThreadIdealProcessor]](Handle thread, s32 processorid)&lt;br /&gt;
| Replaced with a stub in ARM11 NATIVE_FIRM kernel beginning with [[8.0.0-18]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| s32 GetCurrentProcessorNumber(void)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#Run|Run]](Handle process, StartupInfo* info)&lt;br /&gt;
| This starts the main() thread. Buf+0 is main-thread priority, Buf+4 is main-thread stack-size.&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#CreateMutex|CreateMutex]](Handle* mutex, bool initialLocked)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#ReleaseMutex|ReleaseMutex]](Handle mutex)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x15 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#CreateSemaphore|CreateSemaphore]](Handle* semaphore, s32 initialCount, s32 maxCount)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#ReleaseSemaphore|ReleaseSemaphore]](s32* count, Handle semaphore, s32 releaseCount)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#CreateEvent|CreateEvent]](Handle* event, ResetType resettype)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#SignalEvent|SignalEvent]](Handle event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#ClearEvent|ClearEvent]](Handle event)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result CreateTimer(Handle* timer, ResetType resettype)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x1B &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result SetTimer(Handle timer, s64 initial_nanoseconds, s64 interval)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result CancelTimer(Handle timer)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result ClearTimer(Handle timer)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Memory Management|CreateMemoryBlock]](Handle* memblock, u32 addr, u32 size, [[Memory Management#enum_MemoryPermission|MemoryPermission]] mypermission, [[Memory Management#enum_MemoryPermission|MemoryPermission]] otherpermission)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Memory Management|MapMemoryBlock]](Handle memblock, u32 addr, [[Memory Management#enum_MemoryPermission|MemoryPermission]] mypermissions, [[Memory Management#enum_MemoryPermission|MemoryPermission]] otherpermission)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Memory Management|UnmapMemoryBlock]](Handle memblock, u32 addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#Address_Arbiters|CreateAddressArbiter]](Handle* arbiter)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#Address_Arbiters|ArbitrateAddress]](Handle arbiter, u32 addr, ArbitrationType type, s32 value, s64 nanoseconds)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result CloseHandle(Handle handle)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result WaitSynchronization1(Handle handle, s64 timeout_nanoseconds)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result WaitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 timeout_nanoseconds)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SignalAndWait(s32* out, Handle signal, Handle* handles, s32 handleCount, bool waitAll, s64 nanoseconds)&lt;br /&gt;
| Stubbed&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result DuplicateHandle(Handle* out, Handle original)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| s64 GetSystemTick(void) (This returns the total CPU ticks elapsed since the CPU was powered-on)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x29 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetHandleInfo(s64* out, Handle handle, HandleInfoType type)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result GetSystemInfo(s64* out, SystemInfoType type, s32 param)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result GetProcessInfo(s64* out, Handle process, ProcessInfoType type)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#GetThreadInfo|GetThreadInfo]](s64* out, Handle thread, ThreadInfoType type)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ConnectToPort(Handle* out, const char* portName)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SendSyncRequest1(Handle session)&lt;br /&gt;
| Stubbed&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SendSyncRequest2(Handle session)&lt;br /&gt;
| Stubbed&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SendSyncRequest3(Handle session)&lt;br /&gt;
| Stubbed&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SendSyncRequest4(Handle session)&lt;br /&gt;
| Stubbed&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SendSyncRequest(Handle session)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result OpenProcess(Handle* process, u32 processId)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#OpenThread|OpenThread]](Handle* thread, Handle process, u32 threadId)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result GetProcessId(u32* processId, Handle process)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x36 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#GetProcessIdOfThread|GetProcessIdOfThread]](u32* processId, Handle thread)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x37 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Multi-threading#GetThreadId|GetThreadId]](u32* threadId, Handle thread)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x38 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetResourceLimit(Handle* resourceLimit, Handle process)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x39 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetResourceLimitLimitValues(s64* values, Handle resourceLimit, LimitableResource* names, s32 nameCount)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x3A &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetResourceLimitCurrentValues(s64* values, Handle resourceLimit, LimitableResource* names, s32 nameCount)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x3B &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#GetThreadContext|GetThreadContext]](ThreadContext* context, Handle thread)&lt;br /&gt;
| Stubbed&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Break(BreakReason)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| OutputDebugString(void const, int)&lt;br /&gt;
| Does nothing on non-debug units.&lt;br /&gt;
|-&lt;br /&gt;
| 0x3E &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| ControlPerformanceCounter(unsigned long long, int, unsigned int, unsigned long long)&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x47 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result CreatePort(Handle* portServer, Handle* portClient,  const char* name, s32 maxSessions)&lt;br /&gt;
| Setting name=NULL creates a private port not accessible from svcConnectToPort.&lt;br /&gt;
|-&lt;br /&gt;
| 0x48 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result CreateSessionToPort(Handle* session, Handle port)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result CreateSession(Handle* sessionServer, Handle* sessionClient)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result AcceptSession(Handle* session, Handle port)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ReplyAndReceive1(s32* index, Handle* handles, s32 handleCount, Handle replyTarget)&lt;br /&gt;
| Stubbed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ReplyAndReceive2(s32* index, Handle* handles, s32 handleCount, Handle replyTarget)&lt;br /&gt;
| Stubbed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ReplyAndReceive3(s32* index, Handle* handles, s32 handleCount, Handle replyTarget)&lt;br /&gt;
| Stubbed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ReplyAndReceive4(s32* index, Handle* handles, s32 handleCount, Handle replyTarget)&lt;br /&gt;
| Stubbed.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ReplyAndReceive(s32* index, Handle* handles, s32 handleCount, Handle replyTarget)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[#Interrupt Handling|BindInterrupt]](Interrupt name, Handle syncObject, s32 priority, bool isManualClear)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result UnbindInterrupt(Interrupt name, Handle syncObject)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result InvalidateProcessDataCache(Handle process, void* addr, u32 size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result StoreProcessDataCache(Handle process, void const* addr, u32 size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result FlushProcessDataCache(Handle process, void const* addr, u32 size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result [[Corelink DMA Engines|StartInterProcessDma]](Handle* dma, Handle dstProcess, void* dst, Handle srcProcess, const void* src, u32 size, const DmaConfig* config)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result StopDma(Handle dma)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| Result GetDmaState(DmaState* state, Handle dma)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x58&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| RestartDma(nn::Handle, void *, void  const*, unsigned int, signed char)&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x60 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result DebugActiveProcess(Handle* debug, u32 processID)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result BreakDebugProcess(Handle debug)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result TerminateDebugProcess(Handle debug)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetProcessDebugEvent(DebugEventInfo* info, Handle debug)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ContinueDebugEvent(Handle debug, u32 flags)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetProcessList(s32* processCount, u32* processIds, s32 processIdMaxCount)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x66 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetThreadList(s32* threadCount, u32* threadIds, s32 threadIdMaxCount, Handle domain)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result GetDebugThreadContext(ThreadContext* context, Handle debug, u32 threadId, u32 controlFlags)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SetDebugThreadContext(Handle debug, u32 threadId, ThreadContext* context, u32 controlFlags)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result QueryDebugProcessMemory(MemoryInfo* blockInfo, PageInfo* pageInfo, Handle process, u32 addr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ReadProcessMemory(void* buffer, Handle debug, u32 addr, u32 size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result WriteProcessMemory(Handle debug, void const* buffer, u32 addr, u32 size)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C &lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SetHardwareBreakPoint(s32 registerId, u32 control, u32 value)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x6D&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| [[Multi-threading#GetDebugThreadParam|GetDebugThreadParam]](s64* unused, u32* out, Handle kdebug, u32 threadId, DebugThreadParam param)&lt;br /&gt;
| Disabled on regular kernel.&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x70&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result ControlProcessMemory(Handle KProcess, unsigned int Addr0, unsigned int Addr1, unsigned int Size, unsigned int Type, unsigned int Permissions)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x71&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Memory Management#Memory_Mapping|MapProcessMemory]](Handle KProcess, unsigned int StartAddr, unsigned int EndAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x72&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Memory Management#Memory_Mapping|UnmapProcessMemory]](Handle KProcess, unsigned int StartAddr, unsigned int EndAddr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x73&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#CreateCodeSet|CreateCodeSet]](Handle* handle_out, struct CodeSetInfo, u32 code_ptr, u32 ro_ptr, u32 data_ptr)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result RandomStub()&lt;br /&gt;
| Stubbed&lt;br /&gt;
|-&lt;br /&gt;
| 0x75&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result [[Multi-threading#CreateProcess|CreateProcess]](Handle* handle_out, Handle codeset_handle, u32 [[NCCH/Extended_Header#ARM11_Kernel_Capabilities|arm11kernelcaps_ptr]], u32 arm11kernelcaps_num)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x76&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| TerminateProcess(Handle)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x77&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SetProcessResourceLimits(Handle KProcess, Handle KResourceLimit)&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x78&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result CreateResourceLimit(Handle *KResourceLimit)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x79&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result SetResourceLimitValues(Handle res_limit, LimitableResource* resource_type_list, s64* resource_list, u32 count)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| AddCodeSegment (unsigned int Addr, unsigned int Size)&lt;br /&gt;
| Stubbed on NATIVE_FIRM beginning with [[2.0.0-2]]. Used during TWL_FIRM boot.&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Backdoor(unsigned int CodeAddress)&lt;br /&gt;
| This is used on ARM9 NATIVE_FIRM. &lt;br /&gt;
No ARM11 processes have access to it without some form of kernelhax, and this was removed on [[11.0.0-33]] (for ARM11).&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| KernelSetState(unsigned int Type, unsigned int Param0, unsigned int Param1, unsigned int Param2)&lt;br /&gt;
| The type determines the meaning of each param&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| style=&amp;quot;background: red&amp;quot; | No&lt;br /&gt;
| Result QueryProcessMemory(MemInfo *Info, unsigned int *Out, Handle KProcess, unsigned int Addr)&lt;br /&gt;
|&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0xFF&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| style=&amp;quot;background: green&amp;quot; | Yes&lt;br /&gt;
| ???&lt;br /&gt;
| Debug related? The svcaccesscontrol mask doesn&#039;t apply for this SVC. Stubbed on ARM9 NATIVE_FIRM.&lt;br /&gt;
|}&lt;br /&gt;
NF: NATIVE_FIRM. TF: TWL_FIRM.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;stubbed&amp;quot; here means that the SVC only returns an error, as in the following snippet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ROM:FFF04D98                 LDR             R0, =0xF8C007F4&lt;br /&gt;
ROM:FFF04D9C                 BX              LR&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Types and structures =&lt;br /&gt;
&lt;br /&gt;
== enum ResetType ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Reset type&lt;br /&gt;
!  Id&lt;br /&gt;
|-&lt;br /&gt;
| ONESHOT&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| STICKY&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| PULSE&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Timers/Events may be waited on by a thread using svcWaitSynchronization. Once the timer runs out/the event gets signaled, threads waiting on the respective handles until the timer/event is reset. STICKY timers/events wake up threads until they are explicitly reset by some thread. ONESHOT timers/events will wake up exactly one thread and then are reset automatically. PULSE timers will be reset after waking up one thread too, but will also be started again immediately. It&#039;s unknown whether PULSE is a valid reset type for events.&lt;br /&gt;
&lt;br /&gt;
== struct StartupInfo ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| s32&lt;br /&gt;
| Priority&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Stack size&lt;br /&gt;
|-&lt;br /&gt;
| s32&lt;br /&gt;
| argc&lt;br /&gt;
|-&lt;br /&gt;
| s16*&lt;br /&gt;
| argv&lt;br /&gt;
|-&lt;br /&gt;
| s16*&lt;br /&gt;
| envp&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== enum BreakReason ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Break Reason&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| PANIC&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| ASSERT&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| USER&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== struct DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Event type&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Thread ID (not used in all events)&lt;br /&gt;
|-&lt;br /&gt;
| u32[2]&lt;br /&gt;
| Unknown/padding&lt;br /&gt;
|-&lt;br /&gt;
| u32[6]&lt;br /&gt;
| Event-specific data (see below)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Event type&lt;br /&gt;
!  Id&lt;br /&gt;
|-&lt;br /&gt;
| PROCESS&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| CREATE THREAD&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| EXIT THREAD&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| EXIT PROCESS&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| EXCEPTION&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| DLL LOAD&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| DLL UNLOAD&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| SCHEDULE IN&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| SCHEDULE OUT&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| SYSCALL IN&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| SYSCALL OUT&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| OUTPUT STRING&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| MAP&lt;br /&gt;
| 12&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== PROCESS event ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u64&lt;br /&gt;
| Program ID&lt;br /&gt;
|-&lt;br /&gt;
| char[8]&lt;br /&gt;
| Process name&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Process ID&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| 0 = newly created process, 1 = attached process&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== CREATE THREAD event ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Creator thread ID&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Base address (?)&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== EXIT THREAD/PROCESS events ===&lt;br /&gt;
&lt;br /&gt;
A single u32 reason field is used.&lt;br /&gt;
&lt;br /&gt;
Thread exit reasons:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Reason&lt;br /&gt;
!  Id&lt;br /&gt;
|-&lt;br /&gt;
| (None)&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| TERMINATE&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| EXIT PROCESS&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| TERMINATE PROCESS&lt;br /&gt;
| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Process exit reasons:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Reason&lt;br /&gt;
!  Id&lt;br /&gt;
|-&lt;br /&gt;
| (None)&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| TERMINATE&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| UNHANDLED EXCEPTION&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== EXCEPTION event ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Exception type&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Exception address&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Argument (type-specific)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Reason&lt;br /&gt;
!  Id&lt;br /&gt;
!  Argument&lt;br /&gt;
|-&lt;br /&gt;
| UNDEFINED INSTRUCTION&lt;br /&gt;
| 0&lt;br /&gt;
| (None)&lt;br /&gt;
|-&lt;br /&gt;
| (Unknown)&lt;br /&gt;
| 1&lt;br /&gt;
| (None)&lt;br /&gt;
|-&lt;br /&gt;
| (Unknown, mem-related)&lt;br /&gt;
| 2&lt;br /&gt;
| Address&lt;br /&gt;
|-&lt;br /&gt;
| (Unknown, mem-related)&lt;br /&gt;
| 3&lt;br /&gt;
| Address&lt;br /&gt;
|-&lt;br /&gt;
| ATTACH BREAK&lt;br /&gt;
| 4&lt;br /&gt;
| (None)&lt;br /&gt;
|-&lt;br /&gt;
| BREAKPOINT&lt;br /&gt;
| 5&lt;br /&gt;
| (None)&lt;br /&gt;
|-&lt;br /&gt;
| USER BREAK&lt;br /&gt;
| 6&lt;br /&gt;
| User break type&lt;br /&gt;
|-&lt;br /&gt;
| DEBUGGER BREAK&lt;br /&gt;
| 7&lt;br /&gt;
| (None)&lt;br /&gt;
|-&lt;br /&gt;
| UNDEFINED SYSCALL&lt;br /&gt;
| 8&lt;br /&gt;
| Attempted syscall ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
User break types:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Reason&lt;br /&gt;
!  Id&lt;br /&gt;
|-&lt;br /&gt;
| PANIC&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| ASSERT&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| USER&lt;br /&gt;
| 2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== SCHEDULER/SYSCALL IN/OUT events ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u64&lt;br /&gt;
| Clock tick&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Syscall (only for SYSCALL events)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== OUTPUT STRING event ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| String address&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| String size&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== MAP event ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Type&lt;br /&gt;
!  Field&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Mapped address&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| Mapped size&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| MemoryPermission&lt;br /&gt;
|-&lt;br /&gt;
| u32&lt;br /&gt;
| MemoryState&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== enum DebugThreadParam ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Parameter&lt;br /&gt;
!  Id&lt;br /&gt;
|-&lt;br /&gt;
| PRIORITY&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| SCHEDULE&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| CPU_IDEAL&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| CPU_CREATOR&lt;br /&gt;
| 3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== typedef Handle ==&lt;br /&gt;
&lt;br /&gt;
User-visible references to internal objects are represented by 32-bit integers called handles. Handles are only valid in the process they have been created in; hence, they cannot be exchanged between processes directly (the [[IPC]] functions provide a mean to copy handles to other processes, though).&lt;br /&gt;
&lt;br /&gt;
There are a number of special-purpose handles, which provide easy access to information on objects in the current process:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Handle&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFF8000&lt;br /&gt;
| Handle to the active thread&lt;br /&gt;
|-&lt;br /&gt;
| 0xFFFF8001&lt;br /&gt;
| Handle to the active process&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=svcSetHardwareBreakPoint=&lt;br /&gt;
This is essentially an interface for writing values to the debug-unit (B/W)RP registers. registerId range 0..5 = breakpoints(BRP0-5), 0x100..0x101 = watchpoints(WRP0-1), anything outside of these ranges will result in an error. This is used for both adding and removing/disabling breakpoints/watchpoints, hence the raw control value parameter.&lt;br /&gt;
&lt;br /&gt;
Here the kernel sets bit15 in the DSCR, to enable monitor-mode debugging.&lt;br /&gt;
&lt;br /&gt;
Regardless of whether this is for a BRP, when bit21 is set in the control input parameter(BRP type = contextID), the kernel will load the target process [[KProcess|contextID]] and use that internally for the value field. The target process is specified via a [[KDebug]] handle passed as the &amp;quot;value&amp;quot; parameter.&lt;br /&gt;
&lt;br /&gt;
Lastly, the kernel disables the specified (B/W)RP, then writes the value parameter / loaded contextID to the (B/W)VR, then writes the input control value to the (B/W)CR.&lt;br /&gt;
&lt;br /&gt;
= [[DMA]] =&lt;br /&gt;
The CTRSDK code for using svcStartInterProcessDma will execute svcBreak when svcStartInterProcessDma returns an error(except for certain error value(s)). Therefore on retail, triggering a svcStartInterProcessDma via a system-module which results in an error from svcStartInterProcessDma will result in the system-module terminating.&lt;br /&gt;
&lt;br /&gt;
= Interrupt Handling =&lt;br /&gt;
&lt;br /&gt;
BindInterrupt adds the given event handle to an internal list for the given interrupt ID. Whenever the given interrupt is triggered, the kernel&#039;s interrupt handler will signal all events in the list corresponding to that interrupt.&lt;br /&gt;
&lt;br /&gt;
Applications hence can wait for specific interrupts to happen by calling WaitSynchronization(N) on the event handles.&lt;br /&gt;
&lt;br /&gt;
It is unknown whether BindInterrupt may be used with non-event handles.&lt;br /&gt;
&lt;br /&gt;
The set of existing ARM11 interrupts is listed on [[ARM11 Interrupts|this page]].&lt;br /&gt;
&lt;br /&gt;
= Debugging =&lt;br /&gt;
DebugActiveProcess is used to attach to a process for debugging. This SVC can only be used when the target process&#039; ARM11 descriptors stored in the exheader have the kernel flag for &amp;quot;Enable debug&amp;quot; set. Otherwise when that flag is clear, the kernel flags for the process using this SVC must have the &amp;quot;Force debug&amp;quot; flag set.&lt;br /&gt;
&lt;br /&gt;
This SVC can only be used when a certain kernel state debug flag is non-zero(it&#039;s set to zero for retail).&lt;br /&gt;
&lt;br /&gt;
= KernelSetState =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Type&lt;br /&gt;
!  Enabled for the NATIVE_FIRM ARM11 kernel&lt;br /&gt;
!  Enabled for the TWL_FIRM ARM11 kernel&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| This initializes the programID for launching [[FIRM]], then triggers launching [[FIRM]]. Param0 is unused. Param1 is the programID-low, and the programID-high is 0x00040138. Param2 is used only with the [[New_3DS]] kernel, pm-module uses value 0 with this. With New3DS kernel, it forces the programIDlow to be the New3DS NATIVE_FIRM, when the input programIDlow is for the Old3DS NATIVE_FIRM and Param2==0.&lt;br /&gt;
On New3DS, the kernel disables the additional New3DS cache hw prior to calling the firmlaunch function from the &amp;lt;handler for the KernelSetState-types called via funcptr&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Unknown, does nothing with the TWL_FIRM ARM11 kernel.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| Unknown.&lt;br /&gt;
On New3DS, the kernel disables the additional New3DS cache hw, when it&#039;s actually enabled, prior to executing the rest of the code from the &amp;lt;handler for the KernelSetState-types called via funcptr&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| This used for initializing the 0x1000-byte buffer used by the launched [[FIRM]]. Param2 is unused. When Param0 is value 1, this buffer is copied to the beginning of FCRAM at 0xF0000000, and Param1 is unused. When Param0 is value 0, this kernel buffer is mapped to process address Param1.&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| No&lt;br /&gt;
| Yes&lt;br /&gt;
| Param0-Param3 are unused. This unmaps(?) the following virtual memory by writing value physaddr(where physaddr base is 0x80000000) to the L1 MMU table entries: 0x00300000..0x04300000, 0x08000000..0x0FE00000, and 0x10000000..0xF8000000.&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| Yes&lt;br /&gt;
| Yes&lt;br /&gt;
| ?&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| Debug related?&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| This triggers an MCU (hard) reboot. Param0-3 are unused. This reboot is triggered via device address 0x4A on the second [[I2C]] bus (the MCU). Register address 0x20 is written to with value 4. This code will not return.&lt;br /&gt;
On New3DS, the kernel disables the additional New3DS cache hw prior to calling the reboot function from the &amp;lt;handler for the KernelSetState-types called via funcptr&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| Yes&lt;br /&gt;
| No&lt;br /&gt;
| Alternate FIRM launch code-path, with different [[PXI]] FIFO word constants. Usually not used. PTM-sysmodule can use this but it&#039;s unknown what exactly triggers that in PTM-sysmodule.&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| Yes, implemented at some point after system-version v4.5.&lt;br /&gt;
| ?&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Yes&lt;br /&gt;
| ?&lt;br /&gt;
| ConfigureNew3DSCPU. Only available for the [[New_3DS]] kernel. The actual code for processing this runs under the &amp;lt;handler for the KernelSetState-types called via funcptr&amp;gt;, which runs on all ARM11 cores. Param0 = input value. Only bit0-1 are used here. Bit 0 enables higher core clock, and bit 1 enables additional (L2) cache. This configures the hardware [[PDN_Registers|register]] for the flags listed [[NCCH/Extended_Header#Flag1|here]], among other code which uses the MPCore private memory region registers.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= GetSystemInfo =&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  SystemInfoType value&lt;br /&gt;
!  s32 param&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| This writes the total used memory size in the following memory regions to out: APPLICATION, SYSTEM, and BASE.&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| This writes the total used memory size in the APPLICATION memory region to out.&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 2&lt;br /&gt;
| This writes the total used memory size in the SYSTEM memory region to out.&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 3&lt;br /&gt;
| This writes the total used memory size in the BASE memory region to out.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Unused&lt;br /&gt;
| This writes the FCRAM memory [[Memory_Allocation#FCRAM_Region_Data|used by the kernel]] to out.&lt;br /&gt;
|-&lt;br /&gt;
| 25&lt;br /&gt;
| Unused&lt;br /&gt;
| This writes the total number of threads which were directly launched by the kernel, to out. No longer exists with some kernel version?&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| Unused&lt;br /&gt;
| This writes the total number of processes which were directly launched by the kernel, to out. For the NATIVE_FIRM/SAFE_MODE_FIRM ARM11 kernel, this is normally 5, for processes sm, fs, pm, loader, and pxi.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= GetProcessInfo =&lt;br /&gt;
Input:&lt;br /&gt;
 R0 = unused&lt;br /&gt;
 R1 = Handle process&lt;br /&gt;
 R2 = ProcessInfoType type&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
 R0 = Result&lt;br /&gt;
 R1 = output value lower word&lt;br /&gt;
 R2 = output value upper word&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  ProcessInfoType value&lt;br /&gt;
!  Available since system version&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 9-19&lt;br /&gt;
| [[8.0.0-18]]&lt;br /&gt;
| This only returns error 0xD8E007ED.&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| [[8.0.0-18]]&lt;br /&gt;
| low u32 = (0x20000000 - &amp;lt;LINEAR virtual-memory base for this process&amp;gt;). That is, the output value is the value which can be added to LINEAR memory vaddrs for converting to physical-memory addrs.&lt;br /&gt;
|-&lt;br /&gt;
| 21-23&lt;br /&gt;
| [[8.0.0-18]]&lt;br /&gt;
| This only returns error 0xE0E01BF4.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= GetHandleInfo =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  HandleInfoType value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| This returns the time in ticks the KProcess referenced by the handle was created. If a KProcess handle was not given, it will write whatever was in r5, r6 when the svc was called.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Get internal refcount-1 for kernel object (u32), and also a boolean if the refcount-1 is negative (u32).&lt;br /&gt;
|-&lt;br /&gt;
| 0x32107&lt;br /&gt;
| Returns (u64) 0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= svc7B Backdoor =&lt;br /&gt;
This saves SVC-mode SP+LR on the user-mode stack, then sets the SVC-mode SP to the user-mode SP. This then calls the specified code in SVC-mode. Once the called code returns, this pops the saved SP+LR off the stack for restoring the SVC-mode SP, then returns from the svc7b handler. Note that this svc7b handler does not disable IRQs, if any IRQs/context-switches occur while the SVC-mode SP is set to the user-mode one here, the ARM11-kernel will crash(which hangs the whole ARM11-side system).&lt;br /&gt;
&lt;br /&gt;
= Kernel error-codes =&lt;br /&gt;
See [[Error codes]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
!  Error-code value&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x09401BFE&lt;br /&gt;
| Timeout occurred with svcWaitSynchronization*, when timeout is not ~0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC8601801&lt;br /&gt;
| No more unused/free synchronization objects left to use in a given object&#039;s linked list.  (KEvent, KMutex, KTimer, KSemaphore, KAddressArbiter, KThread)&lt;br /&gt;
|-&lt;br /&gt;
| 0xC8601802&lt;br /&gt;
| No more unused/free KSharedMemory objects left to use in the KSharedMemory linked list - out of blocks&lt;br /&gt;
|-&lt;br /&gt;
| 0xC8601809&lt;br /&gt;
| No more unused/free KSessions left to use in the KSession linked list - out of sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0xC860180A&lt;br /&gt;
| Not enough free memory available for memory allocation.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC920181A&lt;br /&gt;
| The session was closed by the other process..&lt;br /&gt;
|-&lt;br /&gt;
| 0xD0401834&lt;br /&gt;
| Max connections to port have been exceeded&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8609013&lt;br /&gt;
| Unknown, probably reslimit related?&lt;br /&gt;
|-&lt;br /&gt;
| 0xD88007FA&lt;br /&gt;
| Returned if no KObjectName object in the linked list  of such objects matches the port name provided to the svc. &lt;br /&gt;
|-&lt;br /&gt;
| 0xD8E007ED&lt;br /&gt;
| This indicates that a value is outside of the enum being used.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8E007F1&lt;br /&gt;
| This error indicates Misaligned address.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD8E007F7&lt;br /&gt;
| This error indicates that the input handle used with the SVC does not exist in the process handle-table, or that the handle kernel object type does not match the type used by the SVC.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD9000402&lt;br /&gt;
| Invalid memory permissions for input/output buffers, for svcStartInterProcessDma.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD9001814&lt;br /&gt;
| Failed unprivileged load or store - wrong permissions on memory&lt;br /&gt;
|-&lt;br /&gt;
| 0xD9001BF7&lt;br /&gt;
| This error is returned when the kernel retrieves a pointer to a kernel object, but the object type doesn&#039;t match the desired one.&lt;br /&gt;
|-&lt;br /&gt;
| 0xD92007EA&lt;br /&gt;
| This error is returned when a process attempts to use svcCreateMemoryBlock when the process memorytype is the application memorytype, and when addr=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0E01BF5&lt;br /&gt;
| This indicates an invalid address was used.&lt;br /&gt;
|-&lt;br /&gt;
| 0xF8C007F4&lt;br /&gt;
| Invalid type/param0-param3 input for svcKernelSetState. This is also returned for those syscalls marked as stubs.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KPort&amp;diff=17927</id>
		<title>KPort</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KPort&amp;diff=17927"/>
		<updated>2016-08-09T14:13:05Z</updated>

		<summary type="html">&lt;p&gt;Bond697: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KPort]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x48 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KServerPort]] vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| [[KServerPort]] Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of KServerSessions associated with this port&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of KServerSessions associated with this port&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| KPort* &lt;br /&gt;
| Pointer to parent KPort&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KClientPort]] vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| [[KClientPort]] Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| s16 &lt;br /&gt;
| Current connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| s16 &lt;br /&gt;
| Max connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| KPort*&lt;br /&gt;
| Pointer to the parent port object;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
	<entry>
		<id>https://www.3dbrew.org/w/index.php?title=KPort&amp;diff=17926</id>
		<title>KPort</title>
		<link rel="alternate" type="text/html" href="https://www.3dbrew.org/w/index.php?title=KPort&amp;diff=17926"/>
		<updated>2016-08-09T14:12:31Z</updated>

		<summary type="html">&lt;p&gt;Bond697: Undo revision 15689 by Neobrain (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Kernel objects]]&lt;br /&gt;
class [[KPort]] extends [[KAutoObject]];&lt;br /&gt;
&lt;br /&gt;
Size : 0x48 bytes&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  Offset&lt;br /&gt;
! Type&lt;br /&gt;
!  Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x0&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x4&lt;br /&gt;
| u32&lt;br /&gt;
| Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x8&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KServerPort]] vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0xC&lt;br /&gt;
| u32&lt;br /&gt;
| [[KServerPort]] Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x10&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x14&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x18&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for sessions&lt;br /&gt;
|-&lt;br /&gt;
| 0x20&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of KServerSessions associated with this port&lt;br /&gt;
|-&lt;br /&gt;
| 0x24&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of KServerSessions associated with this port&lt;br /&gt;
|-&lt;br /&gt;
| 0x28&lt;br /&gt;
| [[KPort]]* &lt;br /&gt;
| Pointer to parent KPort&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C&lt;br /&gt;
| u32&lt;br /&gt;
| Pointer to [[KClientPort]] vtable&lt;br /&gt;
|-&lt;br /&gt;
| 0x30&lt;br /&gt;
| u32&lt;br /&gt;
| [[KClientPort]] Reference count&lt;br /&gt;
|-&lt;br /&gt;
| 0x34&lt;br /&gt;
| u32&lt;br /&gt;
| Node count for threads&lt;br /&gt;
|-&lt;br /&gt;
| 0x38&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to first KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x3C&lt;br /&gt;
| [[KLinkedListNode]]*&lt;br /&gt;
| Pointer to last KLinkedListNode in the list of threads that sync with this object&lt;br /&gt;
|-&lt;br /&gt;
| 0x40&lt;br /&gt;
| s16 &lt;br /&gt;
| Current connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x42&lt;br /&gt;
| s16 &lt;br /&gt;
| Max connection count to port&lt;br /&gt;
|-&lt;br /&gt;
| 0x44&lt;br /&gt;
| [[KPort]]*&lt;br /&gt;
| Pointer to the parent port object;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Bond697</name></author>
	</entry>
</feed>