uOFW
Reverse engineered PSP kernel 6.60.
Loading...
Searching...
No Matches
registers.h
1/* Copyright (C) 2011, 2012 The uOFW team
2 See the file COPYING for copying permission.
3*/
4
5#ifndef COMMON_INCLUDED
6# error "Only include common_imp.h or common_header.h!"
7#endif
8
9static inline int pspGetK0(void)
10{
11 int ret;
12 asm("move %0, $k0" : "=r" (ret));
13 return ret;
14}
15
16static inline int pspGetK1(void)
17{
18 int ret;
19 asm __volatile__("move %0, $k1" : "=r" (ret));
20 return ret;
21}
22
23static inline void pspSetK1(int k1)
24{
25 asm __volatile__("move $k1, %0" : : "r" (k1));
26}
27
28static inline int pspShiftK1(void)
29{
30 int oldK1 = pspGetK1();
31 pspSetK1(oldK1 << 11);
32 return oldK1;
33}
34
35static inline int pspK1PtrOk(const void *ptr)
36{
37 return (((int)ptr & pspGetK1()) >= 0);
38}
39
40/* Used for buffer with "dynamic" size (specified in the functions' arguments) */
41static inline int pspK1DynBufOk(const void *ptr, int size)
42{
43 return (((((int)ptr + size) | (int)ptr | size) & pspGetK1()) >= 0);
44}
45
46/* Used for buffer with "static" size (specified in the function using $k1, like the size of a structure) */
47static inline int pspK1StaBufOk(const void *ptr, int size)
48{
49 return (((((int)ptr + size) | (int)ptr) & pspGetK1()) >= 0);
50}
51
52static inline int pspK1IsUserMode(void)
53{
54 return ((pspGetK1() >> 31) != 0);
55}
56
57static inline int pspGetGp(void)
58{
59 int gp;
60 asm("move %0, $gp" : "=r" (gp));
61 return gp;
62}
63
64static inline int pspSetGp(int gp)
65{
66 int oldGp;
67 asm("move %0, $gp" : "=r" (oldGp));
68 asm("move $gp, %0" : : "r" (gp));
69 return oldGp;
70}
71
72static inline int pspGetSp(void)
73{
74 int sp;
75 asm("move %0, $sp" : "=r" (sp));
76 return sp;
77}
78
79static inline void pspSetSp(int sp)
80{
81 asm("move $sp, %0" : : "r" (sp));
82}
83
84static inline int pspGetRa(void)
85{
86 int ra;
87 asm("move %0, $ra" : "=r" (ra));
88 return ra;
89}
90