Back to home page

OSCL-LXR

 
 

    


0001 =================
0002 PA-RISC Debugging
0003 =================
0004 
0005 okay, here are some hints for debugging the lower-level parts of
0006 linux/parisc.
0007 
0008 
0009 1. Absolute addresses
0010 =====================
0011 
0012 A lot of the assembly code currently runs in real mode, which means
0013 absolute addresses are used instead of virtual addresses as in the
0014 rest of the kernel.  To translate an absolute address to a virtual
0015 address you can lookup in System.map, add __PAGE_OFFSET (0x10000000
0016 currently).
0017 
0018 
0019 2. HPMCs
0020 ========
0021 
0022 When real-mode code tries to access non-existent memory, you'll get
0023 an HPMC instead of a kernel oops.  To debug an HPMC, try to find
0024 the System Responder/Requestor addresses.  The System Requestor
0025 address should match (one of the) processor HPAs (high addresses in
0026 the I/O range); the System Responder address is the address real-mode
0027 code tried to access.
0028 
0029 Typical values for the System Responder address are addresses larger
0030 than __PAGE_OFFSET (0x10000000) which mean a virtual address didn't
0031 get translated to a physical address before real-mode code tried to
0032 access it.
0033 
0034 
0035 3. Q bit fun
0036 ============
0037 
0038 Certain, very critical code has to clear the Q bit in the PSW.  What
0039 happens when the Q bit is cleared is the CPU does not update the
0040 registers interruption handlers read to find out where the machine
0041 was interrupted - so if you get an interruption between the instruction
0042 that clears the Q bit and the RFI that sets it again you don't know
0043 where exactly it happened.  If you're lucky the IAOQ will point to the
0044 instruction that cleared the Q bit, if you're not it points anywhere
0045 at all.  Usually Q bit problems will show themselves in unexplainable
0046 system hangs or running off the end of physical memory.