[BACK]Return to locore.S CVS log [TXT][DIR] Up to [local] / sys / arch / hppa64 / hppa64

Annotation of sys/arch/hppa64/hppa64/locore.S, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: locore.S,v 1.6 2007/05/26 00:36:03 krw Exp $  */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2005 Michael Shalayeff
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Permission to use, copy, modify, and distribute this software for any
        !             8:  * purpose with or without fee is hereby granted, provided that the above
        !             9:  * copyright notice and this permission notice appear in all copies.
        !            10:  *
        !            11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            15:  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
        !            16:  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
        !            17:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            18:  */
        !            19:
        !            20:        .level  2.0w
        !            21:
        !            22: #include <sys/reboot.h>
        !            23: #include <machine/param.h>
        !            24: #include <machine/asm.h>
        !            25: #include <machine/psl.h>
        !            26: #include <machine/trap.h>
        !            27: #include <machine/iomod.h>
        !            28: #include <machine/pdc.h>
        !            29: #include <machine/frame.h>
        !            30: #include <machine/reg.h>
        !            31: #include <machine/pte.h>
        !            32: #include "assym.h"
        !            33:
        !            34:        .import __gp, data
        !            35:        .import pdc, data
        !            36:        .import boothowto, data
        !            37:        .import bootdev, data
        !            38:        .import esym, data
        !            39:        .import want_resched, data
        !            40:        .import proc0, data
        !            41:        .import proc0paddr, data
        !            42:
        !            43: #define        EMRG_STACKSIZE  (1*PAGE_SIZE)
        !            44: #define        FPEMU_STACKSIZE (1*PAGE_SIZE)
        !            45:
        !            46:        .data
        !            47:
        !            48:        .export netisr, data
        !            49:        .align  16
        !            50: netisr
        !            51:        .word   0
        !            52:        .align  16
        !            53: $kpsl
        !            54:        .word   PSL_W | PSL_Q | PSL_P | PSL_C | PSL_D | PSL_S | PSL_O
        !            55:        .export cpl, data
        !            56: cpl
        !            57:        .word   IPL_HIGH
        !            58:
        !            59:        BSS(pdc_stack, 8)       /* temp stack for PDC call */
        !            60:        BSS(emrg_stack, 8)      /* stack for HPMC/TOC/PWRF */
        !            61:        BSS(fpemu_stack, 8)     /* stack for FPU emulation */
        !            62:
        !            63:        .export fpu_enable, data
        !            64:        BSS(fpu_enable, 4)      /* bits to set in the %cr10 to enable fpu */
        !            65:        .export fpu_curpcb, data
        !            66:        BSS(fpu_curpcb, 8)      /* pcb of the fpu owner */
        !            67:        BSS(fpu_scratch, 16)    /* FPU scratch space, enough for a quad */
        !            68:
        !            69:        .text
        !            70:
        !            71: /*
        !            72:  * $start(pdc, boothowto, bootdev, esym)
        !            73:  */
        !            74:        .export $start, entry
        !            75: $start
        !            76:        rsm     (PSL_R|PSL_Q|PSL_I|PSL_P|PSL_D), %r0
        !            77:        nop ! nop ! nop ! nop
        !            78:
        !            79:        ldil    L%__gp, %dp
        !            80:        ldo     R%__gp(%dp), %dp
        !            81:
        !            82:        ldi     HPPA_PID_KERNEL, %r1
        !            83:        mtctl   %r1, %pidr1
        !            84:        mtctl   %r1, %pidr2
        !            85:        mtctl   %r0, %pidr3
        !            86:        mtctl   %r0, %pidr4
        !            87:
        !            88:        mtsp    %r0, %sr0
        !            89:        mtsp    %r0, %sr1
        !            90:        mtsp    %r0, %sr2
        !            91:        mtsp    %r0, %sr3
        !            92:        mtsp    %r0, %sr4
        !            93:        mtsp    %r0, %sr5
        !            94:        mtsp    %r0, %sr6
        !            95:        mtsp    %r0, %sr7
        !            96:
        !            97:        ldi     -1, %r1
        !            98:        mtctl   %r0, %eiem
        !            99:        mtctl   %r1, %eirr
        !           100:        mtctl   %r0, %cr10      /* ccr */
        !           101:
        !           102:        ldil    L%pdc, %r1
        !           103:        std     %arg0, R%pdc(%r1)
        !           104:        ldil    L%boothowto, %r1
        !           105:        stw     %arg1, R%boothowto(%r1)
        !           106:        ldil    L%bootdev, %r1
        !           107:        stw     %arg2, R%bootdev(%r1)
        !           108:        ldil    L%esym, %r1
        !           109:        std     %arg3, R%esym(%r1)
        !           110:
        !           111:        /* align esym */
        !           112:        ldo     PAGE_MASK(%arg3), %arg3
        !           113:        depw    %r0, 31, PAGE_SHIFT, %arg3
        !           114:
        !           115:        .import __kernel_pagedir, data
        !           116:        ldil    L%__kernel_pagedir, %r1
        !           117:        ldo     R%__kernel_pagedir(%r1), %r1
        !           118:        mtctl   %r1, %cr25      /* vtop */
        !           119:
        !           120:        /* setup kernel initial PIEs */
        !           121:        ldo     PAGE_SIZE(%r1), %r31
        !           122:        extrd,u %r31, 51, 32, %arg0
        !           123:        ldo     1(%arg0), %arg1
        !           124:        ldo     2(%arg0), %arg2
        !           125:        stw     %arg0, 0(%r1)
        !           126:        stw     %arg1, 4(%r1)
        !           127:                /* (VM_MIN_KERNEL_ADDRESS & PIE_MASK) >> PIE_SHIFT */
        !           128:        ldo     1(%arg2), %arg0
        !           129:        stw     %arg2, 0x20*4(%r1)
        !           130:        stw     %arg0, 0xffc(%r1)
        !           131:
        !           132:        .import kernel_ptes, data
        !           133:        ldil    L%kernel_ptes, %r1
        !           134:        ldo     R%kernel_ptes(%r1), %r1
        !           135:
        !           136:        ldd,ma  8(%r1), %r8
        !           137:        ldd,ma  8(%r1), %r9
        !           138:        ldd,ma  8(%r1), %r10
        !           139:        ldd,ma  8(%r1), %r11
        !           140:
        !           141:        /* fill eight pages at the same time */
        !           142:        copy    %arg3, %arg0
        !           143:        ldo     PAGE_SIZE(%arg0), %arg1
        !           144:        extrd,u %arg0, 51, 32, %r1
        !           145:        stw,ma  %r1, 4(%r31)
        !           146:        ldo     PAGE_SIZE(%arg1), %arg2
        !           147:        extrd,u %arg1, 51, 32, %r1
        !           148:        stw,ma  %r1, 4(%r31)
        !           149:        ldo     PAGE_SIZE(%arg2), %arg3
        !           150:        extrd,u %arg2, 51, 32, %r1
        !           151:        stw,ma  %r1, 4(%r31)
        !           152:        ldo     PAGE_SIZE(%arg3), arg4
        !           153:        extrd,u %arg3, 51, 32, %r1
        !           154:        stw,ma  %r1, 4(%r31)
        !           155:        ldo     PAGE_SIZE(arg4), arg5
        !           156:        extrd,u arg4, 51, 32, %r1
        !           157:        stw,ma  %r1, 4(%r31)
        !           158:        ldo     PAGE_SIZE(arg5), arg6
        !           159:        extrd,u arg5, 51, 32, %r1
        !           160:        stw,ma  %r1, 4(%r31)
        !           161:        ldo     PAGE_SIZE(arg6), arg7
        !           162:        extrd,u arg6, 51, 32, %r1
        !           163:        stw,ma  %r1, 4(%r31)
        !           164:        extrd,u arg7, 51, 32, %r1
        !           165:        stw,ma  %r1, 4(%r31)
        !           166:        ldi     PAGE_SIZE, %r1
        !           167: $start_set_ptes
        !           168:        std,ma,bc %r8, 8(%arg0)
        !           169:        std,ma,bc %r8, 8(%arg1)
        !           170:        std,ma,bc %r9, 8(%arg2)
        !           171:        std,ma,bc %r9, 8(%arg3)
        !           172:        std,ma,bc %r10, 8(arg4)
        !           173:        std,ma,bc %r10, 8(arg5)
        !           174:        std,ma,bc %r11, 8(arg6)
        !           175:        addib,>= -8, %r1, $start_set_ptes
        !           176:        std,ma,bc %r11, 8(arg7)
        !           177:
        !           178:        ldo     -8(arg7), %arg3
        !           179:
        !           180:        /* assuming size being page-aligned */
        !           181: #define        STACK_ALLOC(n,s)        \
        !           182:        ldil    L%n, %r1        ! \
        !           183:        ldil    L%s, %r31       ! \
        !           184:        std     %arg3, R%n(%r1) ! \
        !           185:        add     %arg3, %r31, %arg3
        !           186:
        !           187:        STACK_ALLOC(pdc_stack, PDC_STACKSIZE)
        !           188:        STACK_ALLOC(emrg_stack, EMRG_STACKSIZE)
        !           189:        STACK_ALLOC(fpemu_stack, FPEMU_STACKSIZE)
        !           190:
        !           191:        copy    %arg3, %arg0
        !           192:        ldi     PAGE_SIZE+TRAPFRAME_SIZEOF, %r1
        !           193: $start_zero_tf
        !           194:        std,ma,bc %r0, 8(%arg0)
        !           195:        addib,>= -16, %r1, $start_zero_tf
        !           196:        std,ma,bc %r0, 8(%arg0)
        !           197:
        !           198:        /* setup proc0/user0 */
        !           199:        ldil    L%(USPACE+PAGE_SIZE), %arg0
        !           200:        add     %arg0, %arg3, %arg0
        !           201:        ldil    L%proc0paddr, %r1
        !           202:        std     %arg3, R%proc0paddr(%r1)
        !           203:
        !           204:        ldo     PAGE_SIZE(%arg3), %sp
        !           205:        mtctl   %arg3, %cr30
        !           206:        std     %r0, U_PCB+PCB_ONFAULT(%arg3)
        !           207:        std     %r0, U_PCB+PCB_SPACE(%arg3)
        !           208:        std     %arg3, U_PCB+PCB_UVA(%arg3)
        !           209:
        !           210:        ldil    L%proc0, %r1
        !           211:        ldo     R%proc0(%r1), %r1
        !           212:        ldo     -TRAPFRAME_SIZEOF(%sp), %arg2
        !           213:        std     %arg3, P_ADDR(%r1)
        !           214:        std     %arg2, P_MD_REGS(%r1)
        !           215:
        !           216:        ldil    TFF_LAST, %r1
        !           217:        std     %r1, TF_FLAGS(%arg2)
        !           218:        std     %arg3, TF_CR30(%arg2)
        !           219:
        !           220:        ldil    L%$kpsl, %r1
        !           221:        ldw     R%$kpsl(%r1), arg7
        !           222:        ldil    L%$start_virt, %r31
        !           223:        ldo     R%$start_virt(%r31), %r31
        !           224:        ldil    L%$ivaaddr, %r1
        !           225:        ldo     R%$ivaaddr(%r1), %r1
        !           226:        mtctl   %r1, %iva
        !           227:        mtctl   %r0, %pcsq
        !           228:        mtctl   %r0, %pcsq
        !           229:        mtctl   %r31, %pcoq
        !           230:        ldo     4(%r31), %r31
        !           231:        mtctl   %r31, %pcoq
        !           232:        mtctl   arg7, %ipsw
        !           233:        rfi
        !           234:        nop
        !           235:
        !           236: $start_virt
        !           237:        copy    %arg0, %r5
        !           238:        copy    %sp, %r3
        !           239:        std,ma  %r0, HPPA_FRAME_SIZE(%sp)
        !           240:        .call
        !           241:        b,l     hppa_init, %rp
        !           242:        ldo     -16(%sp), ap
        !           243:
        !           244: $start_callmain
        !           245:        .import main, code
        !           246:        .call
        !           247:        b,l     main, %rp
        !           248:        ldo     -TRAPFRAME_SIZEOF(%arg0), %r5
        !           249:        .size   $start, .-$start
        !           250:
        !           251: /* int
        !           252:  * pdc_call(func, pdc_flag, ...)
        !           253:  *      iodcio_t func;
        !           254:  *      int pdc_flag;
        !           255:  */
        !           256: ENTRY(pdc_call,160)
        !           257:        std     %rp, HPPA_FRAME_RP(%sp)
        !           258:        std     %sp, HPPA_FRAME_PSP(%sp)
        !           259:        copy    %r3, %r31
        !           260:        copy    %sp, %ret0
        !           261:
        !           262:        ldil    L%pdc_stack, %r1
        !           263:        ldd     R%pdc_stack(%r1), %r3
        !           264:        copy    %r3, %sp
        !           265:        std,ma  %r31, 32+12*4+12*8(%sp) /* old frame+args+save(64) */
        !           266:
        !           267:        mfctl   %eiem, %r1
        !           268:        mtctl   %r0, %eiem
        !           269:        std     %r1, 1*8(%r3)
        !           270:
        !           271:        copy    %arg0, %r31
        !           272:        /* copy arguments */
        !           273:        copy    %arg2, %arg0
        !           274:        copy    %arg3, %arg1
        !           275:        copy    arg4, %arg2
        !           276:        copy    arg5, %arg3
        !           277:
        !           278:        ldd     0*8(ap), arg4
        !           279:        ldd     1*8(ap), arg5
        !           280:        stw     arg6, -32-(4+1)*4(%sp)
        !           281:        stw     arg7, -32-(5+1)*4(%sp)
        !           282:        stw     arg4, -32-(6+1)*4(%sp)
        !           283:        stw     arg5, -32-(7+1)*4(%sp)
        !           284:        ldd     2*8(ap), arg4
        !           285:        ldd     3*8(ap), arg5
        !           286:        ldd     4*8(ap), arg6
        !           287:        ldd     5*8(ap), arg7
        !           288:        stw     arg4, -32-(8+1)*4(%sp)
        !           289:        stw     arg5, -32-(9+1)*4(%sp)
        !           290:        stw     arg6, -32-(10+1)*4(%sp)
        !           291:        stw     arg7, -32-(11+1)*4(%sp)
        !           292:
        !           293:        mfctl   %cr24, arg4
        !           294:        mfctl   %cr25, arg5
        !           295:        mfctl   %cr26, arg6
        !           296:        mfctl   %cr27, arg7
        !           297:        std     arg4, 2*8(%r3)
        !           298:        std     arg5, 3*8(%r3)
        !           299:        std     arg6, 4*8(%r3)
        !           300:        std     arg7, 5*8(%r3)
        !           301:        mfctl   %cr28, arg4
        !           302:        mfctl   %cr29, arg5
        !           303:        mfctl   %cr30, arg6
        !           304:        mfctl   %cr31, arg7
        !           305:        std     arg4, 6*8(%r3)
        !           306:        std     arg5, 7*8(%r3)
        !           307:        std     arg6, 8*8(%r3)
        !           308:        std     arg7, 9*8(%r3)
        !           309:
        !           310:        copy    %arg0, %ret1
        !           311:        std     %ret0, 11*8(%r3)        /* old %sp */
        !           312:        ldi     PSL_Q, %arg0
        !           313:        break   HPPA_BREAK_KERNEL, HPPA_BREAK_SET_PSW
        !           314:        copy    %ret1, %arg0
        !           315:
        !           316:        .call
        !           317:        blr     %r0, %rp
        !           318:        bv,n    (%r31)
        !           319:        nop
        !           320:
        !           321:        /* load temp control regs */
        !           322:        ldd     2*8(%r3), arg4
        !           323:        ldd     3*8(%r3), arg5
        !           324:        ldd     4*8(%r3), arg6
        !           325:        ldd     5*8(%r3), arg7
        !           326:        mtctl   arg4, %cr24
        !           327:        mtctl   arg5, %cr25
        !           328:        mtctl   arg6, %cr26
        !           329:        mtctl   arg7, %cr27
        !           330:        ldd     6*8(%r3), arg4
        !           331:        ldd     7*8(%r3), arg5
        !           332:        ldd     8*8(%r3), arg6
        !           333:        ldd     9*8(%r3), arg7
        !           334:        mtctl   arg4, %cr28
        !           335:        mtctl   arg5, %cr29
        !           336:        mtctl   arg6, %cr30
        !           337:        mtctl   arg7, %cr31
        !           338:
        !           339:        ldil    L%$kpsl, %r1
        !           340:        ldw     R%$kpsl(%r1), %arg0
        !           341:        copy    %ret0, %arg1
        !           342:        break   HPPA_BREAK_KERNEL, HPPA_BREAK_SET_PSW
        !           343:        copy    %arg1, %ret0
        !           344:
        !           345:        ldd     1*8(%r3), arg5  /* %eiem */
        !           346:        ldd     11*8(%r3), %sp
        !           347:        ldd     HPPA_FRAME_RP(%sp), %rp
        !           348:        ldd     0(%r3), %r3
        !           349:
        !           350:        bv      %r0(%rp)
        !           351:        mtctl   arg5, %eiem
        !           352: EXIT(pdc_call)
        !           353:
        !           354: /*
        !           355:  * the whole syscall() glue is fit on one page
        !           356:  * both enter and return paths
        !           357:  */
        !           358: /* TODO has to be mapped w/a special perms */
        !           359:        .align  PAGE_SIZE
        !           360:        .export gateway_page, entry
        !           361: gateway_page
        !           362:        nop
        !           363:        gate,n  $bsd_syscall,%r0
        !           364:        nop
        !           365:
        !           366:        .align  256
        !           367: #ifdef COMPAT_LINUX
        !           368:        gate,n  $linux_syscall, %r0     /* TODO linux syscall fix */
        !           369:        nop
        !           370:
        !           371: $linux_syscall
        !           372:        nop
        !           373: #endif
        !           374:
        !           375: $bsd_syscall
        !           376:        mfctl   %eiem, %r1
        !           377:        mtctl   %r0, %eiem
        !           378:        mtsp    %r0, %sr1
        !           379:        mfctl   %pidr1, %ret0
        !           380:        ldi     HPPA_PID_KERNEL, %ret0
        !           381:        mtctl   %ret0, %pidr1
        !           382:
        !           383: /* TODO prepare for syscall() */
        !           384:
        !           385:        .import syscall,code
        !           386:        b,l     syscall, %rp
        !           387:        nop
        !           388:
        !           389:        mfctl   %cr24, %arg1
        !           390:        ldd     CI_CURPROC(%arg1), %r1
        !           391:        ldw     P_MD_REGS(%r1), %arg0
        !           392:
        !           393: $syscall_return
        !           394:        /* %arg0 -- trapframe */
        !           395:
        !           396:        mtctl   %r0, %eiem
        !           397:
        !           398:        ldo     8(%arg0), %r31  /* flags */
        !           399:
        !           400:        rfi
        !           401:        nop
        !           402:        .size   $bsd_syscall, .-$bsd_syscall
        !           403:        .size   $syscall_return, .-$syscall_return
        !           404:
        !           405: gateway_end
        !           406:        . = gateway_page + PAGE_SIZE
        !           407:        .size   gateway_page, .-gateway_page
        !           408:
        !           409: /*
        !           410:  * interrupt vector table
        !           411:  */
        !           412: #define        TLABEL(name)    $trap$name
        !           413: #define        TRAP(name,num,pre) \
        !           414:        .export TLABEL(name)$num, entry ! \
        !           415:        .label  TLABEL(name)$num        ! \
        !           416:        pre                             ! \
        !           417:        .call                           ! \
        !           418:        .import TLABEL(name), code      ! \
        !           419:        b       TLABEL(name)            ! \
        !           420:        ldi     num, %r1                ! \
        !           421:        .align  32
        !           422:
        !           423: #define        ITLBPRE                         \
        !           424:        mfctl   %pcsq, %r8              ! \
        !           425:        mfctl   %pcoq, %r9              ! \
        !           426:        extrd,u %r8, 63, SID_SHIFT, %r1 ! \
        !           427:        depd    %r1, 31, SID_SHIFT, %r9 ! \
        !           428:        depd    %r0, 63, SID_SHIFT, %r8
        !           429:
        !           430: #define        DTLBPRE                         \
        !           431:        mfctl   %isr, %r8               ! \
        !           432:        mfctl   %ior, %r9               ! \
        !           433:        extrd,u %r8, 63, SID_SHIFT, %r1 ! \
        !           434:        depd    %r1, 31, SID_SHIFT, %r9 ! \
        !           435:        depd    %r0, 63, SID_SHIFT, %r8
        !           436:
        !           437: #define        HPMCPRE nop
        !           438:
        !           439: #define        BRKPRE                          \
        !           440:        mfctl   %pcoq, %r8
        !           441:
        !           442:        .align PAGE_SIZE        /* already */
        !           443:        .export $ivaaddr, entry
        !           444:        .export hpmc_v, entry
        !           445: $ivaaddr
        !           446:        TRAP(all,T_NONEXIST,)           /*  0. invalid interrupt vector */
        !           447: hpmc_v
        !           448:        TRAP(hpmc,T_HPMC,HPMCPRE)       /*  1. high priority machine check */
        !           449:        TRAP(pfr,T_POWERFAIL,)          /*  2. power failure */
        !           450:        TRAP(all,T_RECOVERY,)           /*  3. recovery counter trap */
        !           451:        TRAP(all,T_INTERRUPT,)          /*  4. external interrupt */
        !           452:        TRAP(all,T_LPMC,)               /*  5. low-priority machine check */
        !           453:        TRAP(itlb,T_ITLBMISS,ITLBPRE)   /*  6. instruction TLB miss fault */
        !           454:        TRAP(all,T_IPROT,)              /*  7. instruction protection trap */
        !           455:        TRAP(all,T_ILLEGAL,)            /*  8. Illegal instruction trap */
        !           456:        TRAP(ibrk,T_IBREAK,BRKPRE)      /*  9. break instruction trap */
        !           457:        TRAP(all,T_PRIV_OP,)            /* 10. privileged operation trap */
        !           458:        TRAP(all,T_PRIV_REG,)           /* 11. privileged register trap */
        !           459:        TRAP(all,T_OVERFLOW,)           /* 12. overflow trap */
        !           460:        TRAP(all,T_CONDITION,)          /* 13. conditional trap */
        !           461:        TRAP(excpt,T_EXCEPTION,)        /* 14. assist exception trap */
        !           462:        TRAP(dtlb,T_DTLBMISS,DTLBPRE)   /* 15. data TLB miss fault */
        !           463:        TRAP(itlbna,T_ITLBMISSNA,DTLBPRE)/* 16. ITLB non-access miss fault */
        !           464:        TRAP(dtlbna,T_DTLBMISSNA,DTLBPRE)/* 17. DTLB non-access miss fault */
        !           465:        TRAP(all,T_DPROT,)              /* 18. data protection trap
        !           466:                                              unaligned data reference trap */
        !           467:        TRAP(all,T_DBREAK,)             /* 19. data break trap */
        !           468:        TRAP(tlbd,T_TLB_DIRTY,DTLBPRE)  /* 20. TLB dirty bit trap */
        !           469:        TRAP(all,T_PAGEREF,)            /* 21. page reference trap */
        !           470:        TRAP(emu,T_EMULATION,)          /* 22. assist emulation trap */
        !           471:        TRAP(all,T_HIGHERPL,)           /* 23. higher-privelege transfer trap*/
        !           472:        TRAP(all,T_LOWERPL,)            /* 24. lower-privilege transfer trap */
        !           473:        TRAP(all,T_TAKENBR,)            /* 25. taken branch trap */
        !           474:        TRAP(all,T_DATACC,)             /* 26. data access rights trap */
        !           475:        TRAP(all,T_DATAPID,)            /* 27. data protection ID trap */
        !           476:        TRAP(all,T_DATALIGN,)           /* 28. unaligned data ref trap */
        !           477:        TRAP(all,29,)
        !           478:        TRAP(all,30,)
        !           479:        TRAP(all,31,)
        !           480:        TRAP(all,32,)
        !           481:        TRAP(all,33,)
        !           482:        TRAP(all,34,)
        !           483:        TRAP(all,35,)
        !           484:        TRAP(all,36,)
        !           485:        TRAP(all,37,)
        !           486:        TRAP(all,38,)
        !           487:        TRAP(all,39,)
        !           488:        TRAP(all,40,)
        !           489:        TRAP(all,41,)
        !           490:        TRAP(all,42,)
        !           491:        TRAP(all,43,)
        !           492:        TRAP(all,44,)
        !           493:        TRAP(all,45,)
        !           494:        TRAP(all,46,)
        !           495:        TRAP(all,47,)
        !           496:        TRAP(all,48,)
        !           497:        TRAP(all,49,)
        !           498:        TRAP(all,50,)
        !           499:        TRAP(all,51,)
        !           500:        TRAP(all,52,)
        !           501:        TRAP(all,53,)
        !           502:        TRAP(all,54,)
        !           503:        TRAP(all,55,)
        !           504:        TRAP(all,56,)
        !           505:        TRAP(all,57,)
        !           506:        TRAP(all,58,)
        !           507:        TRAP(all,59,)
        !           508:        TRAP(all,60,)
        !           509:        TRAP(all,61,)
        !           510:        TRAP(all,62,)
        !           511:        TRAP(all,63,)
        !           512:                                        /* 64 */
        !           513:
        !           514: /*
        !           515:  * High Priority Machine Check Interrupt
        !           516:  */
        !           517:        .export TLABEL(hpmc), entry
        !           518: ENTRY(TLABEL(hpmc),0)
        !           519:        rfi
        !           520:        nop
        !           521:
        !           522: hpmc_never_dies
        !           523:        b       hpmc_never_dies
        !           524:        nop
        !           525: EXIT(TLABEL(hpmc))
        !           526:
        !           527: /*
        !           528:  * transfer of control handler
        !           529:  */
        !           530: ENTRY(hppa_toc,0)
        !           531:        rfi
        !           532:        nop
        !           533:
        !           534: ALTENTRY(hppa_toc_end)
        !           535:        .word   0
        !           536: EXIT(hppa_toc)
        !           537:
        !           538: /*
        !           539:  * power fail recovery handler
        !           540:  */
        !           541: ENTRY(TLABEL(pfr),0)
        !           542:        rfi
        !           543:        nop
        !           544:
        !           545: ALTENTRY(hppa_pfr_end)
        !           546:        .word   0
        !           547: EXIT(hppa_pfr)
        !           548:
        !           549: /*
        !           550:  * system breaks
        !           551:  */
        !           552:        .export TLABEL(ibrk), entry
        !           553: ENTRY(TLABEL(ibrk),0)
        !           554:        /* If called by a user process then always pass it to trap() */
        !           555:        extrd,u,*= %r8, 63, 2, %r0
        !           556:        b,n     TLABEL(all)
        !           557:
        !           558:        /* don't accept breaks from data segments */
        !           559:        .import etext, code
        !           560:        ldil    L%etext, %r9
        !           561:        ldo     R%etext(%r9), %r9
        !           562:        cmpb,*>>=,n %r8, %r9, TLABEL(all)
        !           563:
        !           564:        mfctl   %iir, %r8
        !           565:        extrd,u,*= %r8, 63, 5, %r0
        !           566:        b,n     TLABEL(all)
        !           567:
        !           568:        /* now process all those `break' calls we make */
        !           569:        extrd,u %r8, 50, 13, %r9
        !           570:        comib,=,n HPPA_BREAK_GET_PSW, %r9, $ibrk_getpsw
        !           571:        comib,=,n HPPA_BREAK_SET_PSW, %r9, $ibrk_setpsw
        !           572:
        !           573:        b       TLABEL(all)
        !           574:        nop
        !           575:
        !           576: $ibrk_getpsw
        !           577:        b       $ibrk_exit
        !           578:        mfctl   %ipsw, %ret0
        !           579:
        !           580: $ibrk_setpsw
        !           581:        mfctl   %ipsw, %ret0
        !           582:        b       $ibrk_exit
        !           583:        mtctl   %arg0, %ipsw
        !           584:
        !           585:        /* insert other fast breaks here */
        !           586:        nop ! nop
        !           587:
        !           588: $ibrk_exit
        !           589:        /* skip the break */
        !           590:        mtctl   %r0, %pcoq
        !           591:        mfctl   %pcoq, %r9
        !           592:        mtctl   %r9, %pcoq
        !           593:        ldo     4(%r9), %r9
        !           594:        mtctl   %r9, %pcoq
        !           595:
        !           596:        rfi,r
        !           597:        nop
        !           598: EXIT(TLABEL(ibrk))
        !           599:
        !           600:        .export TLABEL(all), entry
        !           601: ENTRY(TLABEL(all),0)
        !           602:        /* %r1 still has trap type */
        !           603:        mfctl   %ipsw, %r9
        !           604:        mtctl   %r9, %cr31
        !           605:
        !           606:        mtsp    %r0, %sr3
        !           607:        ldi     HPPA_PID_KERNEL, %r9
        !           608:        mtctl   %r9, %pidr3
        !           609:
        !           610:        mfctl   %isr, %r8
        !           611:        mfctl   %ior, %r9
        !           612:        extrd,u %r8, 63, SID_SHIFT, %r16
        !           613:        depd    %r16, 31, SID_SHIFT, %r9
        !           614:        depd    %r0, 63, SID_SHIFT, %r8
        !           615:        mtsp    %r8, %sr6
        !           616:        mtctl   %r9, %cr27
        !           617:
        !           618:        mfctl   %pcsq, %r24
        !           619:        mtctl   %r0, %pcsq
        !           620:        mfctl   %pcsq, %r25
        !           621:        mtctl   %r0, %pcsq
        !           622:        mtsp    %r24, %sr4
        !           623:        mtsp    %r25, %sr5
        !           624:
        !           625:        /* TODO fix pcsq:pcoq split */
        !           626:        ldil    L%TLABEL(all_virt), %r9
        !           627:        ldo     R%TLABEL(all_virt)(%r9), %r9
        !           628:        mfctl   %pcoq, %r24
        !           629:        mtctl   %r9, %pcoq
        !           630:        mfctl   %pcoq, %r25
        !           631:        ldo     4(%r9), %r9
        !           632:        mtctl   %r24, %cr28
        !           633:        mtctl   %r9, %pcoq
        !           634:        mtctl   %r25, %cr29
        !           635:
        !           636:        ldil    L%$kpsl, %r9
        !           637:        ldw     R%$kpsl(%r9), %r9
        !           638:        mtctl   %r9, %ipsw
        !           639:
        !           640:        mfctl   %cr30, %r9
        !           641:
        !           642:        mfsp    %sr0, %r8
        !           643:        extrd,u,*<> %r24, 63, 2, %r0    /* still pcoq head */
        !           644:        cmpb,*= %r0, %r8, TLABEL(all_kern)
        !           645:        copy    %sp, %r17
        !           646:
        !           647:        depdi   1, T_USER_POS, 1, %r1
        !           648:        depdi   1, TFF_LAST_POS, 1, %r1
        !           649:        ldd     U_PCB+PCB_UVA(%r9), %sp
        !           650:        ldo     PAGE_SIZE-TRAPFRAME_SIZEOF(%sp), %sp
        !           651:
        !           652: TLABEL(all_kern)
        !           653:        ldo     127(%sp), %sp
        !           654:        depdi   0, 63, 7, %sp
        !           655:
        !           656:        ldo     TF_SP(%sp), %r8
        !           657:        std     %r17, 0(%r8)
        !           658:        fdc     %r0(%r8)
        !           659:
        !           660:        mfctl   %iir, %r16
        !           661:        ldo     TF_IIR(%sp), %r8
        !           662:        std     %r16, 0(%r8)
        !           663:        fdc     %r0(%r8)
        !           664:
        !           665:        mtctl   %r1, %cr26
        !           666:        rfi,r
        !           667:        nop ! nop ! nop ! nop ! nop ! nop ! nop ! nop
        !           668: TLABEL(all_virt)
        !           669:
        !           670:        ldo     8(%sp), %sp     /* space for flags */
        !           671:        std,ma  %r1, 8(%sr3,%sp)
        !           672:        mfctl   %cr26, %r1              /* sar */
        !           673:        std     %r1, -16(%sr3,%sp)
        !           674:        std,ma  %rp, 8(%sr3,%sp)
        !           675:        std,ma  %r3, 8(%sr3,%sp)
        !           676:        std,ma  %r4, 8(%sr3,%sp)
        !           677:        std,ma  %r5, 8(%sr3,%sp)
        !           678:        std,ma  %r6, 8(%sr3,%sp)
        !           679:        std,ma  %r7, 8(%sr3,%sp)
        !           680:        std,ma  %r8, 8(%sr3,%sp)
        !           681:        std,ma  %r9, 8(%sr3,%sp)
        !           682:        std,ma  %r10, 8(%sr3,%sp)
        !           683:        std,ma  %r11, 8(%sr3,%sp)
        !           684:        std,ma  %r12, 8(%sr3,%sp)
        !           685:        std,ma  %r13, 8(%sr3,%sp)
        !           686:        std,ma  %r14, 8(%sr3,%sp)
        !           687:        std,ma  %r15, 8(%sr3,%sp)
        !           688:        std,ma  %r16, 8(%sr3,%sp)
        !           689:        std,ma  %r17, 8(%sr3,%sp)
        !           690:        std,ma  %r18, 8(%sr3,%sp)
        !           691:        std,ma  %r19, 8(%sr3,%sp)
        !           692:        std,ma  %r20, 8(%sr3,%sp)
        !           693:        std,ma  %r21, 8(%sr3,%sp)
        !           694:        std,ma  %r22, 8(%sr3,%sp)
        !           695:        std,ma  %r23, 8(%sr3,%sp)
        !           696:        std,ma  %r24, 8(%sr3,%sp)
        !           697:        std,ma  %r25, 8(%sr3,%sp)
        !           698:        std,ma  %r26, 8(%sr3,%sp)
        !           699:        std,ma  %r27, 8(%sr3,%sp)
        !           700:        std,ma  %r28, 8(%sr3,%sp)
        !           701:        std,ma  %r29, 8(%sr3,%sp)
        !           702:        ldo     -30*8(%sp), %arg1
        !           703:        ldo     8(%sp), %sp             /* %sp */
        !           704:        std,ma  %r31, 8(%sr3,%sp)
        !           705:        copy    %r1, %arg0
        !           706:
        !           707:        mfsp    %sr0, %arg2
        !           708:        mfsp    %sr1, %arg3
        !           709:        std,ma  %arg2, 8(%sr3,%sp)      /* %sr0 */
        !           710:        std,ma  %arg3, 8(%sr3,%sp)      /* %sr1 */
        !           711:        std,ma  %arg2, 8(%sr3,%sp)      /* %sr2 */
        !           712:        std,ma  %arg2, 8(%sr3,%sp)      /* %sr3 */
        !           713:        std,ma  %arg2, 8(%sr3,%sp)      /* %sr4 */
        !           714:        std,ma  %arg2, 8(%sr3,%sp)      /* %sr5 */
        !           715:        std,ma  %arg2, 8(%sr3,%sp)      /* %sr6 */
        !           716:        std,ma  %arg2, 8(%sr3,%sp)      /* %sr7 */
        !           717:
        !           718:        mfctl   %cr0, %arg3
        !           719:        mfctl   %cr10, %arg2
        !           720:        std,ma  %arg3, 8(%sr3,%sp)      /* rctr */
        !           721:        std,ma  %arg2, 8(%sr3,%sp)      /* ccr */
        !           722:
        !           723:        mfctl   %cr28, %arg2            /* pcoq */
        !           724:        mfctl   %cr29, %arg3
        !           725:        std,ma  %arg2, 8(%sr3,%sp)
        !           726:        std,ma  %arg3, 8(%sr3,%sp)
        !           727:
        !           728:        mfsp    %sr4, %arg2             /* pcsq */
        !           729:        mfsp    %sr5, %arg3
        !           730:        std,ma  %arg2, 8(%sr3,%sp)
        !           731:        std,ma  %arg3, 8(%sr3,%sp)
        !           732:
        !           733:        mfctl   %pidr1, %arg2
        !           734:        mfctl   %pidr2, %arg3
        !           735:        std,ma  %arg2, 8(%sr3,%sp)      /* pidr1 */
        !           736:        std,ma  %arg3, 8(%sr3,%sp)      /* pidr2 */
        !           737:
        !           738:        mfctl   %pidr3, %r1
        !           739:        mtctl   %r1, %pidr1
        !           740:        mtctl   %r0, %pidr3
        !           741:
        !           742:        mfctl   %eiem, %arg2
        !           743:        mfctl   %eirr, %arg3
        !           744:        std,ma  %arg2, 8(%sr3,%sp)      /* eiem */
        !           745:        std,ma  %arg3, 8(%sr3,%sp)      /* eirr */
        !           746:
        !           747:        mfctl   %cr27, %arg2
        !           748:        mfsp    %sr6, %arg3
        !           749:        std,ma  %arg2, 8(%sr3,%sp)      /* ior */
        !           750:        std,ma  %arg3, 8(%sr3,%sp)      /* isr */
        !           751:
        !           752:        ldo     8(%sp), %sp             /* iir */
        !           753:        mfctl   %cr31, %arg3
        !           754:        std,ma  %arg3, 8(%sr3,%sp)      /* ipsw */
        !           755:
        !           756:        mfctl   %cr24, %arg2
        !           757:        mfctl   %cr25, %arg3
        !           758:        std,ma  %arg2, 8(%sr3,%sp)      /* curcpuinfo */
        !           759:        std,ma  %arg3, 8(%sr3,%sp)      /* vtop */
        !           760:
        !           761:        mfctl   %cr30, %arg2
        !           762:        mfctl   %cr27, %arg3            /* XXX */
        !           763:        std,ma  %arg2, 8(%sr3,%sp)      /* pa(u) */
        !           764:        std,ma  %arg3, 8(%sr3,%sp)      /* user curthread */
        !           765:
        !           766:        mfctl   %sar, %arg2
        !           767:        std,ma  %arg2, 8(%sr3,%sp)      /* sar */
        !           768:
        !           769:        mtsp    %r0, %sr0
        !           770:        mtsp    %r0, %sr1
        !           771:        mtsp    %r0, %sr2
        !           772:        mtsp    %r0, %sr3
        !           773:        mtsp    %r0, %sr4
        !           774:        mtsp    %r0, %sr5
        !           775:        mtsp    %r0, %sr6
        !           776:        mtsp    %r0, %sr7
        !           777:
        !           778:        ldo     TRAPFRAME_SIZEOF(%arg1), %sp
        !           779:        copy    %sp, %r3
        !           780:        std,ma  %r0, HPPA_FRAME_SIZE(%sp)
        !           781:
        !           782:        ldil    L%__gp, %dp
        !           783:        ldo     R%__gp(%dp), %dp
        !           784:        copy    %arg1, %r5
        !           785:
        !           786:        depd    %r0, T_USER_POS+1, T_USER_POS, %arg0
        !           787:        .import trap, code
        !           788:        b,l     trap, %rp
        !           789:        copy    %arg0, %r4
        !           790:
        !           791:        /* non-terminal frames return to the same proc */
        !           792:        bb,*>=,n %r4, TFF_LAST_POS, $syscall_return
        !           793:        copy    %r5, %arg0
        !           794:
        !           795:        /* see if curproc have really changed */
        !           796:        mfctl   %cr24, %arg1
        !           797:        ldd     CI_CURPROC(%arg1), %r1
        !           798:        sub,*=  %r0, %r1, %r0
        !           799:        ldd     P_MD_REGS(%r1), %r5
        !           800:
        !           801:        b       $syscall_return
        !           802:        copy    %r5, %arg0
        !           803: EXIT(TLABEL(all))
        !           804:
        !           805: #define        PTPULL(bits,lbl)                        \
        !           806:                /* space:offset -- %r8:%r9 */   ! \
        !           807:        ldil    L%__kernel_pagedir, %r24        ! \
        !           808:        or,*=   %r8, %r8, %r0                   ! \
        !           809:        mfctl   %cr25, %r24     /* vtop */      ! \
        !           810:        ldo     PAGE_SIZE(%r24), %r25           ! \
        !           811:        extrd,u %r25, 51, 32, %r25              ! \
        !           812:        extrd,u,*= %r9, 32, 10, %r17            ! \
        !           813:        ldw,s   %r17(%r24), %r25                ! \
        !           814:        extrd,u %r9, 42, 10, %r17               ! \
        !           815:        depd,z,*<> %r25, 51, 32, %r25           ! \
        !           816:        b,n     lbl                             ! \
        !           817:        ldw,s   %r17(%r25), %r25                ! \
        !           818:        extrd,u %r9, 51, 9, %r24                ! \
        !           819:        depd,z,*<> %r25, 51, 32, %r25           ! \
        !           820:        b,n     lbl                             ! \
        !           821:        ldd,s   %r24(%r25), %r16                ! \
        !           822:        or,*<>  %r16, %r0, %r17                 ! \
        !           823:        b,n     lbl                             ! \
        !           824:        depdi   bits, 2+bits, 1+bits, %r17      ! \
        !           825:        shladd,l %r24, 3, %r25, %r25            ! \
        !           826:        sub,*=  %r16, %r17, %r0                 ! \
        !           827:        std     %r17, 0(%r25)                   ! \
        !           828:        extrd,s %r16, 63, 37, %r16              ! \
        !           829:        depd    %r8, 63, 48, %r17               ! \
        !           830:        depdi   1, 62, 1, %r17
        !           831:
        !           832: TLABEL(itlb)
        !           833:        PTPULL(0, TLABEL(all))
        !           834:        iitlbt  %r16, %r17
        !           835:        rfi,r
        !           836:        nop
        !           837:
        !           838: TLABEL(tlbd)
        !           839:        PTPULL(1, TLABEL(all))
        !           840:        idtlbt  %r16, %r17
        !           841:        rfi,r
        !           842:        nop
        !           843:
        !           844: TLABEL(itlbna)
        !           845: TLABEL(dtlbna)
        !           846:        PTPULL(0, TLABEL(dtlbna_fake))
        !           847:        idtlbt  %r16, %r17
        !           848:        rfi,r
        !           849:        nop
        !           850: TLABEL(dtlbna_fake)
        !           851:        /* parse probei?,[rw] insns, decent to trap() to set regs proper */
        !           852:        mfctl   %iir, %r16
        !           853:        extrd,u %r16, 38, 6, %r24
        !           854:        comib,=,n 1, %r24, TLABEL(all)
        !           855:        extrd,u %r16, 56, 6, %r24
        !           856:        subi,<> 0x23, %r24, %r0
        !           857:        b       TLABEL(all)
        !           858:        subi,<> 0x63, %r24, %r0
        !           859:        b       TLABEL(all)
        !           860:        /* otherwise generate a flush-only tlb entry */
        !           861:        depd,z  %r8, 62, 47, %r17
        !           862:        depdi   -13, 11, 7, %r17
        !           863:        ldo     2(%r17), %r17   /* 3? */
        !           864:        idtlbt  %r0, %r17
        !           865:        rfi,r
        !           866:        nop
        !           867:
        !           868: TLABEL(dtlb)
        !           869:        PTPULL(0, TLABEL(all))
        !           870:        idtlbt  %r16, %r17
        !           871:        rfi,r
        !           872:        nop
        !           873:
        !           874:        .export TLABEL(excpt), entry
        !           875: ENTRY(TLABEL(excpt),0)
        !           876:        /* assume we never get this one w/o fpu [enabled] */
        !           877:        copy    %rp, %r1
        !           878:        copy    %arg0, %r8
        !           879:        mfctl   %cr30, %r9
        !           880: #if (PCB_FPREGS+U_PCB) != 0
        !           881:        ldo     PCB_FPREGS+U_PCB(%r9), %r9
        !           882: #endif
        !           883:        .import fpu_save, code
        !           884:        .call
        !           885:        b,l     fpu_save, %rp
        !           886:        copy    %r9, %arg0
        !           887:        copy    %r1, %rp
        !           888:        copy    %r8, %arg0
        !           889:        mtctl   %r0, %cr10      /* reset ccr: cause a reload after exception */
        !           890:        ldil    L%fpu_curpcb, %r1
        !           891:        std     %r0, R%fpu_curpcb(%r1)
        !           892:
        !           893:        /* now, check for trap */
        !           894:        ldw     0(%r9), %r1
        !           895:        bb,>=,n %r1, HPPA_FPU_T_POS, excpt_notrap
        !           896:        ldw     1*4(%r9), %r1
        !           897:        comb,<>,n %r0, %r1, excpt_emulate
        !           898:        ldw     2*4(%r9), %r1
        !           899:        comb,<>,n %r0, %r1, excpt_emulate
        !           900:        ldw     3*4(%r9), %r1
        !           901:        comb,<>,n %r0, %r1, excpt_emulate
        !           902:        ldw     4*4(%r9), %r1
        !           903:        comb,<>,n %r0, %r1, excpt_emulate
        !           904:        ldw     5*4(%r9), %r1
        !           905:        comb,<>,n %r0, %r1, excpt_emulate
        !           906:        ldw     6*4(%r9), %r1
        !           907:        comb,<>,n %r0, %r1, excpt_emulate
        !           908:        ldw     7*4(%r9), %r1
        !           909:
        !           910: excpt_emulate
        !           911:        bb,*>=,n %r1, 37, excpt_notrap  /* HPPA_FPU_UNMPL not set */
        !           912:
        !           913: #if TODO_emulate
        !           914:        ldw     0(%r9), %r16
        !           915:        depi    0, HPPA_FPU_T_POS, 1, %r16
        !           916:        .import $fpu_emulate, code
        !           917:        b       $fpu_emulate
        !           918:        stw     %r16, 0(%r9)
        !           919: #endif
        !           920:
        !           921: excpt_notrap
        !           922:        sync
        !           923:        b       TLABEL(all)
        !           924:        ldi     T_EXCEPTION, %r1
        !           925: EXIT(TLABEL(excpt))
        !           926:
        !           927:        .export TLABEL(emu), entry
        !           928: ENTRY(TLABEL(emu),0)
        !           929:        /*
        !           930:         * Switch FPU/SFU context
        !           931:         *
        !           932:         * %isr:%ior - data address
        !           933:         * %iir - instruction to emulate
        !           934:         * iisq:iioq - address of instruction to emulate
        !           935:         *
        !           936:         * note: ISR and IOR contain valid data only if the
        !           937:         *       instruction is a coprocessor load or store.
        !           938:         *
        !           939:         */
        !           940:
        !           941:        mfctl   %iir, %r8
        !           942:        extrd,u %r8, 37, 6, %r9 /* no sfu implementation right now */
        !           943:        comib,= 4, %r9, TLABEL(all)
        !           944:        ldi     T_ILLEGAL, %r1
        !           945:
        !           946:        /*
        !           947:         * pass through for all coprocessors now and
        !           948:         * do not check the uid here.
        !           949:         * in case that piece does not exist emulate
        !           950:         * or the trap will be generted later.
        !           951:         */
        !           952:
        !           953:        /* if we are already enabled and hit again, emulate */
        !           954:        mfctl   %cr10, %r1      /* ccr */
        !           955:        extru,<> %r1, 25, 2, %r0
        !           956:        b,n     $fpusw_set
        !           957:        nop
        !           958:
        !           959: $fpusw_emu
        !           960:        mtctl   %r0, %cr10      /* reset ccr: cause a reload after exception */
        !           961:        std     %r0, R%fpu_curpcb(%r1)
        !           962: #if TODO_emulate
        !           963:        /* here we emulate the fld/fst */
        !           964:        mfctl   %iir, %r1
        !           965:        extrd,u %r1, 37, 6, %r1
        !           966:        comib,= 0xb, %r9, TLABEL(all)
        !           967:        ldi     T_ILLEGAL, %r1
        !           968:
        !           969:        mfctl   %iir, %r1
        !           970:        extrd,u %r1, 37, 6, %r1
        !           971:        comib,= 0x9, %r9, TLABEL(all)
        !           972:        ldi     T_ILLEGAL, %r1
        !           973:
        !           974:        mfctl   %iir, %r1
        !           975:        .import $fpu_emulate, code
        !           976:        b       $fpu_emulate
        !           977:        nop
        !           978: #else
        !           979:        b       TLABEL(all)
        !           980:        ldi     T_ILLEGAL, %r1
        !           981: #endif
        !           982: $fpusw_set
        !           983:        /* enable coprocessor */
        !           984:        depdi   3, 37, 2, %r1
        !           985:        mtctl   %r1, %cr10      /* ccr */
        !           986:
        !           987:        ldil    L%fpu_curpcb, %r16
        !           988:        mfctl   %cr30, %r9
        !           989:        ldd     R%fpu_curpcb(%r16), %r16
        !           990:
        !           991:        comb,=,n %r16, %r0, $fpusw_nosave
        !           992:        comb,=,n %r16, %r9, $fpusw_done
        !           993:
        !           994:        copy    %arg0, %r17
        !           995:        copy    %rp, %r1
        !           996: #if (PCB_FPREGS+U_PCB) != 0
        !           997:        ldo     PCB_FPREGS+U_PCB(%r16), %r16
        !           998: #endif
        !           999:        .import fpu_save, code
        !          1000:        .call
        !          1001:        b,l     fpu_save, %rp
        !          1002:        copy    %r16, %arg0
        !          1003:        copy    %r1, %rp
        !          1004:        copy    %r17, %arg0
        !          1005:
        !          1006: $fpusw_nosave
        !          1007:        /* count switches */
        !          1008:        .import umvexp, data
        !          1009:        ldil    L%(uvmexp+FPSWTCH), %r1
        !          1010:        ldw     R%(uvmexp+FPSWTCH)(%r1), %r16
        !          1011:        ldo     31*8+PCB_FPREGS+U_PCB(%r9), %r17
        !          1012:        ldo     1(%r16), %r16
        !          1013:        stw     %r16, R%(uvmexp+FPSWTCH)(%r1)
        !          1014:
        !          1015:        fldds,ma -8(%r17), %fr31
        !          1016:        fldds,ma -8(%r17), %fr30
        !          1017:        fldds,ma -8(%r17), %fr29
        !          1018:        fldds,ma -8(%r17), %fr28
        !          1019:        fldds,ma -8(%r17), %fr27
        !          1020:        fldds,ma -8(%r17), %fr26
        !          1021:        fldds,ma -8(%r17), %fr25
        !          1022:        fldds,ma -8(%r17), %fr24
        !          1023:        fldds,ma -8(%r17), %fr23
        !          1024:        fldds,ma -8(%r17), %fr22
        !          1025:        fldds,ma -8(%r17), %fr21
        !          1026:        fldds,ma -8(%r17), %fr20
        !          1027:        fldds,ma -8(%r17), %fr19
        !          1028:        fldds,ma -8(%r17), %fr18
        !          1029:        fldds,ma -8(%r17), %fr17
        !          1030:        fldds,ma -8(%r17), %fr16
        !          1031:        fldds,ma -8(%r17), %fr15
        !          1032:        fldds,ma -8(%r17), %fr14
        !          1033:        fldds,ma -8(%r17), %fr13
        !          1034:        fldds,ma -8(%r17), %fr12
        !          1035:        fldds,ma -8(%r17), %fr11
        !          1036:        fldds,ma -8(%r17), %fr10
        !          1037:        fldds,ma -8(%r17), %fr9
        !          1038:        fldds,ma -8(%r17), %fr8
        !          1039:        fldds,ma -8(%r17), %fr7
        !          1040:        fldds,ma -8(%r17), %fr6
        !          1041:        fldds,ma -8(%r17), %fr5
        !          1042:        fldds,ma -8(%r17), %fr4
        !          1043:        fldds,ma -8(%r17), %fr3
        !          1044:        fldds,ma -8(%r17), %fr2
        !          1045:        fldds,ma -8(%r17), %fr1
        !          1046:        fldds     0(%r17), %fr0 /* fr0 must be restored last */
        !          1047:
        !          1048:        ldil    L%fpu_curpcb, %r1
        !          1049:        std     %r17, R%fpu_curpcb(%r1)
        !          1050:
        !          1051: $fpusw_done
        !          1052:        rfir
        !          1053:        nop
        !          1054: EXIT(TLABEL(emu))
        !          1055:
        !          1056: LEAF_ENTRY(fpu_exit)
        !          1057:        /* enable coprocessor XXX */
        !          1058:        depi    3, 25, 2, %r1
        !          1059:        mtctl   %r1, %cr10
        !          1060:
        !          1061:        ldil    L%fpu_scratch, %r25
        !          1062:        ldo     R%fpu_scratch(%r25), %r25
        !          1063:        fstds   %fr0, 0(%r25)
        !          1064:        sync
        !          1065:        bv      %r0(%rp)
        !          1066:        mtctl   %r0, %cr10
        !          1067: EXIT(fpu_exit)
        !          1068:
        !          1069: LEAF_ENTRY(fpu_save)
        !          1070:        fstds,ma %fr0 , 8(%arg0)
        !          1071:        fstds,ma %fr1 , 8(%arg0)
        !          1072:        fstds,ma %fr2 , 8(%arg0)
        !          1073:        fstds,ma %fr3 , 8(%arg0)
        !          1074:        fstds,ma %fr4 , 8(%arg0)
        !          1075:        fstds,ma %fr5 , 8(%arg0)
        !          1076:        fstds,ma %fr6 , 8(%arg0)
        !          1077:        fstds,ma %fr7 , 8(%arg0)
        !          1078:        fstds,ma %fr8 , 8(%arg0)
        !          1079:        fstds,ma %fr9 , 8(%arg0)
        !          1080:        fstds,ma %fr10, 8(%arg0)
        !          1081:        fstds,ma %fr11, 8(%arg0)
        !          1082:        fstds,ma %fr12, 8(%arg0)
        !          1083:        fstds,ma %fr13, 8(%arg0)
        !          1084:        fstds,ma %fr14, 8(%arg0)
        !          1085:        fstds,ma %fr15, 8(%arg0)
        !          1086:        fstds,ma %fr16, 8(%arg0)
        !          1087:        fstds,ma %fr17, 8(%arg0)
        !          1088:        fstds,ma %fr18, 8(%arg0)
        !          1089:        fstds,ma %fr19, 8(%arg0)
        !          1090:        fstds,ma %fr20, 8(%arg0)
        !          1091:        fstds,ma %fr21, 8(%arg0)
        !          1092:        fstds,ma %fr22, 8(%arg0)
        !          1093:        fstds,ma %fr23, 8(%arg0)
        !          1094:        fstds,ma %fr24, 8(%arg0)
        !          1095:        fstds,ma %fr25, 8(%arg0)
        !          1096:        fstds,ma %fr26, 8(%arg0)
        !          1097:        fstds,ma %fr27, 8(%arg0)
        !          1098:        fstds,ma %fr28, 8(%arg0)
        !          1099:        fstds,ma %fr29, 8(%arg0)
        !          1100:        fstds,ma %fr30, 8(%arg0)
        !          1101:        fstds    %fr31, 0(%arg0)
        !          1102:        ldo     -24(%arg0), %arg0
        !          1103:        ldi     -32, %r25       /* gotta be free for all callers */
        !          1104:        fdc,m   %r25(%arg0)
        !          1105:        fdc,m   %r25(%arg0)
        !          1106:        fdc,m   %r25(%arg0)
        !          1107:        fdc,m   %r25(%arg0)
        !          1108:        fdc,m   %r25(%arg0)
        !          1109:        fdc,m   %r25(%arg0)
        !          1110:        fdc,m   %r25(%arg0)
        !          1111:        fdc,m   %r25(%arg0)
        !          1112:        bv      %r0(%rp)
        !          1113:        sync
        !          1114: EXIT(fpu_save)
        !          1115:
        !          1116: /*
        !          1117:  * void
        !          1118:  * mtctl(register_t val, int reg)
        !          1119:  */
        !          1120: LEAF_ENTRY(mtctl)
        !          1121:        b,l     mtctl_end, %r1
        !          1122:        extrd,u %arg1, 63, 32, %arg1
        !          1123:        bv      %r0(%rp)
        !          1124:        mtctl   %arg0, %cr0
        !          1125:        bv      %r0(%rp)
        !          1126:        nop     /* mtctl        %arg0, %cr1 */
        !          1127:        bv      %r0(%rp)
        !          1128:        nop     /* mtctl        %arg0, %cr2 */
        !          1129:        bv      %r0(%rp)
        !          1130:        nop     /* mtctl        %arg0, %cr3 */
        !          1131:        bv      %r0(%rp)
        !          1132:        nop     /* mtctl        %arg0, %cr4 */
        !          1133:        bv      %r0(%rp)
        !          1134:        nop     /* mtctl        %arg0, %cr5 */
        !          1135:        bv      %r0(%rp)
        !          1136:        nop     /* mtctl        %arg0, %cr6 */
        !          1137:        bv      %r0(%rp)
        !          1138:        nop     /* mtctl        %arg0, %cr7 */
        !          1139:        bv      %r0(%rp)
        !          1140:        mtctl   %arg0, %cr8
        !          1141:        bv      %r0(%rp)
        !          1142:        mtctl   %arg0, %cr9
        !          1143:        bv      %r0(%rp)
        !          1144:        mtctl   %arg0, %cr10
        !          1145:        bv      %r0(%rp)
        !          1146:        mtctl   %arg0, %cr11
        !          1147:        bv      %r0(%rp)
        !          1148:        mtctl   %arg0, %cr12
        !          1149:        bv      %r0(%rp)
        !          1150:        mtctl   %arg0, %cr13
        !          1151:        bv      %r0(%rp)
        !          1152:        mtctl   %arg0, %cr14
        !          1153:        bv      %r0(%rp)
        !          1154:        mtctl   %arg0, %cr15
        !          1155:        bv      %r0(%rp)
        !          1156:        mtctl   %arg0, %cr16
        !          1157:        bv      %r0(%rp)
        !          1158:        mtctl   %arg0, %cr17
        !          1159:        bv      %r0(%rp)
        !          1160:        mtctl   %arg0, %cr18
        !          1161:        bv      %r0(%rp)
        !          1162:        mtctl   %arg0, %cr19
        !          1163:        bv      %r0(%rp)
        !          1164:        mtctl   %arg0, %cr20
        !          1165:        bv      %r0(%rp)
        !          1166:        mtctl   %arg0, %cr21
        !          1167:        bv      %r0(%rp)
        !          1168:        mtctl   %arg0, %cr22
        !          1169:        bv      %r0(%rp)
        !          1170:        mtctl   %arg0, %cr23
        !          1171:        bv      %r0(%rp)
        !          1172:        mtctl   %arg0, %cr24
        !          1173:        bv      %r0(%rp)
        !          1174:        mtctl   %arg0, %cr25
        !          1175:        bv      %r0(%rp)
        !          1176:        mtctl   %arg0, %cr26
        !          1177:        bv      %r0(%rp)
        !          1178:        mtctl   %arg0, %cr27
        !          1179:        bv      %r0(%rp)
        !          1180:        mtctl   %arg0, %cr28
        !          1181:        bv      %r0(%rp)
        !          1182:        mtctl   %arg0, %cr29
        !          1183:        bv      %r0(%rp)
        !          1184:        mtctl   %arg0, %cr30
        !          1185:        bv      %r0(%rp)
        !          1186:        mtctl   %arg0, %cr31
        !          1187: mtctl_end
        !          1188:        subi,<< 31, %arg1, %r0
        !          1189:        bv,n    %arg1(%r1)
        !          1190:        bv      %r0(%rp)
        !          1191:        nop
        !          1192: EXIT(mtctl)
        !          1193:
        !          1194: /*
        !          1195:  * void
        !          1196:  * pdtlb(pa_space_t sp, vaddr_t va)
        !          1197:  */
        !          1198: LEAF_ENTRY(pdtlb)
        !          1199:        mfsp    %sr1, %arg2
        !          1200:        mtsp    %arg0, %sr1
        !          1201:        pdtlb   %r0(%sr1, %arg1)
        !          1202:        bv      %r0(%rp)
        !          1203:        mtsp    %arg2, %sr1
        !          1204: EXIT(pdtlb)
        !          1205:
        !          1206: /*
        !          1207:  * void
        !          1208:  * pitlb(pa_space_t sp, vaddr_t va)
        !          1209:  */
        !          1210: LEAF_ENTRY(pitlb)
        !          1211:        mfsp    %sr1, %arg2
        !          1212:        mtsp    %arg0, %sr1
        !          1213:        pitlb   %r0(%sr1, %arg1)
        !          1214:        bv      %r0(%rp)
        !          1215:        mtsp    %arg2, %sr1
        !          1216: EXIT(pitlb)
        !          1217:
        !          1218: /*
        !          1219:  * register_t
        !          1220:  * mfctl(int reg)
        !          1221:  */
        !          1222: LEAF_ENTRY(mfctl)
        !          1223:        b,l     mfctl_end, %r1
        !          1224:        extrd,u %arg0, 63, 32, %arg0
        !          1225:        bv      %r0(%rp)
        !          1226:        mfctl   %cr0, %ret0
        !          1227:        bv      %r0(%rp)
        !          1228:        nop     /* mfctl        %cr1, %ret0 */
        !          1229:        bv      %r0(%rp)
        !          1230:        nop     /* mfctl        %cr2, %ret0 */
        !          1231:        bv      %r0(%rp)
        !          1232:        nop     /* mfctl        %cr3, %ret0 */
        !          1233:        bv      %r0(%rp)
        !          1234:        nop     /* mfctl        %cr4, %ret0 */
        !          1235:        bv      %r0(%rp)
        !          1236:        nop     /* mfctl        %cr5, %ret0 */
        !          1237:        bv      %r0(%rp)
        !          1238:        nop     /* mfctl        %cr6, %ret0 */
        !          1239:        bv      %r0(%rp)
        !          1240:        nop     /* mfctl        %cr7, %ret0 */
        !          1241:        bv      %r0(%rp)
        !          1242:        mfctl   %cr8, %ret0
        !          1243:        bv      %r0(%rp)
        !          1244:        mfctl   %cr9, %ret0
        !          1245:        bv      %r0(%rp)
        !          1246:        mfctl   %cr10, %ret0
        !          1247:        bv      %r0(%rp)
        !          1248:        mfctl   %cr11, %ret0
        !          1249:        bv      %r0(%rp)
        !          1250:        mfctl   %cr12, %ret0
        !          1251:        bv      %r0(%rp)
        !          1252:        mfctl   %cr13, %ret0
        !          1253:        bv      %r0(%rp)
        !          1254:        mfctl   %cr14, %ret0
        !          1255:        bv      %r0(%rp)
        !          1256:        mfctl   %cr15, %ret0
        !          1257:        bv      %r0(%rp)
        !          1258:        mfctl   %cr16, %ret0
        !          1259:        bv      %r0(%rp)
        !          1260:        mfctl   %cr17, %ret0
        !          1261:        bv      %r0(%rp)
        !          1262:        mfctl   %cr18, %ret0
        !          1263:        bv      %r0(%rp)
        !          1264:        mfctl   %cr19, %ret0
        !          1265:        bv      %r0(%rp)
        !          1266:        mfctl   %cr20, %ret0
        !          1267:        bv      %r0(%rp)
        !          1268:        mfctl   %cr21, %ret0
        !          1269:        bv      %r0(%rp)
        !          1270:        mfctl   %cr22, %ret0
        !          1271:        bv      %r0(%rp)
        !          1272:        mfctl   %cr23, %ret0
        !          1273:        bv      %r0(%rp)
        !          1274:        mfctl   %cr24, %ret0
        !          1275:        bv      %r0(%rp)
        !          1276:        mfctl   %cr25, %ret0
        !          1277:        bv      %r0(%rp)
        !          1278:        mfctl   %cr26, %ret0
        !          1279:        bv      %r0(%rp)
        !          1280:        mfctl   %cr27, %ret0
        !          1281:        bv      %r0(%rp)
        !          1282:        mfctl   %cr28, %ret0
        !          1283:        bv      %r0(%rp)
        !          1284:        mfctl   %cr29, %ret0
        !          1285:        bv      %r30(%rp)
        !          1286:        mfctl   %cr30, %ret0
        !          1287:        bv      %r30(%rp)
        !          1288:        mfctl   %cr31, %ret0
        !          1289:
        !          1290: mfctl_end
        !          1291:        subi,<< 31, %arg0, %r0
        !          1292:        bv,n    %arg0(%r1)
        !          1293:        bv      %r0(%rp)
        !          1294:        nop
        !          1295: EXIT(mfctl)
        !          1296:
        !          1297: #define        CACHELOOP(sp,addr,len,step,insn)                        \
        !          1298:        mtsp    sp, %sr1                                        ! \
        !          1299:        ldi     -1, arg7                                        ! \
        !          1300:        sh3add  step, arg7, %r1                                 ! \
        !          1301:        andcm   len, %r1, %r1                                   ! \
        !          1302:        add     addr, %r1, %r1                                  ! \
        !          1303:        b       __CONCAT(insn,_loop)                            ! \
        !          1304:        add     addr, len, len                                  ! \
        !          1305:        .label  __CONCAT(insn,_loop8)                           ! \
        !          1306:        insn,m  step(%sr1, addr)                                ! \
        !          1307:        insn,m  step(%sr1, addr)                                ! \
        !          1308:        insn,m  step(%sr1, addr)                                ! \
        !          1309:        insn,m  step(%sr1, addr)                                ! \
        !          1310:        insn,m  step(%sr1, addr)                                ! \
        !          1311:        insn,m  step(%sr1, addr)                                ! \
        !          1312:        insn,m  step(%sr1, addr)                                ! \
        !          1313:        .label  __CONCAT(insn,_loop)                            ! \
        !          1314:        comb,<< addr, %r1, __CONCAT(insn,_loop8)                ! \
        !          1315:        insn,m  step(%sr1, addr)                                ! \
        !          1316:        .label  __CONCAT(insn,_loop1)                           ! \
        !          1317:        comb,<<,n addr, len, __CONCAT(insn,_loop1)              ! \
        !          1318:        insn,m  step(%sr1, addr)
        !          1319:
        !          1320:
        !          1321: LEAF_ENTRY(fdcache)
        !          1322:        ldil    L%dcache_stride, %r1
        !          1323:        ldw     R%dcache_stride(%r1), %arg3
        !          1324:        CACHELOOP(%arg0,%arg1,%arg2,%arg3,fdc)
        !          1325:        bv      %r0(%rp)
        !          1326:        sync
        !          1327: EXIT(fdcache)
        !          1328:
        !          1329: LEAF_ENTRY(pdcache)
        !          1330:        ldil    L%dcache_stride, %r1
        !          1331:        ldw     R%dcache_stride(%r1), %arg3
        !          1332:        CACHELOOP(%arg0,%arg1,%arg2,%arg3,pdc)
        !          1333:        bv      %r0(%rp)
        !          1334:        sync
        !          1335: EXIT(pdcache)
        !          1336:
        !          1337: LEAF_ENTRY(ficache)
        !          1338:        ldil    L%icache_stride, %r1
        !          1339:        ldw     R%icache_stride(%r1), %arg3
        !          1340:        CACHELOOP(%arg0,%arg1,%arg2,%arg3,fic)
        !          1341:        bv      %r0(%rp)
        !          1342:        sync
        !          1343: EXIT(ficache)
        !          1344:
        !          1345: LEAF_ENTRY(copy_on_fault)
        !          1346:        mtsp    %r0, %sr1
        !          1347:        mtsp    %r0, %sr2
        !          1348:        std     %r1, PCB_ONFAULT+U_PCB(%rp)
        !          1349:        ldd     HPPA_FRAME_RP(%sp), %rp
        !          1350:        ldo     -HPPA_FRAME_SIZE(%sp), %sp
        !          1351:        bv      %r0(%rp)
        !          1352:        ldi     EFAULT, %ret0
        !          1353: EXIT(copy_on_fault)
        !          1354:
        !          1355: LEAF_ENTRY(sync_caches)
        !          1356:        sync
        !          1357:        syncdma
        !          1358:        sync
        !          1359:        nop
        !          1360:        nop
        !          1361:        nop
        !          1362:        nop
        !          1363:        nop
        !          1364:        nop
        !          1365:        bv      %r0(%rp)
        !          1366:        nop
        !          1367: EXIT(sync_caches)
        !          1368:
        !          1369: /*
        !          1370:  * int spstrcpy (pa_space_t ssp, const void *src, pa_space_t dsp, void *dst,
        !          1371:  *              size_t size, size_t *rsize)
        !          1372:  * do a space to space strncpy, return actual copy size in the rsize;
        !          1373:  */
        !          1374: LEAF_ENTRY(spstrcpy)
        !          1375:        stw     %rp, HPPA_FRAME_RP(%sp)
        !          1376:        ldo     HPPA_FRAME_SIZE(%sp), %sp
        !          1377:        add     arg4, %arg1, arg4
        !          1378:        /* setup fault handler */
        !          1379:        mfctl   %cr24, %arg1
        !          1380:        ldd     CI_CURPROC(%arg1), %r1
        !          1381:        ldil    L%copy_on_fault, arg7
        !          1382:        ldd     P_ADDR(arg6), %rp
        !          1383:        ldo     R%copy_on_fault(arg7), arg7
        !          1384:        ldd     PCB_ONFAULT+U_PCB(%rp), %r1
        !          1385:        std     arg7, PCB_ONFAULT+U_PCB(%rp)
        !          1386:
        !          1387:        mtsp    %arg0, %sr1
        !          1388:        mtsp    %arg2, %sr2
        !          1389:        copy    %arg1, %arg0
        !          1390:
        !          1391: $spstrcpy_loop
        !          1392:        ldbs,ma 1(%sr1, %arg1), arg7
        !          1393:        comb,=  arg4, %arg1, $spstrcpy_exit
        !          1394:        stbs,ma arg7, 1(%sr2, %arg3)
        !          1395:        comb,<>,n %r0, arg7, $spstrcpy_loop
        !          1396:        nop
        !          1397:
        !          1398: $spstrcpy_exit
        !          1399:        ldo     -HPPA_FRAME_SIZE(%sp), %sp
        !          1400:        mtsp    %r0, %sr1
        !          1401:        mtsp    %r0, %sr2
        !          1402:        std     %r1, PCB_ONFAULT+U_PCB(%rp)
        !          1403:        sub     %arg1, %arg0, %arg1
        !          1404:        ldd     HPPA_FRAME_RP(%sp), %rp
        !          1405:        sub,=   %r0, arg5, %r0
        !          1406:        stw     %arg1, 0(arg5)
        !          1407:        bv      0(%rp)
        !          1408:        copy    %r0, %ret0
        !          1409: EXIT(spstrcpy)
        !          1410:
        !          1411: LEAF_ENTRY(setjmp)
        !          1412:        std,ma  %rp, 8(%arg0)
        !          1413:        std,ma  %sp, 8(%arg0)
        !          1414:        std,ma  %r3, 8(%arg0)
        !          1415:        std,ma  %r4, 8(%arg0)
        !          1416:        std,ma  %r5, 8(%arg0)
        !          1417:        std,ma  %r6, 8(%arg0)
        !          1418:        std,ma  %r7, 8(%arg0)
        !          1419:        std,ma  %r8, 8(%arg0)
        !          1420:        std,ma  %r9, 8(%arg0)
        !          1421:        std,ma  %r10, 8(%arg0)
        !          1422:        std,ma  %r11, 8(%arg0)
        !          1423:        std,ma  %r12, 8(%arg0)
        !          1424:        std,ma  %r13, 8(%arg0)
        !          1425:        std,ma  %r14, 8(%arg0)
        !          1426:        std,ma  %r15, 8(%arg0)
        !          1427:        std,ma  %r16, 8(%arg0)
        !          1428:        std,ma  %r17, 8(%arg0)
        !          1429:        std,ma  %r18, 8(%arg0)
        !          1430:        std,ma  %r19, 8(%arg0)
        !          1431:        std,ma  %r27, 8(%arg0)
        !          1432:
        !          1433:        bv      %r0(%rp)
        !          1434:        copy    %r0, %ret0
        !          1435: EXIT(setjmp)
        !          1436:
        !          1437: LEAF_ENTRY(longjmp)
        !          1438:        ldd,ma  8(%arg0), %rp
        !          1439:        ldd,ma  8(%arg0), %sp
        !          1440:        ldd,ma  8(%arg0), %r3
        !          1441:        ldd,ma  8(%arg0), %r4
        !          1442:        ldd,ma  8(%arg0), %r5
        !          1443:        ldd,ma  8(%arg0), %r6
        !          1444:        ldd,ma  8(%arg0), %r7
        !          1445:        ldd,ma  8(%arg0), %r8
        !          1446:        ldd,ma  8(%arg0), %r9
        !          1447:        ldd,ma  8(%arg0), %r10
        !          1448:        ldd,ma  8(%arg0), %r11
        !          1449:        ldd,ma  8(%arg0), %r12
        !          1450:        ldd,ma  8(%arg0), %r13
        !          1451:        ldd,ma  8(%arg0), %r14
        !          1452:        ldd,ma  8(%arg0), %r15
        !          1453:        ldd,ma  8(%arg0), %r16
        !          1454:        ldd,ma  8(%arg0), %r17
        !          1455:        ldd,ma  8(%arg0), %r18
        !          1456:        ldd,ma  8(%arg0), %r19
        !          1457:        ldd,ma  8(%arg0), %r27
        !          1458:
        !          1459:        bv      %r0(%rp)
        !          1460:        copy    %arg1, %ret0
        !          1461: EXIT(longjmp)
        !          1462:
        !          1463:        .import whichqs, data
        !          1464:        .import qs, data
        !          1465: /*
        !          1466:  * setrunqueue(struct proc *p);
        !          1467:  * Insert a process on the appropriate queue.  Should be called at splclock().
        !          1468:  */
        !          1469:        .align  32
        !          1470: ENTRY(setrunqueue,0)
        !          1471: #ifdef DIAGNOSTIC
        !          1472:        ldd     P_BACK(%arg0), %r1
        !          1473:        comb,<>,n %r0, %r1, Lsetrunqueue_panic
        !          1474:        ldd     P_WCHAN(%arg0), %r1
        !          1475:        comb,<>,n %r0, %r1, Lsetrunqueue_panic
        !          1476:        ldb     P_STAT(%arg0), %r1
        !          1477:        comib,=,n SRUN, %r1, Lsetrunqueue_ok
        !          1478: Lsetrunqueue_panic
        !          1479:        copy    %arg0, %arg1
        !          1480:        ldil    L%Lsrqpstr, %arg0
        !          1481:        .call
        !          1482:        b,l     panic, %rp
        !          1483:        ldo     R%Lsrqpstr(%arg0), %arg0
        !          1484: Lsrqpstr
        !          1485:        .asciz  "setrunqueue(%p)"
        !          1486:        .align  8
        !          1487: Lsetrunqueue_ok
        !          1488: #endif
        !          1489:
        !          1490:        ldb     P_PRIORITY(%arg0), %r1
        !          1491:        ldil    L%qs, arg7
        !          1492:        shd     %r0, %r1, 2, %r1
        !          1493:        ldo     R%qs(arg7), arg7
        !          1494:        sh3add  %r1, arg7, arg7
        !          1495:        ldil    L%whichqs, %arg3
        !          1496:        ldd     P_BACK(arg7), arg6
        !          1497:        std     arg7, P_FORW(%arg0)
        !          1498:        std     %arg0, P_BACK(arg7)
        !          1499:        ldw     R%whichqs(%arg3), arg5
        !          1500:        std     %arg0, P_FORW(arg6)
        !          1501:        mtctl   %r1, %sar
        !          1502:        std     arg6, P_BACK(%arg0)
        !          1503:        vdepi   1, 1, arg5
        !          1504:        bv      0(%rp)
        !          1505:        stw     arg5, R%whichqs(%arg3)
        !          1506: EXIT(setrunqueue)
        !          1507:
        !          1508: /*
        !          1509:  * remrunqueue(struct proc *p);
        !          1510:  * Remove a process from its queue.  Should be called at splclock().
        !          1511:  */
        !          1512:        .align  32
        !          1513: ENTRY(remrunqueue,0)
        !          1514:        ldb     P_PRIORITY(%arg0), %r1
        !          1515:        shd     %r0, %r1, 2, %r1
        !          1516:        ldil    L%whichqs, arg5
        !          1517:        mtsar   %r1
        !          1518:        ldw     R%whichqs(arg5), arg6
        !          1519:
        !          1520: #ifdef DIAGNOSTIC
        !          1521:        bvb,<,n arg6, remrunqueue_ok
        !          1522:
        !          1523: Lremrunqueue_panic
        !          1524:        copy    %arg0, %arg1
        !          1525:        ldil    L%Lrrqpstr, %arg0
        !          1526:        .call
        !          1527:        b,l     panic, %rp
        !          1528:        ldo     R%Lrrqpstr(%arg0), %arg0
        !          1529:
        !          1530: Lrrqpstr
        !          1531:        .asciz  "remrunqueue(%p), bit=%x"
        !          1532:        .align  8
        !          1533: remrunqueue_ok
        !          1534: #endif
        !          1535:        ldd     P_BACK(%arg0), arg7
        !          1536:        std     %r0, P_BACK(%arg0)
        !          1537:        ldd     P_FORW(%arg0), %arg0
        !          1538:        std     %arg0, P_FORW(arg7)
        !          1539:        vdepi   0, 1, arg6
        !          1540:        sub,*<> arg7, %arg0, %r0
        !          1541:        stw     arg6, R%whichqs(arg5)
        !          1542:        bv      0(%rp)
        !          1543:        std     arg7, P_BACK(%arg0)
        !          1544: EXIT(remrunqueue)
        !          1545:
        !          1546: /*
        !          1547:  * cpu_switch()
        !          1548:  * find the highest priority process and resume it.
        !          1549:  */
        !          1550:        .align  32
        !          1551: ENTRY(cpu_switch,128)
        !          1552:        ldil    L%cpl, %r1
        !          1553:        ldw     R%cpl(%r1), %ret0
        !          1554:        copy    %r3, %r1
        !          1555:        std     %rp, HPPA_FRAME_RP(%sp)
        !          1556:        copy    %sp, %r3
        !          1557:        stwm    %r1, HPPA_FRAME_SIZE+20*8(%sp)
        !          1558:        ldo     -(HPPA_FRAME_SIZE)(%sp), ap
        !          1559:        stw     %ret0, 2*8(ap)          /* cpl */
        !          1560:
        !          1561:        /*
        !          1562:         * Clear curproc so that we don't accumulate system time while idle.
        !          1563:         */
        !          1564:        mfctl   %cr24, %r1
        !          1565:        ldd     CI_CURPROC(%r1), %arg2
        !          1566:        b       switch_search
        !          1567:        std     %r0, CI_CURPROC(%r1)
        !          1568:        /* remain on the old (curproc)'s stack until we have a better choice */
        !          1569:
        !          1570: cpu_idle
        !          1571:        .call
        !          1572:        b,l     spllower, %rp
        !          1573:        copy    %r0, %arg0
        !          1574:        .import uvm, data
        !          1575:        ldil    L%uvm, %r1
        !          1576:        ldo     R%uvm(%r1), %r1
        !          1577:        ldw     PAGE_IDLE_ZERO(%r1), %r1
        !          1578:        sub,<>  %r0, %r1, %r0
        !          1579:        b,n     cpu_loop
        !          1580:
        !          1581:        .call
        !          1582:        b,l     uvm_pageidlezero, %rp
        !          1583:        std     %arg2, 8(%r3)
        !          1584:
        !          1585:        ldw     2*8(ap), %ret0          /* cpl */
        !          1586:        ldd     8(%r3), %arg2
        !          1587:
        !          1588: cpu_loop
        !          1589:        ldil    L%cpl, %arg0
        !          1590:        stw     %ret0, R%cpl(%arg0)
        !          1591:
        !          1592: switch_search
        !          1593:        /*
        !          1594:         * t1:   &whichqs
        !          1595:         * arg2: old curproc
        !          1596:         *
        !          1597:         */
        !          1598:        ldil    L%whichqs, %r1
        !          1599:        ldw     R%whichqs(%r1), %arg2
        !          1600:        comb,=,n %r0, %arg2, cpu_idle
        !          1601:        copy    %r0, %arg0
        !          1602:
        !          1603:        ldi     0, %arg3
        !          1604: getbit
        !          1605:        mtsar   %arg3
        !          1606:        bvb,>=,n %arg2, getbit
        !          1607:        ldo     1(%arg3), %arg3
        !          1608:
        !          1609:        ldil    L%qs, %arg2
        !          1610:        ldo     R%qs(%arg2), %arg2
        !          1611:        depd    %arg3, 62, 63, %arg3
        !          1612:        shladd,l %arg3, 3, %arg2, %arg2
        !          1613:
        !          1614:        ldd     P_FORW(%arg2), %arg1
        !          1615: #ifdef DIAGNOSTIC
        !          1616:        comb,<> %arg2, %arg1, link_ok
        !          1617:        nop
        !          1618: switch_error
        !          1619:        copy    %arg3, %arg1
        !          1620:        copy    %arg2, %arg2
        !          1621:        ldil    L%Lcspstr, %arg0
        !          1622:        .call
        !          1623:        b,l     panic, %rp
        !          1624:        ldo     R%Lcspstr(%arg0), %arg0
        !          1625: Lcspstr
        !          1626:        .asciz  "cpu_switch: bit=%x, q/p=%p"
        !          1627:        .align  8
        !          1628: link_ok
        !          1629: #endif
        !          1630:        ldil    L%want_resched, %r1
        !          1631:        stw     %r0, R%want_resched(%r1)
        !          1632:
        !          1633:        ldd     P_FORW(%arg1), %arg0
        !          1634:        std     %arg0, P_FORW(%arg2)
        !          1635:        std     %arg2, P_BACK(%arg0)
        !          1636:        std     %r0, P_BACK(%arg1)
        !          1637:
        !          1638:        ldil    L%whichqs, %r1
        !          1639:        vdepi   0, 1, %arg3
        !          1640:        sub,<>  %arg2, %arg0, %r0
        !          1641:        stw     %arg3, R%whichqs(%r1)
        !          1642:
        !          1643:        /* don't need &whichqs (t1) starting here */
        !          1644: #ifdef DIAGNOSTIC
        !          1645:        ldd     P_WCHAN(%arg1), %arg3
        !          1646:        comb,<>,n %r0, %arg3, switch_error
        !          1647:        copy    %arg1, %t2
        !          1648:        ldb     P_STAT(%arg1), %arg3
        !          1649:        comib,<>,n SRUN, %arg3, switch_error
        !          1650:        copy    %arg1, %arg2
        !          1651:        /*
        !          1652:         * Either we must be switching to the same process, or
        !          1653:         * the new process' kernel stack must be reasonable.
        !          1654:         */
        !          1655:        comb,=,n %arg1, %arg2, kstack_ok
        !          1656:        ldd     P_ADDR(%arg1), %arg0
        !          1657:        ldd     U_PCB+PCB_KSP(%arg0), %arg3
        !          1658:        ldo     NBPG(%arg0), %arg0
        !          1659:        comb,>>,n %arg0, %arg3, switch_error
        !          1660:        copy    %arg1, %arg2
        !          1661:        sub     %arg3, %arg0, %arg3
        !          1662:        ldil    L%USPACE, %arg0
        !          1663:        ldo     R%USPACE(%arg0), %arg0
        !          1664:        comb,<<=,n %arg0, %arg3, switch_error
        !          1665:        copy    %arg1, %arg2
        !          1666: kstack_ok
        !          1667: #endif
        !          1668:        ldi     SONPROC, %r1
        !          1669:        stb     %r1, P_STAT(%arg1)
        !          1670:        /* Skip context switch if same process. */
        !          1671:        comb,=,n %arg1, %arg2, switch_return
        !          1672:
        !          1673:        /* If old process exited, don't bother. */
        !          1674:        comb,=,n %r0, %arg2, switch_exited
        !          1675:
        !          1676:        /*
        !          1677:         * 2. save old proc context
        !          1678:         *
        !          1679:         * arg2: old proc
        !          1680:         */
        !          1681:        ldd     P_ADDR(%arg2), %r1
        !          1682:        /* save callee-save registers */
        !          1683:        std     %r4,   1*8(%r3)
        !          1684:        std     %sp, U_PCB+PCB_KSP(%r1)
        !          1685:        std     %r5,   2*8(%r3)
        !          1686:        std     %r6,   3*8(%r3)
        !          1687:        std     %r7,   4*8(%r3)
        !          1688:        std     %r8,   5*8(%r3)
        !          1689:        std     %r9,   6*8(%r3)
        !          1690:        std     %r10,  7*8(%r3)
        !          1691:        std     %r11,  8*8(%r3)
        !          1692:        std     %r12,  9*8(%r3)
        !          1693:        std     %r13, 10*8(%r3)
        !          1694:        std     %r14, 11*8(%r3)
        !          1695:        std     %r15, 12*8(%r3)
        !          1696:        std     %r16, 13*8(%r3)
        !          1697:        std     %r17, 14*8(%r3)
        !          1698:        std     %r18, 15*8(%r3)
        !          1699:        fdc     %r0(%r1)
        !          1700:        std     %r0, 1*8(ap)    /* say no trampoline */
        !          1701:        sync
        !          1702:
        !          1703:        /* don't need old curproc (arg2) starting from here */
        !          1704: switch_exited
        !          1705:        /*
        !          1706:         * 3. restore new proc context
        !          1707:         *
        !          1708:         * arg1: new proc
        !          1709:         */
        !          1710:        ldd     P_ADDR(%arg1), %arg3
        !          1711:        ldd     P_MD_REGS(%arg1), %r1
        !          1712:        ldd     U_PCB+PCB_KSP(%arg3), %sp
        !          1713:        mtctl   %r0, %cr10              /* ccr */
        !          1714:        ldd     TF_CR30(%r1), %arg2
        !          1715:        ldd     TF_PIDR2(%r1), %arg3
        !          1716:        mtctl   %arg2, %cr30
        !          1717:        mtctl   %arg3, %pidr2
        !          1718:        ldo     -(HPPA_FRAME_SIZE+20*8)(%sp), %r3
        !          1719:        ldo     -(HPPA_FRAME_SIZE)(%sp), ap
        !          1720:        ldd     0*8(ap), %arg0
        !          1721:        ldd     1*8(ap), %arg3          /* in case we're on trampoline */
        !          1722:        sub,*=  %r0, %arg3, %r0
        !          1723:        b,n     switch_gonnajump
        !          1724:        ldd      1*8(%r3), %r4
        !          1725:        ldd      2*8(%r3), %r5
        !          1726:        ldd      3*8(%r3), %r6
        !          1727:        ldd      4*8(%r3), %r7
        !          1728:        ldd      5*8(%r3), %r8
        !          1729:        ldd      6*8(%r3), %r9
        !          1730:        ldd      7*8(%r3), %r10
        !          1731:        ldd      8*8(%r3), %r11
        !          1732:        ldd      9*8(%r3), %r12
        !          1733:        ldd     10*8(%r3), %r13
        !          1734:        ldd     11*8(%r3), %r14
        !          1735:        ldd     12*8(%r3), %r15
        !          1736:        ldd     13*8(%r3), %r16
        !          1737:        ldd     14*8(%r3), %r17
        !          1738:        ldd     15*8(%r3), %r18
        !          1739: switch_gonnajump
        !          1740:        ldw     2*8(ap), %ret0          /* cpl */
        !          1741:        ldil    L%cpl, %r1
        !          1742:        stw     %ret0, R%cpl(%r1)
        !          1743:        sync
        !          1744:
        !          1745: switch_return
        !          1746:        mfctl   %cr24, %r1
        !          1747:        std     %arg1, CI_CURPROC(%r1)
        !          1748:        ldd     HPPA_FRAME_RP(%r3), %rp
        !          1749:        bv      0(%rp)
        !          1750:        ldd,mb  -(HPPA_FRAME_SIZE+20*8)(%sp), %r3
        !          1751: EXIT(cpu_switch)
        !          1752:
        !          1753:        .align  8
        !          1754:        .export switch_tramp_p, code
        !          1755: switch_tramp_p
        !          1756:        .dword  switch_trampoline
        !          1757:
        !          1758: ENTRY(switch_trampoline,0)
        !          1759:        /* ldd  0x18(%arg3), %r19       but we know we are in kernel! */
        !          1760:        ldd     0x10(%arg3), %arg3
        !          1761:        .call
        !          1762:        ble     0(%sr0, %arg3)
        !          1763:        copy    %r31, %rp
        !          1764:
        !          1765:        mfctl   %cr24, %arg1
        !          1766:        ldd     CI_CURPROC(%arg1), %r1
        !          1767:        b       $syscall_return
        !          1768:        ldd     P_MD_REGS(%r1), %arg0
        !          1769: EXIT(switch_trampoline)
        !          1770:
        !          1771: /*
        !          1772:  * Signal "trampoline" code. Invoked from RTE setup by sendsig().
        !          1773:  */
        !          1774: ENTRY(sigcode,0)
        !          1775:        ldd     0x18(%arg3), %r19
        !          1776:        ldd     0x10(%arg3), %arg3
        !          1777:        .call
        !          1778:        ble     0(%sr0, %arg3)
        !          1779:        copy    %r31, %rp
        !          1780:
        !          1781:        ldil    L%SYSCALLGATE, %r1
        !          1782:        copy    %r4, %arg0
        !          1783:        .call
        !          1784:        ble     4(%sr7, %r1)
        !          1785:        ldi     SYS_sigreturn, %r1
        !          1786:
        !          1787:        ldil    L%SYSCALLGATE, %r1
        !          1788:        copy    %ret0, %arg0
        !          1789:        .call
        !          1790:        ble     4(%sr7, %r1)
        !          1791:        ldi     SYS_exit, %r1
        !          1792: ALTENTRY(esigcode)
        !          1793: EXIT(sigcode)
        !          1794:
        !          1795: /*
        !          1796:  * struct cpu_info *curcpu(void);
        !          1797:  */
        !          1798: LEAF_ENTRY(curcpu)
        !          1799:        bv      %r0(%rp)
        !          1800:        mfctl   %cr24, %ret0
        !          1801: EXIT(curcpu)
        !          1802:
        !          1803: /*
        !          1804:  * int splraise(int newcpl);
        !          1805:  */
        !          1806: LEAF_ENTRY(splraise)
        !          1807:        bv      %r0(%rp)
        !          1808:        nop
        !          1809:
        !          1810:        extrd,u %arg0, 63, 32, %arg0
        !          1811: #ifdef DEBUG
        !          1812:        cmpib,<=,n NIPL, %arg0, splraise_ok
        !          1813:        copy    %arg0, %arg1
        !          1814:        ldil    L%splraise_fmt, %arg0
        !          1815:        b,l     panic, %rp
        !          1816:        ldo     R%splraise_fmt(%arg0), %arg0
        !          1817:        bv      %r0(%rp)
        !          1818:        ldi     IPL_HIGH, %ret0
        !          1819: splraise_fmt
        !          1820:        .asciz  "splraise(%d)"
        !          1821:        .align  8
        !          1822: splraise_ok
        !          1823: #endif
        !          1824:        sync
        !          1825:        mfctl   %eiem, %arg2
        !          1826:        mtctl   %r0, %eiem
        !          1827:        ldil    L%cpl, %r1
        !          1828:        ldw     R%cpl(%r1), %ret0
        !          1829:        ldil    L%imask, %arg3
        !          1830:        ldo     R%imask(%arg3), %arg3
        !          1831:        sub,<=  %arg0, %ret0, %r0
        !          1832:        ldd,s   %arg0(%arg3), %arg2
        !          1833:        sub,<=  %arg0, %ret0, %r0
        !          1834:        stw     %arg0, R%cpl(%r1)
        !          1835:        sync
        !          1836:        bv      %r0(%rp)
        !          1837:        mtctl   %arg2, %eiem
        !          1838: EXIT(splraise)
        !          1839:
        !          1840: /*
        !          1841:  * int spllower(int newcpl);
        !          1842:  */
        !          1843: LEAF_ENTRY(spllower)
        !          1844:        bv      %r0(%rp)
        !          1845:        nop
        !          1846:
        !          1847:        extrd,u %arg0, 63, 32, %arg0
        !          1848: #ifdef DEBUG
        !          1849:        cmpib,<=,n NIPL, %arg0, spllower_ok
        !          1850:        copy    %arg0, %arg1
        !          1851:        ldil    L%spllower_fmt, %arg0
        !          1852:        b,l     panic, %rp
        !          1853:        ldo     R%spllower_fmt(%arg0), %arg0
        !          1854:        bv      %r0(%rp)
        !          1855:        ldi     IPL_HIGH, %ret0
        !          1856: spllower_fmt
        !          1857:        .asciz  "spllower(%d)"
        !          1858:        .align  8
        !          1859: spllower_ok
        !          1860: #endif
        !          1861:        sync
        !          1862:        mfctl   %eiem, %arg2
        !          1863:        mtctl   %r0, %eiem
        !          1864:        ldil    L%cpl, %r1
        !          1865:        ldw     R%cpl(%r1), %ret0
        !          1866:        ldil    L%imask, %arg3
        !          1867:        ldo     R%imask(%arg3), %arg3
        !          1868:        sub,>=  %arg0, %ret0, %r0
        !          1869:        ldd,s   %arg0(%arg3), %arg2
        !          1870:        sub,>=  %arg0, %ret0, %r0
        !          1871:        stw     %arg0, R%cpl(%r1)
        !          1872:        sync
        !          1873:        bv      %r0(%rp)
        !          1874:        mtctl   %arg2, %eiem
        !          1875: EXIT(spllower)
        !          1876:
        !          1877:        .end

CVSweb