diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 2003-05-17 07:24:12 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 2003-05-17 07:24:12 +0000 |
commit | b52942b7d6a99049ebd81ecdae3fb0e89e2cd3f3 (patch) | |
tree | c4cac5ea80e2fae2674a89238a31fdd9c199fcf2 /sys | |
parent | 2259cf7cb2b3ea69b1a57d489a90512a92fb798d (diff) |
remove more ifdefs. Kill the VIS instruction pmap_{copy,zero}_page.
We haven't used them ever, they are hairy and if we want them back,
we'll readd them in some other file.
mdw@ henric@ ok
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/sparc64/sparc64/locore.s | 532 |
1 files changed, 1 insertions, 531 deletions
diff --git a/sys/arch/sparc64/sparc64/locore.s b/sys/arch/sparc64/sparc64/locore.s index 2f926a5fa17..e4bdf5d755a 100644 --- a/sys/arch/sparc64/sparc64/locore.s +++ b/sys/arch/sparc64/sparc64/locore.s @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.s,v 1.35 2003/05/17 07:09:08 art Exp $ */ +/* $OpenBSD: locore.s,v 1.36 2003/05/17 07:24:11 art Exp $ */ /* $NetBSD: locore.s,v 1.137 2001/08/13 06:10:10 jdolecek Exp $ */ /* @@ -58,9 +58,6 @@ #undef NO_VCACHE /* Map w/D$ disabled */ #undef TRAPS_USE_IG /* Use Interrupt Globals for all traps */ -#undef PMAP_FPSTATE /* Allow nesting of VIS pmap copy/zero */ -#define NEW_FPSTATE -#define PMAP_PHYS_PAGE /* Use phys ASIs for pmap copy/zero */ #undef DCACHE_BUG /* Flush D$ around ASI_PHYS accesses */ #undef NO_TSB /* Don't use TSB */ @@ -6217,227 +6214,6 @@ ENTRY(pmap_zero_phys) !! If we have 64-bit physical addresses (and we do now) !! we need to move the pointer from %o0:%o1 to %o0 !! -#ifdef DEBUG - set pmapdebug, %o4 - ld [%o4], %o4 - btst 0x80, %o4 ! PDB_COPY - bz,pt %icc, 3f - nop - save %sp, -CC64FSZ, %sp - set 2f, %o0 - call printf - mov %i0, %o1 -! ta 1; nop - restore - .data -2: .asciz "pmap_zero_page(%p)\n" - _ALIGN - .text -3: -#endif /* DEBUG */ -#ifndef PMAP_PHYS_PAGE -/* - * Here we use VIS instructions to do a block clear of a page. - * First we will tickle the FPU. If is was not not enabled this - * should cause a trap. The trap will check if they belong to a - * user process and if so save them and clear %fprs. It will - * also enable FP in PSTATE. - * - * We may now check the contents of %fprs. If either the upper - * or lower FPU is dirty then that means some other kernel routine - * is using the FPU and we should use the slow routine. - * - * Otherwise, we zero out the FP registers we'll use. Then we map - * the page into the special VA we use for this purpose. When we're - * done, we clear %fprs, so we'll know we can use it the nest time. - */ - sethi %hi(_C_LABEL(vmmap)), %o2 ! Get VA - ldx [%o2 + %lo(_C_LABEL(vmmap))], %o2 - brz,pn %o2, pmap_zero_phys ! Only do VIS if traps are enabled - or %o2, 0x020, %o3 ! Nucleus flush page - -#ifdef PMAP_FPSTATE -#ifndef NEW_FPSTATE - !! - !! This code will allow us to save the fpstate around this - !! routine and nest FP use in the kernel - !! - save %sp, -(CC64FSZ+FS_SIZE+BLOCK_SIZE), %sp ! Allocate an fpstate - add %sp, (CC64FSZ+BIAS+BLOCK_SIZE-1), %l0 ! Calculate pointer to fpstate - rd %fprs, %l1 ! Save old fprs so we can restore it later - andn %l0, BLOCK_ALIGN, %l0 ! And make it block aligned - call _C_LABEL(savefpstate) - mov %l0, %o0 - mov %i0, %o0 - mov %i2, %o2 - mov %i3, %o3 - wr %g0, FPRS_FEF, %fprs -#else /* NEW_FPSTATE */ /* NEW_FPSTATE */ -/* - * New version, new scheme: - * - * Here we use VIS instructions to do a block clear of a page. - * But before we can do that we need to save and enable the FPU. - * The last owner of the FPU registers is fpproc, and - * fpproc->p_md.md_fpstate is the current fpstate. If that's not - * null, call savefpstate() with it to store our current fp state. - * - * Next, allocate an aligned fpstate on the stack. We will properly - * nest calls on a particular stack so this should not be a problem. - * - * Now we grab either curproc (or if we're on the interrupt stack - * proc0). We stash its existing fpstate in a local register and - * put our new fpstate in curproc->p_md.md_fpstate. We point - * fpproc at curproc (or proc0) and enable the FPU. - * - * If we are ever preempted, our FPU state will be saved in our - * fpstate. Then, when we're resumed and we take an FPDISABLED - * trap, the trap handler will be able to fish our FPU state out - * of curproc (or proc0). - * - * On exiting this routine we undo the damage: restore the original - * pointer to curproc->p_md.md_fpstate, clear our fpproc, and disable - * the MMU. - * - */ - !! - !! This code will allow us to save the fpstate around this - !! routine and nest FP use in the kernel - !! - save %sp, -(CC64FSZ+FS_SIZE+BLOCK_SIZE), %sp ! Allocate an fpstate - sethi %hi(FPPROC), %l1 - ldx [%l1 + %lo(FPPROC)], %l2 ! Load fpproc - add %sp, (CC64FSZ+BIAS+BLOCK_SIZE-1), %l0 ! Calculate pointer to fpstate - brz,pt %l2, 1f ! fpproc == NULL? - andn %l0, BLOCK_ALIGN, %l0 ! And make it block aligned - ldx [%l2 + P_FPSTATE], %l3 - brz,pn %l3, 1f ! Make sure we have an fpstate - mov %l3, %o0 - call _C_LABEL(savefpstate) ! Save the old fpstate - set EINTSTACK-BIAS, %l4 ! Are we on intr stack? - cmp %sp, %l4 - bgu,pt %xcc, 1f - set INTSTACK-BIAS, %l4 - cmp %sp, %l4 - blu %xcc, 1f -0: - sethi %hi(_C_LABEL(proc0)), %l4 ! Yes, use proc0 - ba,pt %xcc, 2f - or %l4, %lo(_C_LABEL(proc0)), %l5 -1: - sethi %hi(CURPROC), %l4 ! Use curproc - ldx [%l4 + %lo(CURPROC)], %l5 - brz,pn %l5, 0b ! If curproc is NULL need to use proc0 -2: - mov %i0, %o0 - mov %i2, %o2 - ldx [%l5 + P_FPSTATE], %l6 ! Save old fpstate - mov %i3, %o3 - stx %l0, [%l5 + P_FPSTATE] ! Insert new fpstate - stx %l5, [%l1 + %lo(FPPROC)] ! Set new fpproc - wr %g0, FPRS_FEF, %fprs ! Enable FPU -#endif /* NEW_FPSTATE */ /* NEW_FPSTATE */ -#else /* PMAP_FPSTATE */ /* PMAP_FPSTATE */ - !! - !! Don't use FP regs if the kernel's already using them - !! - rd %fprs, %o1 ! Read old %fprs - sethi %hi(FPPROC), %o4 ! Also load fpproc - btst FPRS_DU|FPRS_DL, %o1 ! Is it dirty? - ldx [%o4 + %lo(FPPROC)], %o4 - bz,pt %icc, 1f ! No, use fpregs - bset FPRS_FEF, %o1 - brz,pn %o4, pmap_zero_phys ! No userland fpstate so do this the slow way -1: - wr %o1, 0, %fprs ! Enable the FPU -#endif /* PMAP_FPSTATE */ /* PMAP_FPSTATE */ - -#ifdef DEBUG - sethi %hi(paginuse), %o4 ! Prevent this from nesting - lduw [%o4 + %lo(paginuse)], %o5 - tst %o5 - tnz %icc, 1 - bnz,pn %icc, pmap_zero_phys - inc %o5 - stw %o5, [%o4 + %lo(paginuse)] -#endif /* DEBUG */ - - rdpr %pil, %g1 - wrpr %g0, PIL_HIGH, %pil ! s = splhigh() - - fzero %f0 ! Set up FPU - fzero %f2 - fzero %f4 - fzero %f6 - fzero %f8 - fzero %f10 - fzero %f12 - fzero %f14 - - stxa %o3, [%o3] ASI_DMMU_DEMAP ! Do the demap - membar #Sync ! No real reason for this XXXX - - sethi %hi(0x80000000), %o4 ! Setup TTE: - sllx %o4, 32, %o4 ! V = 1 - or %o4, TTE_CP|TTE_P|TTE_W|TTE_L, %o4 ! CP=1|P=1|W=1|L=1 - or %o4, %o0, %o4 ! PA - - mov TLB_TAG_ACCESS, %o5 - stxa %o2, [%o5] ASI_DMMU ! Store new address for mapping - membar #Sync ! No real reason for this XXXX - stxa %o4, [%g0] ASI_DMMU_DATA_IN ! Store TTE for new mapping - membar #Sync - - set NBPG, %o4 -1: - stda %f0, [%o2] ASI_BLK_COMMIT_P ! Store 64 bytes - add %o2, 64, %o2 - dec 128, %o4 - stda %f0, [%o2] ASI_BLK_COMMIT_P ! Store 64 bytes - brgz,pt %o4, 1b - add %o2, 64, %o2 - - membar #Sync ! Finish the operation - stxa %o3, [%o3] ASI_DMMU_DEMAP ! Demap the page again - membar #Sync ! No real reason for this XXXX - - - wrpr %g1, 0, %pil ! splx(s) - -#ifdef PMAP_FPSTATE -#ifndef NEW_FPSTATE - btst FPRS_DU|FPRS_DL, %l1 ! Anything to restore? - bz,pt %icc, 1f - nop - call _C_LABEL(loadfpstate) - mov %l0, %o0 -1: -! return ! Does this work? - wr %l1, 0, %fprs - ret - restore -#else /* NEW_FPSTATE */ /* NEW_FPSTATE */ -#ifdef DEBUG - ldx [%l1 + %lo(FPPROC)], %l7 - cmp %l7, %l5 - tnz 1 ! fpproc has changed! - ldx [%l5 + P_FPSTATE], %l7 - cmp %l7, %l0 - tnz 1 ! fpstate has changed! -#endif /* DEBUG */ - stx %g0, [%l1 + %lo(FPPROC)] ! Clear fpproc - stx %l6, [%l5 + P_FPSTATE] ! Restore old fpstate - wr %g0, 0, %fprs ! Disable FPU - ret - restore -#endif /* NEW_FPSTATE */ /* NEW_FPSTATE */ -#else /* PMAP_FPSTATE */ /* PMAP_FPSTATE */ - retl ! Any other mappings have inconsistent D$ - wr %g0, 0, %fprs ! Turn off FPU and mark as clean -#endif /* PMAP_FPSTATE */ /* PMAP_FPSTATE */ -pmap_zero_phys: -#endif /* PMAP_PHYS_PAGE */ /* PMAP_PHYS_PAGE */ -#if 1 set NBPG, %o2 ! Loop count clr %o1 1: @@ -6452,19 +6228,6 @@ pmap_zero_phys: flush %o3 retl nop -#else /* 1 */ - set NBPG-8, %o1 - add %o1, %o0, %o1 -1: - stxa %g0, [%o0] ASI_PHYS_CACHED - cmp %o0, %o1 - blt 1b - inc 8, %o0 - ba _C_LABEL(blast_vcache) ! Clear out D$ and return - nop - retl - nop -#endif /* 1 */ /* * pmap_copy_page(src, dst) * @@ -6484,294 +6247,6 @@ ENTRY(pmap_copy_phys) !! we need to move the pointer from %o0:%o1 to %o0 and !! %o2:%o3 to %o1 !! -#ifdef DEBUG - set pmapdebug, %o4 - ld [%o4], %o4 - btst 0x80, %o4 ! PDB_COPY - bz,pt %icc, 3f - nop - save %sp, -CC64FSZ, %sp - mov %i0, %o1 - set 2f, %o0 - call printf - mov %i1, %o2 -! ta 1; nop - restore - .data -2: .asciz "pmap_copy_page(%p,%p)\n" - _ALIGN - .text -3: -#endif /* DEBUG */ -#ifndef PMAP_PHYS_PAGE -/* - * Here we use VIS instructions to do a block clear of a page. - * First we zero out the FP registers we'll use. If they were - * dirty this should cause a trap to save them. - * Then we need to turn off interrupts so we don't have to deal - * with possibly saving or restoring state. Then we map the page - * into the special VA we use for this purpose. - * - * NB: THIS WILL ALWAYS ENABLE INTERRUPTS IN PSTATE ON EXIT - */ - sethi %hi(_C_LABEL(vmmap)), %o2 ! Get VA - ldx [%o2 + %lo(_C_LABEL(vmmap))], %o2 - brz,pn %o2, pmap_copy_phys - or %o2, 0x020, %o3 ! Nucleus flush page - -#ifdef PMAP_FPSTATE -#ifndef NEW_FPSTATE - !! - !! This code will allow us to save the fpstate around this - !! routine and nest FP use in the kernel - !! - save %sp, -(CC64FSZ+FS_SIZE+BLOCK_SIZE), %sp ! Allocate an fpstate - add %sp, (CC64FSZ+BIAS+BLOCK_SIZE-1), %l0 ! Calculate pointer to fpstate - andn %l0, BLOCK_ALIGN, %l0 ! And make it block aligned - rd %fprs, %l1 ! Save old fprs so we can restore it later - call _C_LABEL(savefpstate) - mov %l0, %o0 - mov %i0, %o0 - mov %i1, %o1 - mov %i2, %o2 - mov %i3, %o3 - wr %g0, FPRS_FEF, %fprs -#else /* NEW_FPSTATE */ /* NEW_FPSTATE */ -/* - * New version, new scheme: - * - * Here we use VIS instructions to do a block clear of a page. - * But before we can do that we need to save and enable the FPU. - * The last owner of the FPU registers is fpproc, and - * fpproc->p_md.md_fpstate is the current fpstate. If that's not - * null, call savefpstate() with it to store our current fp state. - * - * Next, allocate an aligned fpstate on the stack. We will properly - * nest calls on a particular stack so this should not be a problem. - * - * Now we grab either curproc (or if we're on the interrupt stack - * proc0). We stash its existing fpstate in a local register and - * put our new fpstate in curproc->p_md.md_fpstate. We point - * fpproc at curproc (or proc0) and enable the FPU. - * - * If we are ever preempted, our FPU state will be saved in our - * fpstate. Then, when we're resumed and we take an FPDISABLED - * trap, the trap handler will be able to fish our FPU state out - * of curproc (or proc0). - * - * On exiting this routine we undo the damage: restore the original - * pointer to curproc->p_md.md_fpstate, clear our fpproc, and disable - * the MMU. - * - */ - !! - !! This code will allow us to save the fpstate around this - !! routine and nest FP use in the kernel - !! - save %sp, -(CC64FSZ+FS_SIZE+BLOCK_SIZE), %sp ! Allocate an fpstate - sethi %hi(FPPROC), %l1 - ldx [%l1 + %lo(FPPROC)], %l2 ! Load fpproc - add %sp, (CC64FSZ+BIAS+BLOCK_SIZE-1), %l0 ! Calculate pointer to fpstate - brz,pt %l2, 1f ! fpproc == NULL? - andn %l0, BLOCK_ALIGN, %l0 ! And make it block aligned - ldx [%l2 + P_FPSTATE], %l3 - brz,pn %l3, 1f ! Make sure we have an fpstate - mov %l3, %o0 - call _C_LABEL(savefpstate) ! Save the old fpstate - set EINTSTACK-BIAS, %l4 ! Are we on intr stack? - cmp %sp, %l4 - bgu,pt %xcc, 1f - set INTSTACK-BIAS, %l4 - cmp %sp, %l4 - blu %xcc, 1f -0: - sethi %hi(_C_LABEL(proc0)), %l4 ! Yes, use proc0 - ba,pt %xcc, 2f - or %l4, %lo(_C_LABEL(proc0)), %l5 -1: - sethi %hi(CURPROC), %l4 ! No, use curproc - ldx [%l4 + %lo(CURPROC)], %l5 - brz,pn %l5, 0b ! If curproc is NULL need to use proc0 -2: - mov %i0, %o0 - mov %i2, %o2 - ldx [%l5 + P_FPSTATE], %l6 ! Save old fpstate - mov %i3, %o3 - stx %l0, [%l5 + P_FPSTATE] ! Insert new fpstate - stx %l5, [%l1 + %lo(FPPROC)] ! Set new fpproc - wr %g0, FPRS_FEF, %fprs ! Enable FPU -#endif /* NEW_FPSTATE */ /* NEW_FPSTATE */ -#else /* PMAP_FPSTATE */ /* PMAP_FPSTATE */ - !! - !! Don't use FP regs if the kernel's already using them - !! - rd %fprs, %o5 ! Read old %fprs - sethi %hi(FPPROC), %o4 ! Also load fpproc - btst FPRS_DU|FPRS_DL, %o5 ! Is it dirty? - ldx [%o4 + %lo(FPPROC)], %o4 - bz,pt %icc, 1f ! No, use fpregs - bset FPRS_FEF, %o5 - brz,pn %o4, pmap_copy_phys ! No userland fpstate so do this the slow way -1: - wr %o5, 0, %fprs ! Enable the FPU -#endif /* PMAP_FPSTATE */ /* PMAP_FPSTATE */ - -#ifdef DEBUG - sethi %hi(paginuse), %o4 ! Prevent this from nesting - lduw [%o4 + %lo(paginuse)], %o5 - tst %o5 - tnz %icc, 1 - bnz,pn %icc, pmap_copy_phys - inc %o5 - stw %o5, [%o4 + %lo(paginuse)] -#endif /* DEBUG */ /* DEBUG */ - - rdpr %pil, %g1 - wrpr %g0, 15, %pil ! s = splhigh(); - - stxa %o3, [%o3] ASI_DMMU_DEMAP ! Do the demap - sethi %hi(NBPG), %o4 - membar #Sync ! No real reason for this XXXX - add %o3, %o4, %o3 - stxa %o3, [%o3] ASI_DMMU_DEMAP ! Demap the next page too - membar #Sync ! No real reason for this XXXX - - sethi %hi(0x80000000), %o4 ! Setup TTE: - sllx %o4, 32, %o4 ! V = 1 - or %o4, TTE_CP|TTE_P|TTE_W|TTE_L, %o4 ! CP=1|P=1|W=1|L=1 - or %o4, %o0, %o0 ! TTE for source page XXX Should be RO - or %o4, %o1, %o1 ! TTE for dest page - - mov TLB_TAG_ACCESS, %o5 - stxa %o2, [%o5] ASI_DMMU ! Store new address for mapping - membar #Sync ! No real reason for this XXXX - stxa %o0, [%g0] ASI_DMMU_DATA_IN ! Store TTE for new mapping - membar #Sync - - sethi %hi(NBPG), %o4 - add %o2, %o4, %o4 ! %o4 point to dest - stxa %o4, [%o5] ASI_DMMU ! Store new address for mapping - membar #Sync ! No real reason for this XXXX - stxa %o1, [%g0] ASI_DMMU_DATA_IN ! Store TTE for new mapping - membar #Sync - - set NBPG, %o5 ! # bytes to move - - ldda [%o2] ASI_BLK_P, %f0 ! Load 1st bank - dec BLOCK_SIZE, %o5 - add %o2, BLOCK_SIZE, %o2 -1: - membar #StoreLoad - ldda [%o2] ASI_BLK_P, %f16 ! Load 2nd bank - dec BLOCK_SIZE, %o5 - add %o2, BLOCK_SIZE, %o2 - - membar #LoadStore - fmovd %f14, %f14 ! Sync 1st bank - stda %f0, [%o4] ASI_BLK_COMMIT_P ! Store 1st bank - brlez,pn %o5, 1f ! Finished? - add %o4, BLOCK_SIZE, %o4 - - membar #StoreLoad - ldda [%o2] ASI_BLK_P, %f0 ! Load 1st bank - dec BLOCK_SIZE, %o5 - add %o2, BLOCK_SIZE, %o2 - - membar #LoadStore - fmovd %f30, %f30 ! Sync 2nd bank - stda %f16, [%o4] ASI_BLK_COMMIT_P ! Store 2nd bank - brgz,pt %o5, 1b ! Finished? - add %o4, BLOCK_SIZE, %o4 - - !! - !! If we got here we have loaded bank 1 and stored bank 2 - !! - membar #Sync - fmovd %f14, %f14 ! Sync 1st bank - stda %f0, [%o4] ASI_BLK_COMMIT_P ! Store 1st bank - ba,pt %icc, 2f ! Finished? - add %o4, BLOCK_SIZE, %o4 - -1: - !! - !! If we got here we have loaded bank 2 and stored bank 1 - !! - membar #Sync - fmovd %f30, %f30 ! Sync 2nd bank - stda %f16, [%o4] ASI_BLK_COMMIT_P ! Store 2nd bank - add %o4, BLOCK_SIZE, %o4 - -2: - membar #Sync ! Finish the operation - stxa %o3, [%o3] ASI_DMMU_DEMAP ! Demap the dest page again - sethi %hi(NBPG), %o4 - membar #Sync ! No real reason for this XXXX - sub %o3, %o4, %o3 - stxa %o3, [%o3] ASI_DMMU_DEMAP ! Demap the source page again - membar #Sync ! No real reason for this XXXX - - - wrpr %g1, 0, %pil ! splx(s) - -#ifdef PMAP_FPSTATE -#ifndef NEW_FPSTATE - btst FPRS_DU|FPRS_DL, %l1 ! Anything to restore? - bz,pt %icc, 1f - nop - call _C_LABEL(loadfpstate) - mov %l0, %o0 -1: -! return ! Does this work? - wr %l1, 0, %fprs - ret - restore -#else /* NEW_FPSTATE */ /* NEW_FPSTATE */ -#ifdef DEBUG - ldx [%l1 + %lo(FPPROC)], %l7 - cmp %l7, %l5 - tnz 1 ! fpproc has changed! - ldx [%l5 + P_FPSTATE], %l7 - cmp %l7, %l0 - tnz 1 ! fpstate has changed! -#endif /* DEBUG */ /* DEBUG */ - stx %g0, [%l1 + %lo(FPPROC)] ! Clear fpproc - stx %l6, [%l5 + P_FPSTATE] ! Save old fpstate - wr %g0, 0, %fprs ! Disable FPU - ret - restore -#endif /* NEW_FPSTATE */ /* NEW_FPSTATE */ -#else /* PMAP_FPSTATE */ /* PMAP_FPSTATE */ - ba _C_LABEL(blast_vcache) - wr %g0, 0, %fprs ! Turn off FPU and mark as clean - - retl ! Any other mappings have inconsistent D$ - wr %g0, 0, %fprs ! Turn off FPU and mark as clean -#endif /* PMAP_FPSTATE */ /* PMAP_FPSTATE */ -pmap_copy_phys: -#endif /* PMAP_PHYS_PAGE */ /* PMAP_PHYS_PAGE */ -#if 0 - /* This is the short, slow, safe version that uses %g1 */ - - set NBPG, %o3 - clr %o2 - mov %g1, %o4 ! Save g1 -1: - DLFLUSH %o0,%g1 - ldxa [%o0] ASI_PHYS_CACHED, %g1 - inc 8, %o0 - stxa %g1, [%o1] ASI_PHYS_CACHED - inc 8, %o1 - - dec 8, %o3 - stxa %g0, [%o2] ASI_DCACHE_TAG! Blast away at the D$ - brnz,pt %o3, 1b - inc 16, %o2 - mov %o4, %g1 - sethi %hi(KERNBASE), %o5 - flush %o5 - retl - nop -#else /* 0 */ set NBPG, %o3 add %o3, %o0, %o3 mov %g1, %o4 ! Save g1 @@ -6784,13 +6259,8 @@ pmap_copy_phys: DLFLUSH %o1,%g1 bl,pt %icc, 1b ! We don't care about pages >4GB inc 8, %o1 -#if 0 - ba _C_LABEL(blast_vcache) ! Clear out D$ and return - mov %o4, %g1 ! Restore g1 -#endif /* 0 */ retl mov %o4, %g1 ! Restore g1 -#endif /* 0 */ /* * extern int64_t pseg_get(struct pmap* %o0, vaddr_t addr %o1); |