diff options
Diffstat (limited to 'Documentation/parisc')
-rw-r--r-- | Documentation/parisc/00-INDEX | 6 | ||||
-rw-r--r-- | Documentation/parisc/debugging | 39 | ||||
-rw-r--r-- | Documentation/parisc/registers | 121 |
3 files changed, 166 insertions, 0 deletions
diff --git a/Documentation/parisc/00-INDEX b/Documentation/parisc/00-INDEX new file mode 100644 index 000000000000..cbd060961f43 --- /dev/null +++ b/Documentation/parisc/00-INDEX | |||
@@ -0,0 +1,6 @@ | |||
1 | 00-INDEX | ||
2 | - this file. | ||
3 | debugging | ||
4 | - some debugging hints for real-mode code | ||
5 | registers | ||
6 | - current/planned usage of registers | ||
diff --git a/Documentation/parisc/debugging b/Documentation/parisc/debugging new file mode 100644 index 000000000000..d728594058e5 --- /dev/null +++ b/Documentation/parisc/debugging | |||
@@ -0,0 +1,39 @@ | |||
1 | okay, here are some hints for debugging the lower-level parts of | ||
2 | linux/parisc. | ||
3 | |||
4 | |||
5 | 1. Absolute addresses | ||
6 | |||
7 | A lot of the assembly code currently runs in real mode, which means | ||
8 | absolute addresses are used instead of virtual addresses as in the | ||
9 | rest of the kernel. To translate an absolute address to a virtual | ||
10 | address you can lookup in System.map, add __PAGE_OFFSET (0x10000000 | ||
11 | currently). | ||
12 | |||
13 | |||
14 | 2. HPMCs | ||
15 | |||
16 | When real-mode code tries to access non-existent memory, you'll get | ||
17 | an HPMC instead of a kernel oops. To debug an HPMC, try to find | ||
18 | the System Responder/Requestor addresses. The System Requestor | ||
19 | address should match (one of the) processor HPAs (high addresses in | ||
20 | the I/O range); the System Responder address is the address real-mode | ||
21 | code tried to access. | ||
22 | |||
23 | Typical values for the System Responder address are addresses larger | ||
24 | than __PAGE_OFFSET (0x10000000) which mean a virtual address didn't | ||
25 | get translated to a physical address before real-mode code tried to | ||
26 | access it. | ||
27 | |||
28 | |||
29 | 3. Q bit fun | ||
30 | |||
31 | Certain, very critical code has to clear the Q bit in the PSW. What | ||
32 | happens when the Q bit is cleared is the CPU does not update the | ||
33 | registers interruption handlers read to find out where the machine | ||
34 | was interrupted - so if you get an interruption between the instruction | ||
35 | that clears the Q bit and the RFI that sets it again you don't know | ||
36 | where exactly it happened. If you're lucky the IAOQ will point to the | ||
37 | instrucion that cleared the Q bit, if you're not it points anywhere | ||
38 | at all. Usually Q bit problems will show themselves in unexplainable | ||
39 | system hangs or running off the end of physical memory. | ||
diff --git a/Documentation/parisc/registers b/Documentation/parisc/registers new file mode 100644 index 000000000000..dd3caddd1ad9 --- /dev/null +++ b/Documentation/parisc/registers | |||
@@ -0,0 +1,121 @@ | |||
1 | Register Usage for Linux/PA-RISC | ||
2 | |||
3 | [ an asterisk is used for planned usage which is currently unimplemented ] | ||
4 | |||
5 | General Registers as specified by ABI | ||
6 | |||
7 | Control Registers | ||
8 | |||
9 | CR 0 (Recovery Counter) used for ptrace | ||
10 | CR 1-CR 7(undefined) unused | ||
11 | CR 8 (Protection ID) per-process value* | ||
12 | CR 9, 12, 13 (PIDS) unused | ||
13 | CR10 (CCR) lazy FPU saving* | ||
14 | CR11 as specified by ABI (SAR) | ||
15 | CR14 (interruption vector) initialized to fault_vector | ||
16 | CR15 (EIEM) initialized to all ones* | ||
17 | CR16 (Interval Timer) read for cycle count/write starts Interval Tmr | ||
18 | CR17-CR22 interruption parameters | ||
19 | CR19 Interrupt Instruction Register | ||
20 | CR20 Interrupt Space Register | ||
21 | CR21 Interrupt Offset Register | ||
22 | CR22 Interrupt PSW | ||
23 | CR23 (EIRR) read for pending interrupts/write clears bits | ||
24 | CR24 (TR 0) Kernel Space Page Directory Pointer | ||
25 | CR25 (TR 1) User Space Page Directory Pointer | ||
26 | CR26 (TR 2) not used | ||
27 | CR27 (TR 3) Thread descriptor pointer | ||
28 | CR28 (TR 4) not used | ||
29 | CR29 (TR 5) not used | ||
30 | CR30 (TR 6) current / 0 | ||
31 | CR31 (TR 7) Temporary register, used in various places | ||
32 | |||
33 | Space Registers (kernel mode) | ||
34 | |||
35 | SR0 temporary space register | ||
36 | SR4-SR7 set to 0 | ||
37 | SR1 temporary space register | ||
38 | SR2 kernel should not clobber this | ||
39 | SR3 used for userspace accesses (current process) | ||
40 | |||
41 | Space Registers (user mode) | ||
42 | |||
43 | SR0 temporary space register | ||
44 | SR1 temporary space register | ||
45 | SR2 holds space of linux gateway page | ||
46 | SR3 holds user address space value while in kernel | ||
47 | SR4-SR7 Defines short address space for user/kernel | ||
48 | |||
49 | |||
50 | Processor Status Word | ||
51 | |||
52 | W (64-bit addresses) 0 | ||
53 | E (Little-endian) 0 | ||
54 | S (Secure Interval Timer) 0 | ||
55 | T (Taken Branch Trap) 0 | ||
56 | H (Higher-privilege trap) 0 | ||
57 | L (Lower-privilege trap) 0 | ||
58 | N (Nullify next instruction) used by C code | ||
59 | X (Data memory break disable) 0 | ||
60 | B (Taken Branch) used by C code | ||
61 | C (code address translation) 1, 0 while executing real-mode code | ||
62 | V (divide step correction) used by C code | ||
63 | M (HPMC mask) 0, 1 while executing HPMC handler* | ||
64 | C/B (carry/borrow bits) used by C code | ||
65 | O (ordered references) 1* | ||
66 | F (performance monitor) 0 | ||
67 | R (Recovery Counter trap) 0 | ||
68 | Q (collect interruption state) 1 (0 in code directly preceding an rfi) | ||
69 | P (Protection Identifiers) 1* | ||
70 | D (Data address translation) 1, 0 while executing real-mode code | ||
71 | I (external interrupt mask) used by cli()/sti() macros | ||
72 | |||
73 | "Invisible" Registers | ||
74 | |||
75 | PSW default W value 0 | ||
76 | PSW default E value 0 | ||
77 | Shadow Registers used by interruption handler code | ||
78 | TOC enable bit 1 | ||
79 | |||
80 | ========================================================================= | ||
81 | Register usage notes, originally from John Marvin, with some additional | ||
82 | notes from Randolph Chung. | ||
83 | |||
84 | For the general registers: | ||
85 | |||
86 | r1,r2,r19-r26,r28,r29 & r31 can be used without saving them first. And of | ||
87 | course, you need to save them if you care about them, before calling | ||
88 | another procedure. Some of the above registers do have special meanings | ||
89 | that you should be aware of: | ||
90 | |||
91 | r1: The addil instruction is hardwired to place its result in r1, | ||
92 | so if you use that instruction be aware of that. | ||
93 | |||
94 | r2: This is the return pointer. In general you don't want to | ||
95 | use this, since you need the pointer to get back to your | ||
96 | caller. However, it is grouped with this set of registers | ||
97 | since the caller can't rely on the value being the same | ||
98 | when you return, i.e. you can copy r2 to another register | ||
99 | and return through that register after trashing r2, and | ||
100 | that should not cause a problem for the calling routine. | ||
101 | |||
102 | r19-r22: these are generally regarded as temporary registers. | ||
103 | Note that in 64 bit they are arg7-arg4. | ||
104 | |||
105 | r23-r26: these are arg3-arg0, i.e. you can use them if you | ||
106 | don't care about the values that were passed in anymore. | ||
107 | |||
108 | r28,r29: are ret0 and ret1. They are what you pass return values | ||
109 | in. r28 is the primary return. When returning small structures | ||
110 | r29 may also be used to pass data back to the caller. | ||
111 | |||
112 | r30: stack pointer | ||
113 | |||
114 | r31: the ble instruction puts the return pointer in here. | ||
115 | |||
116 | |||
117 | r3-r18,r27,r30 need to be saved and restored. r3-r18 are just | ||
118 | general purpose registers. r27 is the data pointer, and is | ||
119 | used to make references to global variables easier. r30 is | ||
120 | the stack pointer. | ||
121 | |||