[parisc-linux] comments for BTLB setup (no TABs)
Frank Rowand
frowand@cup.hp.com
Mon, 25 Oct 1999 15:05:02 PDT
(Sorry all for the previous message, I use 4 column tabstops, the rest of
the world uses 8 column tabstops. I took the tabs out this time.)
Ryan,
You didn't do too bad for a first shot at reading pa-risc assembly, but
let me help you out a bit.
you wrote (among other things...):
> /* Why are we setting up the BTLB? */
> /* setup the BTLB. XXX: This assumes a unified BTLB */
> ldo 128(%sp),%sp
> stw %arg0, -128(%sp)
> stw %arg1, -124(%sp)
> stw %arg2, -120(%sp)
> stw %arg3, -116(%sp)
>
> /* What are we doing here? */
> ldo 0x388(%r0), %r1 ; What is the significance of 0x388?
> ; 0x388 (Page C-3) Start of MEM_PDC[32-63]
>
> ldwax %r0(%r1), %r1 ; ldwax does not exist in PA-RISC 2.0??
> ; Do we need this statement??
>
> ldo 18(%r0), %arg0 ; (Page C-4) MEM_PF_LEN (Checksum for MEM_POW_FAIL)
> ldo 1(%r0), %arg1 ; (Page C-4) MEM_POW_FAIL
> ldil L%0xc0000, %arg3 ; What this significance of this statement?
> ldo 0(%r0), %arg2 ; (Page C-4) 0
>
> ldil L%0x00000000, %r22 ; Start of PAGE0 Data format (C-3)?
> stw %r22, -52(%sp)
>
> ldo 4096(0), %r22 ; What is the significance of 0x4096?
> stw %r22, -56(%sp) ; End of the PAGE0 Data format (C-3)?
>
> ldil L%0x03000000, %r22 ; What is the significance of 0x03000000?
> stw %r22, -60(%sp)
>
> ldo 0(%r0), %r22 ; We already stored 0 once ... Why again?
> stw %r22, -64(%sp)
>
> ldil L%PA(.+12),%r2 ; Not sure what this is doing .....
> bv %r0(%r1) ; %r1 is set by ldil ...
> ldo R%PA(.+4)(%r2), %r2 ; No clue about this either ... (.+4) -> pc-relative
>
> /* Restore the origional values of %arg0 - %arg3 from the stack */
> ldw -128(%sp), %arg0
> ldw -124(%sp), %arg1
> ldw -120(%sp), %arg2
> ldw -116(%sp), %arg3
> ldo -128(%sp), %sp
First, some notes that will provide some context for the comments in the
code below:
PDCE_PROC is the entry point for calling PDC, see the third paragraph in the
IO ARS chapter "PDC Procedures". (This chapter is available at
http://devresource.hp.com/devresource/Docs/Refs/PDC32.pdf, which I got to
from http://devresource.hp.com/devresource/Docs/DocLibrary.html#archrefs.)
For the argument passing conventions for PDCE_PROC, see section 1.3 and 1.4
of the "PDC Procedures" chapter.
> ldo 18(%r0), %arg0 ; (Page C-4) MEM_PF_LEN (Checksum for MEM_POW_FAIL)
ldo is loading an address offset of %r0 (zero) + displacement of 18 into
%arg0. It is not loading data from the offset, it is loading the offset.
This is just putting a constant into the target register.
> ; ldwax does not exist in PA-RISC 2.0??
Some of the Mnemonics changes from 1.1 to 2.0, but the instruction is
still there. See Table J-2 in "PA-RISC 2.0 Architecture" by Jerry
Kane for how they renamed instructions.
Useful references for really understanding what's going on here are
the "PA-RISC 1.1 Architecture and Instruction Set Reference Manual"
(look for Block TLB in the index) and PDC_BLOCK_TLB in the "PDC
Procedures" chapter of the IO ARS.
I don't know where Ryan got appendix C (the puffin links seem stale),
but the PA 2.0 version is on the devresource page I mentioned above.
The 2.0 version is the same for the specific reference I make in the
comments below.
Then the same code with comments (and to the peanut gallery, no, I would
not normally comment this profusely), should answer a lot of your
confusion:
/* setup the BTLB. XXX: This assumes a unified BTLB */
ldo 128(30),30 ;create a stack frame
stw 26, -128(30)
stw 25, -124(30)
stw 24, -120(30)
stw 23, -116(30)
ldo 0x388(0), 1 ; IO ARS p.C-3, C-6, MEM_PDC
ldwax 0(1), 1 ; get address of PDCE_PROC()
ldo 18(0), 26 ; arg0 - PDC_BLOCK_TLB()
ldo 1(0), 25 ; arg1 - Insert entry
ldil L%0xc0000, 23 ; arg3 - virtual addr LSbits
; should this be %L0xc0000000 ??
ldo 0(0), 24 ; arg2 - virtual addr MSbits
ldil L%0x00000000, 22
stw 22, -52(30) ; arg4 - physical addr
ldo 4096(0), 22
stw 22, -56(30) ; arg5 - length in pages
ldil L%0x03000000, 22
stw 22, -60(30) ; arg6 - entry info
; (access rights & ID)
ldo 0(0), 22
stw 22, -64(30) ; arg7 - slot 0
ldil L%PA(.+12), 2
bv 0(1) ; PDCE_CALL(PDC_BLOCK_TLB, ...)
ldo R%PA(.+4)(2), 2 ; set return pointer to next
; instruction
ldo 0x388(0), 1
ldwax 0(1), 1
ldo 18(0), 26
ldo 1(0), 25
ldil L%0xc0000, 23
ldo 0(0), 24
ldil L%0x00000000, 22
stw 22, -52(30)
ldo 4096(0), 22
stw 22, -56(30)
ldil L%0x03000000, 22
stw 22, -60(30)
ldo 2(0), 22
stw 22, -64(30) ; arg7 - slot 2
ldil L%PA(.+12), 2
bv 0(1) ; PDCE_CALL(PDC_BLOCK_TLB, ...)
ldo R%PA(.+4)(2), 2
comb,<> 0,28, blargh ; if (return value <> 0) blargh()
ldw -128(30), 26
ldw -124(30), 25
ldw -120(30), 24
ldw -116(30), 23
ldo -128(30),30
-Frank Rowand