Annotation of qemu/roms/qemu-palcode/pal.S, revision 1.1

1.1     ! root        1: /* QEMU Emulation PALcode.
        !             2: 
        !             3:    Copyright (C) 2011 Richard Henderson
        !             4: 
        !             5:    This file is part of QEMU PALcode.
        !             6: 
        !             7:    This program is free software; you can redistribute it and/or modify
        !             8:    it under the terms of the GNU General Public License as published by
        !             9:    the Free Software Foundation; either version 2 of the License or
        !            10:    (at your option) any later version.
        !            11: 
        !            12:    This program is distributed in the hope that it will be useful,
        !            13:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the text
        !            15:    of the GNU General Public License for more details.
        !            16: 
        !            17:    You should have received a copy of the GNU General Public License
        !            18:    along with this program; see the file COPYING.  If not see
        !            19:    <http://www.gnu.org/licenses/>.  */
        !            20: 
        !            21:        .set            noat
        !            22:        .set            nomacro
        !            23:        .text
        !            24: 
        !            25: #include "pal.h"
        !            26: #include "osf.h"
        !            27: #include SYSTEM_H
        !            28: 
        !            29: /*
        !            30:  * Create a standard kernel entry stack frame.
        !            31:  */
        !            32: 
        !            33: .macro STACK_FRAME save_ps, save_pc, temp, do_ps
        !            34:        // Test if we're currently in user mode
        !            35:        and     \save_ps, PS_M_CM, \temp
        !            36:        beq     \temp, 0f
        !            37:        // Switch to kernel mode
        !            38: .ifne \do_ps
        !            39:        mtpr    $31, qemu_ps
        !            40: .endif
        !            41:        mtpr    $sp, qemu_usp
        !            42:        mfpr    $sp, ptKsp
        !            43:        // Allocate the stack frame
        !            44: 0:     lda     $sp, -FRM_K_SIZE($sp)
        !            45:        stq     \save_ps, FRM_Q_PS($sp)
        !            46:        stq     \save_pc, FRM_Q_PC($sp)
        !            47:        stq     $gp, FRM_Q_GP($sp)
        !            48:        stq     a0, FRM_Q_A0($sp)
        !            49:        stq     a1, FRM_Q_A1($sp)
        !            50:        stq     a2, FRM_Q_A2($sp)
        !            51: .endm
        !            52: 
        !            53: /*
        !            54:  * Allocate a 1 page stack for use by the console.
        !            55:  */
        !            56: #define STACK_SIZE     8192
        !            57: 
        !            58: /*
        !            59:  * QEMU emulator "hardware" entry points.
        !            60:  */
        !            61: 
        !            62: /*
        !            63:  * Reset
        !            64:  * 
        !            65:  * INPUT PARAMETERS:
        !            66:  * 
        !            67:  *     trap_arg0 = Memory size
        !            68:  *     trap_arg1 = Kernel entry (if loaded)
        !            69:  */ 
        !            70:         .org   0x0000
        !            71:        .globl  __start
        !            72: __start:
        !            73:        // Initialize GP.
        !            74:        br      $gp, .+4
        !            75:        ldah    $gp, 0($gp)                     !gpdisp!1
        !            76:        lda     $gp, 0($gp)                     !gpdisp!1
        !            77:        mtpr    $gp, ptPgp
        !            78: 
        !            79:        // Disable interrupts; kernel mode
        !            80:        lda     t0, IPL_K_HIGH
        !            81:        mtpr    t0, qemu_ps
        !            82: 
        !            83:        // Initialize Stack.
        !            84:        SYS_WHAMI a0
        !            85:        lda     t0, STACK_SIZE
        !            86:        addq    a0, 1, t1
        !            87:        mull    t0, t1, t0
        !            88:        ldah    t1, stack($gp)                  !gprelhigh
        !            89:        lda     t1, stack(t1)                   !gprellow
        !            90:        addq    t0, t1, $sp
        !            91: 
        !            92:        // Do any necessary system setup required for PALmode,
        !            93:        // e.g. setting up ptSys[01].
        !            94:        bsr     $26, Sys_Setup
        !            95: 
        !            96:        // Non-boot CPUs can go wait now.
        !            97:        bne     a0, 1f
        !            98: 
        !            99:        // Load boot arguments
        !           100:        mfpr    a0, qemu_trap_arg0
        !           101:        mfpr    a1, qemu_trap_arg1
        !           102:        mfpr    a2, qemu_trap_arg2
        !           103: 
        !           104:        // Continue in do_start, outside PALmode.
        !           105:        ldah    $27, do_start($gp)              !gprelhigh
        !           106:        lda     $27, do_start($27)              !gprellow
        !           107:        hw_ret  ($27)
        !           108: 
        !           109: 1:     ldah    $27, do_start_wait($gp)         !gprelhigh
        !           110:        lda     $27, do_start_wait($27)         !gprellow
        !           111:        hw_ret  ($27)
        !           112: ENDFN  __start
        !           113: 
        !           114: /*
        !           115:  * Machine Check
        !           116:  *
        !           117:  * INPUT PARAMETERS:
        !           118:  * 
        !           119:  *     trap_arg0 = 
        !           120:  *     trap_arg1 = 
        !           121:  *     trap_arg2 = 
        !           122:  */
        !           123:        .org    0x0080
        !           124: Pal_Mchk:
        !           125:        halt
        !           126: ENDFN  Pal_Mchk
        !           127: 
        !           128: /*
        !           129:  * Interprocessor Interrupt
        !           130:  *
        !           131:  * INPUT PARAMETERS:
        !           132:  *
        !           133:  *     trap_arg0 = 
        !           134:  *     trap_arg1 =
        !           135:  *     trap_arg2 =
        !           136:  *
        !           137:  * The interprocessor interrupt is special, in that PALcode is supposed
        !           138:  * to clear the interupt and not wait for the OS to do it.
        !           139:  */
        !           140:        .org    0x0100
        !           141: Pal_Smp_Interrupt:
        !           142:        mfpr    p6, qemu_exc_addr
        !           143: 
        !           144:        SYS_ACK_SMP p0, p1, p2
        !           145: 
        !           146:        mfpr    p0, qemu_ps
        !           147: 
        !           148:        STACK_FRAME p0, p6, p2, 0
        !           149: 
        !           150:        mov     IPL_K_IP, p0            // Raise IPL
        !           151:        mtpr    p0, qemu_ps
        !           152: 
        !           153:        mfpr    p6, ptEntInt
        !           154:        mfpr    $gp, ptKgp
        !           155:        lda     a0, INT_K_IP
        !           156:        lda     a1, 0
        !           157:        lda     a2, 0
        !           158: 
        !           159:        hw_ret  (p6)
        !           160: ENDFN  Pal_Smp_Interrupt
        !           161: 
        !           162: /*
        !           163:  * Clock Interrupt
        !           164:  *
        !           165:  * INPUT PARAMETERS:
        !           166:  *
        !           167:  *     trap_arg0 = 
        !           168:  *     trap_arg1 =
        !           169:  *     trap_arg2 =
        !           170:  *
        !           171:  * The clock interrupt is special, in that PALcode is supposed
        !           172:  * to clear the interupt and not wait for the OS to do it.
        !           173:  */
        !           174:        .org    0x0180
        !           175: Pal_Clk_Interrupt:
        !           176:        mfpr    p6, qemu_exc_addr
        !           177: 
        !           178:        SYS_ACK_CLK p0, p1, p2
        !           179: 
        !           180:        mfpr    p0, qemu_ps
        !           181: 
        !           182:        STACK_FRAME p0, p6, p2, 0
        !           183: 
        !           184:        mov     IPL_K_CLK, p0           // Raise IPL
        !           185:        mtpr    p0, qemu_ps
        !           186: 
        !           187:        mfpr    p6, ptEntInt
        !           188:        mfpr    $gp, ptKgp
        !           189:        lda     a0, INT_K_CLK
        !           190:        lda     a1, 0
        !           191:        lda     a2, 0
        !           192: 
        !           193: 9:     hw_ret  (p6)
        !           194: ENDFN  Pal_Clk_Interrupt
        !           195: 
        !           196: /*
        !           197:  * Device Interrupt
        !           198:  *
        !           199:  * INPUT PARAMETERS:
        !           200:  *
        !           201:  *     trap_arg0 = 
        !           202:  *     trap_arg1 =
        !           203:  *     trap_arg2 =
        !           204:  */ 
        !           205:        .org    0x0200
        !           206: Pal_Dev_Interrupt:
        !           207:        mfpr    p6, qemu_exc_addr
        !           208:        mfpr    p0, qemu_ps
        !           209: 
        !           210:        STACK_FRAME p0, p6, p2, 0
        !           211: 
        !           212:        mov     IPL_K_DEV1, p0          // Raise IPL
        !           213:        mtpr    p0, qemu_ps
        !           214: 
        !           215:        bsr     p7, Sys_Dev_Vector
        !           216: 
        !           217:        mfpr    p7, ptEntInt
        !           218:        mfpr    $gp, ptKgp
        !           219:        lda     a0, INT_K_DEV
        !           220:        lda     a2, 0
        !           221:        hw_ret  (p7)
        !           222: ENDFN  Pal_Dev_Interrupt
        !           223: 
        !           224: /*
        !           225:  * Memory Fault
        !           226:  *
        !           227:  * INPUT PARAMETERS:
        !           228:  *
        !           229:  *     trap_arg0 = faulting address
        !           230:  *     trap_arg1 = fault type (TNV, ACV, FOR, FOW, FOE)
        !           231:  *     trap_arg2 = access type (exec=-1, read=0, write=1)
        !           232:  */ 
        !           233:        .org    0x0280
        !           234: Pal_MMFault:
        !           235:        mfpr    p0, qemu_ps
        !           236:        mfpr    p6, qemu_exc_addr
        !           237:        blbs    p6, MchkBugCheck
        !           238: 
        !           239:        STACK_FRAME p0, p6, p2, 1
        !           240: 
        !           241:        mfpr    p0, ptEntMM
        !           242:        mfpr    $gp, ptKgp
        !           243:        mfpr    a0, qemu_trap_arg0
        !           244:        mfpr    a1, qemu_trap_arg1
        !           245:        mfpr    a2, qemu_trap_arg2
        !           246:        hw_ret  (p0)
        !           247: ENDFN  Pal_MMFault
        !           248: 
        !           249: /*
        !           250:  * Unaligned Data
        !           251:  * 
        !           252:  * INPUT PARAMETERS:
        !           253:  *
        !           254:  *     trap_arg0 = faulting address
        !           255:  *     trap_arg1 = opcode of faulting insn
        !           256:  *     trap_arg2 = src/dst register number
        !           257:  */ 
        !           258:        .org    0x0300
        !           259: Pal_Unalign:
        !           260:        mfpr    p0, qemu_ps
        !           261:        mfpr    p6, qemu_exc_addr
        !           262:        addq    p6, 4, p1               // increment past the faulting insn
        !           263:        blbs    p6, MchkBugCheck
        !           264: 
        !           265:        STACK_FRAME p0, p1, p2, 1
        !           266: 
        !           267:        mfpr    p0, ptEntUna
        !           268:        mfpr    $gp, ptKgp
        !           269:        mfpr    a0, qemu_trap_arg0
        !           270:        mfpr    a1, qemu_trap_arg1
        !           271:        mfpr    a2, qemu_trap_arg2
        !           272:        hw_ret  (p0)
        !           273: ENDFN  Pal_Unalign
        !           274: 
        !           275: /*
        !           276:  * Illegal Opcode
        !           277:  *
        !           278:  * INPUT PARAMETERS:
        !           279:  *
        !           280:  *     trap_arg0 = UNDEFINED
        !           281:  *     trap_arg1 = UNDEFINED
        !           282:  *     trap_arg2 = UNDEFINED
        !           283:  *
        !           284:  * OUTPUT PARAMETERS:
        !           285:  *
        !           286:  *     r16 (a0) = Instruction fault code
        !           287:  *     r17 (a1) = UNPREDICTABLE
        !           288:  *     r18 (a2) = UNPREDICTABLE
        !           289:  */ 
        !           290:        .org    0x0380
        !           291: Pal_OpcDec:
        !           292:        mfpr    p0, qemu_ps
        !           293:        mfpr    p6, qemu_exc_addr
        !           294:        addq    p6, 4, p1               // increment past the faulting insn
        !           295:        blbs    p6, MchkBugCheck
        !           296: 
        !           297:        STACK_FRAME p0, p1, p2, 1
        !           298: 
        !           299:        mfpr    p0, ptEntIF
        !           300:        mfpr    $gp, ptKgp
        !           301:        mov     IF_K_OPCDEC, a0
        !           302:        hw_ret  (p0)
        !           303: ENDFN  Pal_OpcDec
        !           304: 
        !           305: /*
        !           306:  * Arithmetic Trap
        !           307:  *
        !           308:  * INPUT PARAMETERS:
        !           309:  *
        !           310:  *     trap_arg0 = exception type
        !           311:  *     trap_arg1 = register modification mask
        !           312:  *     trap_arg2 = UNDEFINED
        !           313:  */
        !           314:        .org    0x0400
        !           315: Pal_Arith:
        !           316:        mfpr    p0, qemu_ps
        !           317:        mfpr    p6, qemu_exc_addr
        !           318:        blbs    p6, MchkBugCheck
        !           319: 
        !           320:        STACK_FRAME p0, p6, p2, 1
        !           321: 
        !           322:        mfpr    p0, ptEntArith
        !           323:        mfpr    $gp, ptKgp
        !           324:        mfpr    a0, qemu_trap_arg0
        !           325:        mfpr    a1, qemu_trap_arg1
        !           326:        hw_ret  (p0)
        !           327: ENDFN  Pal_Arith
        !           328: 
        !           329: /*
        !           330:  * Floating Point Disabled
        !           331:  *
        !           332:  * INPUT PARAMETERS:
        !           333:  *
        !           334:  *     trap_arg0 = UNDEFINED
        !           335:  *     trap_arg1 = UNDEFINED
        !           336:  *     trap_arg2 = UNDEFINED
        !           337:  *
        !           338:  * OUTPUT PARAMETERS:
        !           339:  *
        !           340:  *     r16 (a0) = Instruction fault code
        !           341:  *     r17 (a1) = UNPREDICTABLE
        !           342:  *     r18 (a2) = UNPREDICTABLE
        !           343:  */ 
        !           344:        .org    0x0480
        !           345: Pal_Fen:
        !           346:        mfpr    p0, qemu_ps
        !           347:        mfpr    p6, qemu_exc_addr
        !           348:        blbs    p6, MchkBugCheck
        !           349: 
        !           350:        STACK_FRAME p0, p6, p2, 1
        !           351: 
        !           352:        mfpr    p0, ptEntIF
        !           353:        mfpr    $gp, ptKgp
        !           354:        mov     IF_K_FEN, a0
        !           355:        hw_ret  (p0)
        !           356: ENDFN  Pal_Fen
        !           357: 
        !           358: /*
        !           359:  * OSF/1 Privileged CALL_PAL Entry Points
        !           360:  */
        !           361: 
        !           362: #define ORG_CALL_PAL_PRIV(X)   .org    0x1000+64*X
        !           363: 
        !           364: /*
        !           365:  * Halt
        !           366:  *
        !           367:  * SIDE EFFECTS:
        !           368:  *
        !           369:  *     We either power down the system or re-enter the console.
        !           370:  *     But given that we're not returning to the kernel, there's
        !           371:  *     no reason to continue processing in assembler.  Go to C.
        !           372:  */
        !           373:        ORG_CALL_PAL_PRIV(0x00)
        !           374: CallPal_Halt:
        !           375:        bsr     p7, UpdatePCB           // Save kernel data
        !           376:        lda     v0, HLT_K_SW_HALT       // FIXME store this somewhere.
        !           377: 
        !           378:        mtpr    $31, qemu_halt
        !           379: 
        !           380:        br      Sys_EnterConsole
        !           381: ENDFN  CallPal_Halt
        !           382: 
        !           383: /*
        !           384:  * Cache Flush
        !           385:  *
        !           386:  * For QEMU, this is of course a no-op.
        !           387:  */
        !           388:        ORG_CALL_PAL_PRIV(0x01)
        !           389: CallPal_Cflush:
        !           390:        hw_rei
        !           391: ENDFN  CallPal_Cflush
        !           392: 
        !           393: /*
        !           394:  * Drain Aborts
        !           395:  *
        !           396:  * For QEMU, this is of course a no-op.
        !           397:  */
        !           398:         ORG_CALL_PAL_PRIV(0x02)
        !           399: CallPal_Draina:
        !           400:        hw_rei
        !           401: ENDFN  CallPal_Draina
        !           402: 
        !           403:        ORG_CALL_PAL_PRIV(0x03)
        !           404: CallPal_OpcDec03:
        !           405:        br      CallPal_OpcDec
        !           406: ENDFN  CallPal_OpcDec03
        !           407: 
        !           408:        ORG_CALL_PAL_PRIV(0x04)
        !           409: CallPal_OpcDec04:
        !           410:        br      CallPal_OpcDec
        !           411: ENDFN  CallPal_OpcDec04
        !           412: 
        !           413:        ORG_CALL_PAL_PRIV(0x05)
        !           414: CallPal_OpcDec05:
        !           415:        br      CallPal_OpcDec
        !           416: ENDFN  CallPal_OpcDec05
        !           417: 
        !           418:        ORG_CALL_PAL_PRIV(0x06)
        !           419: CallPal_OpcDec06:
        !           420:        br      CallPal_OpcDec
        !           421: ENDFN  CallPal_OpcDec06
        !           422: 
        !           423:        ORG_CALL_PAL_PRIV(0x07)
        !           424: CallPal_OpcDec07:
        !           425:        br      CallPal_OpcDec
        !           426: ENDFN  CallPal_OpcDec07
        !           427: 
        !           428:        ORG_CALL_PAL_PRIV(0x08)
        !           429: CallPal_OpcDec08:
        !           430:        br      CallPal_OpcDec
        !           431: ENDFN  CallPal_OpcDec08
        !           432: 
        !           433: /*
        !           434:  * Console Service
        !           435:  * 
        !           436:  * INPUT PARAMETERS:
        !           437:  * 
        !           438:  *     r16 (a0)          = Option selector
        !           439:  *     r17..r21 (a1..a5) = Implementation specific entry parameters
        !           440:  *
        !           441:  * SIDE EFFECTS:
        !           442:  *
        !           443:  *     Registers a0..a5, and v0 are UNPREDICTABLE upon return.
        !           444:  */ 
        !           445:        ORG_CALL_PAL_PRIV(0x09)
        !           446: CallPal_Cserve:
        !           447:        // Most of the entries are densely clustered around 0.
        !           448:        mov     0, v0
        !           449:        cmpule  a0, 6, p0
        !           450:        cmovne  p0, a0, v0
        !           451:        br      p0, 1f
        !           452: 1:     lda     p0, Cserve_Table-1b(p0)
        !           453:        s8addq  v0, p0, p0
        !           454:        jmp     $31, (p0), 0
        !           455: ENDFN  CallPal_Cserve
        !           456: 
        !           457:        .text   1
        !           458:        .align  3
        !           459: /* Note that the entries in the following table are all 2 insns.
        !           460:    The first entry is unused, and is also where all out-of-range
        !           461:    commands are vectored.  */
        !           462: Cserve_Table:
        !           463:        br      CallPal_Cserve_Cont
        !           464:        nop
        !           465: Cserve_Ldqp:
        !           466:        ldq_p   v0, 0(a1)
        !           467:        hw_rei
        !           468: ENDFN  Cserve_Ldqp
        !           469: Cserve_Stqp:
        !           470:        stq_p   a2, 0(a1)
        !           471:        hw_rei
        !           472: ENDFN  Cserve_Stqp
        !           473: Cserve_Get_Wall_Time:
        !           474:        mfpr    v0, qemu_walltime
        !           475:        hw_rei
        !           476: ENDFN  Cserve_Get_Wall_Time
        !           477: Cserve_Get_Alarm:
        !           478:        mfpr    v0, qemu_alarm
        !           479:        hw_rei
        !           480: ENDFN  Cserve_Get_Alarm
        !           481: Cserve_Set_Alarm_Rel:
        !           482:        // Cheating here: create the absolute time and fall thru.
        !           483:        mfpr    p0, qemu_walltime
        !           484:        addq    p0, a1, a1
        !           485: ENDFN  Cserve_Set_Alarm_Rel
        !           486: Cserve_Set_Alarm_Abs:
        !           487:        mtpr    a1, qemu_alarm
        !           488:        hw_rei
        !           489: ENDFN  Cserve_Set_Alarm_Abs
        !           490: 
        !           491: CallPal_Cserve_Cont:
        !           492:        // ??? For SRM compatibility and their use within Linux, use 52/53
        !           493:        // for these.  Anyone know what other "standard" SRM Cserve entry
        !           494:        // points are?  Certainly we don't want to be compatible with MILO,
        !           495:        // which puts the selector at A2.
        !           496:        cmpeq   a0, 52, v0
        !           497:        bne     v0, Cserve_Ena
        !           498:        cmpeq   a0, 53, v0
        !           499:        bne     v0, Cserve_Dis
        !           500:        hw_rei
        !           501: ENDFN  CallPal_Cserve_Cont
        !           502:        .previous
        !           503: 
        !           504: /*
        !           505:  * Swap PALcode
        !           506:  *
        !           507:  * FUNCTIONAL DESCRIPTION:
        !           508:  *
        !           509:  *     The swap PALcode (swppal) function replaces the current 
        !           510:  *     (active) PALcode by the specified new PALcode image.  
        !           511:  *     This function is intended for use by operating systems 
        !           512:  *     only during bootstraps and restarts, or during transitions 
        !           513:  *     to console I/O mode.
        !           514:  * 
        !           515:  *     The PALcode descriptor passed in a0 is interpreted as
        !           516:  *     either a PALcode variant or the base physical address
        !           517:  *     of the new PALcode image.  If a variant, the PALcode
        !           518:  *     image must have been previously loaded.  No PALcode
        !           519:  *     loading occurs as a result of this function. 
        !           520:  *
        !           521:  *     NOTE:
        !           522:  *     This implementation of SWPPAL does not support PALcode
        !           523:  *     variants.  If a variant is specified in a0, a check is
        !           524:  *     performed to determine whether the variant is OSF/1 or
        !           525:  *     not and the returned status is either unknown variant
        !           526:  *     (if not OSF/1) or variant not loaded.
        !           527:  *
        !           528:  * INPUT PARAMETERS:
        !           529:  *
        !           530:  *     r16 (a0) = New PALcode variant or base physical address
        !           531:  *     r17 (a1) = New PC
        !           532:  *     r18 (a2) = New PCB
        !           533:  *     r19 (a3) = New VptPtr
        !           534:  * 
        !           535:  * OUTPUT PARAMETERS:
        !           536:  *
        !           537:  *     r0 (v0) = Returned status indicating:
        !           538:  *                     0 - Success (PALcode was switched)
        !           539:  *                     1 - Unknown PALcode variant
        !           540:  *                     2 - Known PALcode variant, but PALcode not loaded
        !           541:  *
        !           542:  *     r26 (ra) = r27 (pv) = New PC
        !           543:  *             Note that this is non-architected, but is relied on by
        !           544:  *             the usage of SwpPal within our own console code in order
        !           545:  *             to simplify its use within C code.
        !           546:  *
        !           547:  */
        !           548:        ORG_CALL_PAL_PRIV(0x0A)
        !           549: CallPal_SwpPal:
        !           550:        // Save a copy of the return address in case of machine check.
        !           551:        mfpr    p6, qemu_exc_addr
        !           552: 
        !           553:        // Accept swapping to OSF PALcode.  The side effect here is to
        !           554:        // load the other parameters for the kernel.
        !           555:        cmpeq   a0, 2, v0
        !           556:        bne     v0, CallPal_SwpPal_Cont
        !           557: 
        !           558:        // Return as an unknown PALcode variant
        !           559:        mov     1, v0
        !           560:        hw_rei
        !           561: ENDFN  CallPal_SwpPal
        !           562: 
        !           563:        .text   1
        !           564: CallPal_SwpPal_Cont:
        !           565:        rpcc    p0
        !           566:        mtpr    a2, ptPcbb
        !           567:        mtpr    a3, qemu_vptptr
        !           568: 
        !           569:        ldq_p   $sp, PCB_Q_KSP(a2)
        !           570:        ldq_p   t0, PCB_Q_USP(a2)
        !           571:        ldq_p   t1, PCB_Q_PTBR(a2)
        !           572:        ldl_p   t2, PCB_L_PCC(a2)
        !           573:        ldq_p   t3, PCB_Q_UNIQUE(a2)
        !           574:        ldq_p   t4, PCB_Q_FEN(a2)
        !           575: 
        !           576:        mtpr    t0, qemu_usp
        !           577: 
        !           578:        sll     t1, VA_S_OFF, t1
        !           579:        mtpr    t1, qemu_ptbr
        !           580: 
        !           581:        subl    t2, p0, t2
        !           582:        mtpr    t2, qemu_pcc_ofs
        !           583: 
        !           584:        mtpr    t3, qemu_unique
        !           585: 
        !           586:        and     t4, 1, t4
        !           587:        mtpr    t4, qemu_fen
        !           588: 
        !           589:        mtpr    $31, qemu_tbia          // Flush TLB for new PTBR
        !           590: 
        !           591:        mov     a1, $26
        !           592:        mov     a1, $27
        !           593:        hw_ret  (a1)
        !           594: ENDFN  CallPal_SwpPal_Cont
        !           595:        .previous
        !           596: 
        !           597:        ORG_CALL_PAL_PRIV(0x0B)
        !           598: CallPal_OpcDec0B:
        !           599:        br      CallPal_OpcDec
        !           600: ENDFN  CallPal_OpcDec0B
        !           601: 
        !           602:        ORG_CALL_PAL_PRIV(0x0C)
        !           603: CallPal_OpcDec0C:
        !           604:        br      CallPal_OpcDec
        !           605: ENDFN  CallPal_OpcDec0C
        !           606: 
        !           607: /*
        !           608:  * Write Interprocessor Interrupt Request
        !           609:  *
        !           610:  * INPUT PARAMETERS:
        !           611:  *
        !           612:  *     r16 (a0) = target processor number 
        !           613:  * 
        !           614:  * OUTPUT PARAMETERS:
        !           615:  *
        !           616:  * SIDE EFFECTS:
        !           617:  * 
        !           618:  */ 
        !           619:         ORG_CALL_PAL_PRIV(0x0D)
        !           620: CallPal_WrIpir:
        !           621:        // Save a copy of the return address in case of machine check.
        !           622:        mfpr    p6, qemu_exc_addr
        !           623: 
        !           624:        SYS_WRIPIR      a0, p0, p1, p2
        !           625: 
        !           626:        hw_rei
        !           627: ENDFN  CallPal_WrIpir
        !           628: 
        !           629:        ORG_CALL_PAL_PRIV(0x0E)
        !           630: CallPal_OpcDec0E:
        !           631:        br      CallPal_OpcDec
        !           632: ENDFN  CallPal_OpcDec0E
        !           633: 
        !           634:        ORG_CALL_PAL_PRIV(0x0F)
        !           635: CallPal_OpcDec0F:
        !           636:        br      CallPal_OpcDec
        !           637: ENDFN  CallPal_OpcDec0F
        !           638: 
        !           639: /*
        !           640:  * Read Machine Check Error Summary
        !           641:  *
        !           642:  * INPUT PARAMETERS:
        !           643:  * 
        !           644:  * OUTPUT PARAMETERS:
        !           645:  *
        !           646:  *     r0 (v0) = returned MCES value
        !           647:  * 
        !           648:  * SIDE EFFECTS:
        !           649:  *
        !           650:  */ 
        !           651:         ORG_CALL_PAL_PRIV(0x10)
        !           652: CallPal_RdMces:
        !           653:        mfpr    v0, ptMces              // Get current MCES value
        !           654:        and     v0, MCES_M_ALL, v0      // Clear all other bits
        !           655:        hw_rei
        !           656: ENDFN  CallPal_RdMces
        !           657: 
        !           658: /*
        !           659:  * Write Machine Check Error Summary
        !           660:  *
        !           661:  * INPUT PARAMETERS:
        !           662:  * 
        !           663:  *     r16 (a0) = MCES<DPC> <- a0<3>,  MCES<DSC> <- a0<4>
        !           664:  * 
        !           665:  * OUTPUT PARAMETERS:
        !           666:  *
        !           667:  * SIDE EFFECTS:
        !           668:  *
        !           669:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !           670:  */ 
        !           671:         ORG_CALL_PAL_PRIV(0x11)
        !           672: CallPal_WrMces:
        !           673:        // Clear MIP, SCE, PCE
        !           674:        and     a0, (MCES_M_MIP | MCES_M_SCE | MCES_M_PCE), p0
        !           675:        mfpr    p1, ptMces
        !           676:        bic     p1, p0, p1
        !           677: 
        !           678:        // Copy DPC and DSC
        !           679:        and     a0, (MCES_M_DPC | MCES_M_DSC), p0
        !           680:        bic     p1, (MCES_M_DPC | MCES_M_DSC), p1
        !           681:        or      p1, p0, p1
        !           682: 
        !           683:        mtpr    p1, ptMces
        !           684:        hw_rei
        !           685: ENDFN  CallPal_WrMces
        !           686: 
        !           687:        ORG_CALL_PAL_PRIV(0x12)
        !           688: CallPal_OpcDec12:
        !           689:        br      CallPal_OpcDec
        !           690: ENDFN  CallPal_OpcDec12
        !           691: 
        !           692:        ORG_CALL_PAL_PRIV(0x13)
        !           693: CallPal_OpcDec13:
        !           694:        br      CallPal_OpcDec
        !           695: ENDFN  CallPal_OpcDec13
        !           696: 
        !           697:        ORG_CALL_PAL_PRIV(0x14)
        !           698: CallPal_OpcDec14:
        !           699:        br      CallPal_OpcDec
        !           700: ENDFN  CallPal_OpcDec14
        !           701: 
        !           702:        ORG_CALL_PAL_PRIV(0x15)
        !           703: CallPal_OpcDec15:
        !           704:        br      CallPal_OpcDec
        !           705: ENDFN  CallPal_OpcDec15
        !           706: 
        !           707:        ORG_CALL_PAL_PRIV(0x16)
        !           708: CallPal_OpcDec16:
        !           709:        br      CallPal_OpcDec
        !           710: ENDFN  CallPal_OpcDec16
        !           711: 
        !           712:        ORG_CALL_PAL_PRIV(0x17)
        !           713: CallPal_OpcDec17:
        !           714:        br      CallPal_OpcDec
        !           715: ENDFN  CallPal_OpcDec17
        !           716: 
        !           717:        ORG_CALL_PAL_PRIV(0x18)
        !           718: CallPal_OpcDec18:
        !           719:        br      CallPal_OpcDec
        !           720: ENDFN  CallPal_OpcDec18
        !           721: 
        !           722:        ORG_CALL_PAL_PRIV(0x19)
        !           723: CallPal_OpcDec19:
        !           724:        br      CallPal_OpcDec
        !           725: ENDFN  CallPal_OpcDec19
        !           726: 
        !           727:        ORG_CALL_PAL_PRIV(0x1A)
        !           728: CallPal_OpcDec1A:
        !           729:        br      CallPal_OpcDec
        !           730: ENDFN  CallPal_OpcDec1A
        !           731: 
        !           732:        ORG_CALL_PAL_PRIV(0x1B)
        !           733: CallPal_OpcDec1B:
        !           734:        br      CallPal_OpcDec
        !           735: ENDFN  CallPal_OpcDec1B
        !           736: 
        !           737:        ORG_CALL_PAL_PRIV(0x1C)
        !           738: CallPal_OpcDec1C:
        !           739:        br      CallPal_OpcDec
        !           740: ENDFN  CallPal_OpcDec1C
        !           741: 
        !           742:        ORG_CALL_PAL_PRIV(0x1D)
        !           743: CallPal_OpcDec1D:
        !           744:        br      CallPal_OpcDec
        !           745: ENDFN  CallPal_OpcDec1D
        !           746: 
        !           747:        ORG_CALL_PAL_PRIV(0x1E)
        !           748: CallPal_OpcDec1E:
        !           749:        br      CallPal_OpcDec
        !           750: ENDFN  CallPal_OpcDec1E
        !           751: 
        !           752:        ORG_CALL_PAL_PRIV(0x1F)
        !           753: CallPal_OpcDec1F:
        !           754:        br      CallPal_OpcDec
        !           755: ENDFN  CallPal_OpcDec1F
        !           756: 
        !           757:        ORG_CALL_PAL_PRIV(0x20)
        !           758: CallPal_OpcDec20:
        !           759:        br      CallPal_OpcDec
        !           760: ENDFN  CallPal_OpcDec20
        !           761: 
        !           762:        ORG_CALL_PAL_PRIV(0x21)
        !           763: CallPal_OpcDec21:
        !           764:        br      CallPal_OpcDec
        !           765: ENDFN  CallPal_OpcDec21
        !           766: 
        !           767:        ORG_CALL_PAL_PRIV(0x22)
        !           768: CallPal_OpcDec22:
        !           769:        br      CallPal_OpcDec
        !           770: ENDFN  CallPal_OpcDec22
        !           771: 
        !           772:        ORG_CALL_PAL_PRIV(0x23)
        !           773: CallPal_OpcDec23:
        !           774:        br      CallPal_OpcDec
        !           775: ENDFN  CallPal_OpcDec23
        !           776: 
        !           777:        ORG_CALL_PAL_PRIV(0x24)
        !           778: CallPal_OpcDec24:
        !           779:        br      CallPal_OpcDec
        !           780: ENDFN  CallPal_OpcDec24
        !           781: 
        !           782:        ORG_CALL_PAL_PRIV(0x25)
        !           783: CallPal_OpcDec25:
        !           784:        br      CallPal_OpcDec
        !           785: ENDFN  CallPal_OpcDec25
        !           786: 
        !           787:        ORG_CALL_PAL_PRIV(0x26)
        !           788: CallPal_OpcDec26:
        !           789:        br      CallPal_OpcDec
        !           790: ENDFN  CallPal_OpcDec26
        !           791: 
        !           792:        ORG_CALL_PAL_PRIV(0x27)
        !           793: CallPal_OpcDec27:
        !           794:        br      CallPal_OpcDec
        !           795: ENDFN  CallPal_OpcDec27
        !           796: 
        !           797:        ORG_CALL_PAL_PRIV(0x28)
        !           798: CallPal_OpcDec28:
        !           799:        br      CallPal_OpcDec
        !           800: ENDFN  CallPal_OpcDec28
        !           801: 
        !           802:        ORG_CALL_PAL_PRIV(0x29)
        !           803: CallPal_OpcDec29:
        !           804:        br      CallPal_OpcDec
        !           805: ENDFN  CallPal_OpcDec29
        !           806: 
        !           807:        ORG_CALL_PAL_PRIV(0x2A)
        !           808: CallPal_OpcDec2A:
        !           809:        br      CallPal_OpcDec
        !           810: ENDFN  CallPal_OpcDec2A
        !           811: 
        !           812: /*
        !           813:  * Write Floating Point Enable
        !           814:  *
        !           815:  * INPUT PARAMETERS:
        !           816:  * 
        !           817:  *     r16 (a0) = ICSR<FPE> <- a0<0>
        !           818:  * 
        !           819:  * SIDE EFFECTS:
        !           820:  *
        !           821:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !           822:  */ 
        !           823:         ORG_CALL_PAL_PRIV(0x2B)
        !           824: CallPal_WrFen:
        !           825:        mfpr    p0, ptPcbb              // Get PCBB
        !           826:        and     a0, 1, a0               // Clean new FEN value to single bit
        !           827:        mtpr    a0, qemu_fen
        !           828:        stl_p   a0, PCB_Q_FEN(p0)       // Write new PCB<FEN>
        !           829:        hw_rei
        !           830: ENDFN  CallPal_WrFen
        !           831: 
        !           832:        ORG_CALL_PAL_PRIV(0x2C)
        !           833: CallPal_OpcDec2C:
        !           834:        br      CallPal_OpcDec
        !           835: ENDFN  CallPal_OpcDec2C
        !           836: 
        !           837: /*
        !           838:  * Write Virtual Page Table Pointer
        !           839:  *
        !           840:  * INPUT PARAMETERS:
        !           841:  *
        !           842:  *     r16 (a0) = New virtual page table pointer 
        !           843:  *
        !           844:  * SIDE EFFECTS:
        !           845:  *
        !           846:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !           847:  */ 
        !           848:         ORG_CALL_PAL_PRIV(0x2D)
        !           849: CallPal_WrVptPtr:
        !           850:        mtpr    a0, qemu_vptptr
        !           851:        hw_rei
        !           852: ENDFN  CallPal_WrVptPtr
        !           853: 
        !           854:        ORG_CALL_PAL_PRIV(0x2E)
        !           855: CallPal_OpcDec2E:
        !           856:        br      CallPal_OpcDec
        !           857: ENDFN  CallPal_OpcDec2E
        !           858: 
        !           859:        ORG_CALL_PAL_PRIV(0x2F)
        !           860: CallPal_OpcDec2F:
        !           861:        br      CallPal_OpcDec
        !           862: ENDFN  CallPal_OpcDec2F
        !           863: 
        !           864: /*
        !           865:  * Swap Process Context
        !           866:  *
        !           867:  * FUNCTIONAL DESCRIPTION:
        !           868:  *
        !           869:  *     The swap process context (swpctx) function saves 
        !           870:  *     the current process data in the current PCB, then 
        !           871:  *     switches to the PCB passed in a0 and loads the
        !           872:  *     new process context.  The old PCB is returned in v0.    
        !           873:  * 
        !           874:  * INPUT PARAMETERS:
        !           875:  * 
        !           876:  *     r16 (a0) = New PCBB 
        !           877:  * 
        !           878:  * OUTPUT PARAMETERS:
        !           879:  *
        !           880:  *     r0  (v0) = Old PCBB
        !           881:  * 
        !           882:  * SIDE EFFECTS:
        !           883:  *
        !           884:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !           885:  */ 
        !           886:        ORG_CALL_PAL_PRIV(0x30)
        !           887: CallPal_SwpCtx:
        !           888:        rpcc    p5                      // Get cycle counter
        !           889:        mfpr    p6, qemu_exc_addr       // Save exc_addr for machine check
        !           890: 
        !           891:        mfpr    v0, ptPcbb              // Get current PCBB
        !           892:        mtpr    a0, ptPcbb              // Save new PCBB
        !           893:        srl     p5, 32, p7              // Move CC<OFFSET> to low longword
        !           894: 
        !           895:        addl    p5, p7, p7              // Accumulate time for old pcb
        !           896:        stl_p   p7, PCB_L_PCC(v0)
        !           897: 
        !           898:        ldl_p   t9, PCB_L_PCC(a0)       // Get new PCC
        !           899:        subl    t9, p5, p5              // Generate and ...
        !           900:        mtpr    p5, qemu_pcc_ofs        // .. set new CC<OFFSET> bits
        !           901: 
        !           902:        stq_p   $sp, PCB_Q_KSP(v0)      // Store old kernel stack pointer
        !           903:        mfpr    t10, qemu_usp           // Save old user stack pointer
        !           904:        stq_p   t10, PCB_Q_USP(v0)
        !           905: 
        !           906:        br      CallPal_SwpCtx_Cont
        !           907: ENDFN  CallPal_SwpCtx
        !           908: 
        !           909:        .text   1
        !           910: CallPal_SwpCtx_Cont:
        !           911:        ldq_p   $sp, PCB_Q_KSP(a0)      // Install new stack pointers
        !           912:        ldq_p   t10, PCB_Q_USP(a0)
        !           913:        mtpr    t10, qemu_usp
        !           914: 
        !           915:        mfpr    t10, qemu_unique        // Save old unique value
        !           916:        stq_p   t10, PCB_Q_UNIQUE(v0)
        !           917:        ldq_p   t10, PCB_Q_UNIQUE(a0)   // Install new unique value
        !           918:        mtpr    t10, qemu_unique
        !           919: 
        !           920:        ldq_p   t8, PCB_Q_FEN(a0)       // Install new FEN
        !           921:        and     t8, 1, t8
        !           922:        mtpr    t8, qemu_fen
        !           923: 
        !           924:        // QEMU does not implement an ASN; skip that.
        !           925: 
        !           926:        ldq_p   t10, PCB_Q_PTBR(a0)     // Install new page tables
        !           927:        sll     t10, VA_S_OFF, t10
        !           928:        mtpr    t10, qemu_ptbr
        !           929:        mtpr    $31, qemu_tbia          // Flush TLB, since we don't do ASNs
        !           930: 
        !           931:        hw_rei
        !           932: ENDFN  CallPal_SwpCtx_Cont
        !           933:        .previous
        !           934: 
        !           935: /*
        !           936:  * Write System Value
        !           937:  *
        !           938:  * INPUT PARAMETERS:
        !           939:  *
        !           940:  *     r16 (a0) = New system value 
        !           941:  * 
        !           942:  * SIDE EFFECTS:
        !           943:  *
        !           944:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !           945:  */ 
        !           946:         ORG_CALL_PAL_PRIV(0x31)
        !           947: CallPal_WrVal:
        !           948:        mtpr    a0, qemu_sysval
        !           949:        hw_rei
        !           950: ENDFN  CallPal_WrVal
        !           951: 
        !           952: /*
        !           953:  * Read System Value
        !           954:  *
        !           955:  * OUTPUT PARAMETERS:
        !           956:  *
        !           957:  *     r0 (v0) = Returned system value
        !           958:  * 
        !           959:  * SIDE EFFECTS:
        !           960:  *
        !           961:  *     Registers t0 and t8..t11 are UNPREDICTABLE upon return.
        !           962:  */ 
        !           963:         ORG_CALL_PAL_PRIV(0x32)
        !           964: CallPal_RdVal:
        !           965:        mfpr    v0, qemu_sysval
        !           966:        hw_rei
        !           967: ENDFN  CallPal_RdVal
        !           968: 
        !           969: /*
        !           970:  * Translation Buffer Invalidate
        !           971:  * 
        !           972:  * INPUT PARAMETERS:
        !           973:  * 
        !           974:  *     r16 (a0) = tbi selector type:
        !           975:  *
        !           976:  *             -2 - Flush all TB entries (tbia)
        !           977:  *             -1 - Invalidate all TB entries with ASM=0 (tbiap)
        !           978:  *              1 - Invalidate ITB entry for va=a1 (tbisi)
        !           979:  *              2 - Invalidate DTB entry for va=a1 (tbisd)
        !           980:  *              3 - Invalidate both ITB and DTB entry for va=a1 (tbis)
        !           981:  *
        !           982:  *     r17 (a1) = VA for TBISx types
        !           983:  *
        !           984:  * Qemu does not implement ASNs or split I/D tlbs.  Therefore these
        !           985:  * collapse to tbia and tbis.
        !           986:  * 
        !           987:  * SIDE EFFECTS:
        !           988:  *
        !           989:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !           990:  */ 
        !           991:         ORG_CALL_PAL_PRIV(0x33)
        !           992: CallPal_Tbi:
        !           993:        bge     a0, 1f
        !           994: 
        !           995:        mtpr    $31, qemu_tbia
        !           996:        hw_rei
        !           997: 
        !           998: 1:     mtpr    a1, qemu_tbis
        !           999:        hw_rei
        !          1000: ENDFN  CallPal_Tbi
        !          1001: 
        !          1002: /*
        !          1003:  * Write System Entry Address
        !          1004:  *
        !          1005:  * INPUT PARAMETERS:
        !          1006:  *
        !          1007:  *     r16 (a0) = VA of system entry point
        !          1008:  *     r17 (a1) = System entry point selector 
        !          1009:  * 
        !          1010:  * SIDE EFFECTS:
        !          1011:  *
        !          1012:  *     Registers t0, t8..t11, and a0..a1 are UNPREDICTABLE
        !          1013:  *     upon return.
        !          1014:  */ 
        !          1015:         ORG_CALL_PAL_PRIV(0x34)
        !          1016: CallPal_WrEnt:
        !          1017:        andnot  a0, 3, a0               // Clean PC<1:0>
        !          1018: 
        !          1019:        cmpult  a1, 6, t8               // Bound the input
        !          1020:        cmoveq  t8, 6, a1
        !          1021: 
        !          1022:        br      t0, 1f
        !          1023: 1:     lda     t0, WrEnt_Table-1b(t0)
        !          1024:        s8addq  a1, t0, t0
        !          1025:        jmp     $31, (t0), 0
        !          1026: ENDFN  CallPal_WrEnt
        !          1027: 
        !          1028:        .text   1
        !          1029: WrEnt_Table:
        !          1030: 0:     mtpr    a0, ptEntInt
        !          1031:        hw_rei
        !          1032: 1:     mtpr    a0, ptEntArith
        !          1033:        hw_rei
        !          1034: 2:     mtpr    a0, ptEntMM
        !          1035:        hw_rei
        !          1036: 3:     mtpr    a0, ptEntIF
        !          1037:        hw_rei
        !          1038: 4:     mtpr    a0, ptEntUna
        !          1039:        hw_rei
        !          1040: 5:     mtpr    a0, ptEntSys
        !          1041:        hw_rei
        !          1042: 6:     nop
        !          1043:        hw_rei
        !          1044: ENDFN  WrEnt_Table
        !          1045:        .previous
        !          1046: 
        !          1047: /*
        !          1048:  * Swap Interrupt Priority Level
        !          1049:  * 
        !          1050:  * INPUT PARAMETERS:
        !          1051:  * 
        !          1052:  *     r16 (a0) = New IPL
        !          1053:  * 
        !          1054:  * OUTPUT PARAMETERS:
        !          1055:  *
        !          1056:  *     r0  (v0) = Old IPL
        !          1057:  * 
        !          1058:  * SIDE EFFECTS:
        !          1059:  *
        !          1060:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !          1061:  */ 
        !          1062:         ORG_CALL_PAL_PRIV(0x35)
        !          1063: CallPal_SwpIpl:
        !          1064:        mfpr    v0, qemu_ps
        !          1065:        and     a0, PS_M_IPL, a0
        !          1066:        and     v0, PS_M_IPL, v0
        !          1067:        mtpr    a0, qemu_ps
        !          1068:        hw_rei
        !          1069: ENDFN  CallPal_SwpIpl
        !          1070: 
        !          1071: /*
        !          1072:  * Read Processor Status
        !          1073:  *
        !          1074:  * OUTPUT PARAMETERS:
        !          1075:  *
        !          1076:  *     r0 (v0) = Current PS
        !          1077:  * 
        !          1078:  * SIDE EFFECTS:
        !          1079:  *
        !          1080:  *     Registers t0, t8..t11 are UNPREDICTABLE upon return.
        !          1081:  */ 
        !          1082:         ORG_CALL_PAL_PRIV(0x36)
        !          1083: CallPal_RdPs:
        !          1084:        mfpr    v0, qemu_ps
        !          1085:        hw_rei
        !          1086: ENDFN  CallPal_RdPs
        !          1087: 
        !          1088: /*
        !          1089:  * Write Kernel Global Pointer
        !          1090:  *
        !          1091:  * INPUT PARAMETERS:
        !          1092:  * 
        !          1093:  *     r16 (a0) = New KGP value
        !          1094:  *
        !          1095:  * SIDE EFFECTS:
        !          1096:  *
        !          1097:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !          1098:  */ 
        !          1099:         ORG_CALL_PAL_PRIV(0x37)
        !          1100: CallPal_WrKgp:
        !          1101:        mtpr    a0, ptKgp
        !          1102:        hw_rei
        !          1103: ENDFN  CallPal_WrKgp
        !          1104: 
        !          1105: /*
        !          1106:  * Write User Stack Pointer
        !          1107:  * 
        !          1108:  * INPUT PARAMETERS:
        !          1109:  * 
        !          1110:  *     r16 (a0) = New user stack pointer value
        !          1111:  * 
        !          1112:  * SIDE EFFECTS:
        !          1113:  *
        !          1114:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !          1115:  */ 
        !          1116:         ORG_CALL_PAL_PRIV(0x38)
        !          1117: CallPal_WrUsp:
        !          1118:        mtpr    a0, qemu_usp
        !          1119:        hw_rei
        !          1120: ENDFN  CallPal_WrUsp
        !          1121: 
        !          1122: /*
        !          1123:  * Write Performance Monitor
        !          1124:  *
        !          1125:  * INPUT PARAMETERS:
        !          1126:  * 
        !          1127:  *     r16 (a0) = New user stack pointer value
        !          1128:  * 
        !          1129:  * SIDE EFFECTS:
        !          1130:  *
        !          1131:  *     Registers t0, t8..t11, and a0 are UNPREDICTABLE upon return.
        !          1132:  */
        !          1133:        ORG_CALL_PAL_PRIV(0x39)
        !          1134: CallPal_WrPerfMon:
        !          1135:        // Not implemented
        !          1136:        hw_rei
        !          1137: ENDFN  CallPal_WrPerfMon
        !          1138: 
        !          1139: /*
        !          1140:  * Read User Stack Pointer
        !          1141:  * 
        !          1142:  * OUTPUT PARAMETERS:
        !          1143:  *
        !          1144:  *     r0 (v0) = User stack pointer value
        !          1145:  * 
        !          1146:  * SIDE EFFECTS:
        !          1147:  *
        !          1148:  *     Registers t0, and t8..t11 are UNPREDICTABLE upon return.
        !          1149:  */ 
        !          1150:         ORG_CALL_PAL_PRIV(0x3A)
        !          1151: CallPal_RdUsp:
        !          1152:        mfpr    v0, qemu_usp
        !          1153:        hw_rei
        !          1154: ENDFN  CallPal_RdUsp
        !          1155: 
        !          1156:        ORG_CALL_PAL_PRIV(0x3B)
        !          1157: CallPal_OpcDec3B:
        !          1158:        br      CallPal_OpcDec
        !          1159: ENDFN  CallPal_OpcDec3B
        !          1160: 
        !          1161: /*
        !          1162:  * Who Am I
        !          1163:  * 
        !          1164:  * OUTPUT PARAMETERS:
        !          1165:  *
        !          1166:  *     r0 (v0) = Current processor number
        !          1167:  * 
        !          1168:  * SIDE EFFECTS:
        !          1169:  *
        !          1170:  *     Registers t0 and t8..t11 are UNPREDICTABLE upon return.
        !          1171:  */ 
        !          1172:         ORG_CALL_PAL_PRIV(0x3C)
        !          1173: CallPal_Whami:
        !          1174:        SYS_WHAMI v0
        !          1175:        hw_rei
        !          1176: ENDFN  CallPal_Whami
        !          1177: 
        !          1178: /*
        !          1179:  * Return From System Call
        !          1180:  *
        !          1181:  * INPUT PARAMETERS:
        !          1182:  * 
        !          1183:  *     r30 (sp) = Pointer to the top of the kernel stack
        !          1184:  * 
        !          1185:  * OUTPUT PARAMETERS:
        !          1186:  *
        !          1187:  *     r29 (gp) = Restored user mode global pointer
        !          1188:  *     r30 (sp) = User stack pointer
        !          1189:  * 
        !          1190:  * SIDE EFFECTS:
        !          1191:  *
        !          1192:  *     Registers t0 and t8..t11 are UNPREDICTABLE upon return.
        !          1193:  */ 
        !          1194:         ORG_CALL_PAL_PRIV(0x3D)
        !          1195: CallPal_RetSys:
        !          1196:        ldq     t9, FRM_Q_PC($sp)       // Pop the return address
        !          1197:        ldq     $gp, FRM_Q_GP($sp)      // Get the user mode global pointer
        !          1198:        lda     t8, FRM_K_SIZE($sp)
        !          1199:        mtpr    t8, ptKsp
        !          1200: 
        !          1201:        mov     PS_K_USER, t8           // Set new mode to user
        !          1202:        mtpr    t8, qemu_ps
        !          1203: 
        !          1204:        mfpr    $sp, qemu_usp           // Get the user stack pointer
        !          1205: 
        !          1206:        andnot  t9, 3, t9               // Clean return PC<1:0>
        !          1207:        hw_ret  (t9)
        !          1208: ENDFN  CallPal_RetSys
        !          1209: 
        !          1210: /*
        !          1211:  * Wait For Interrupt
        !          1212:  *
        !          1213:  * FUNCTIONAL DESCRIPTION:
        !          1214:  *
        !          1215:  *     If possible, wait for the first of either of the following
        !          1216:  *     conditions before returning: any interrupt other than a clock
        !          1217:  *     tick; or the first clock tick after a specified number of clock
        !          1218:  *     ticks have bbeen skipped.
        !          1219:  *
        !          1220:  * INPUT PARAMETERS:
        !          1221:  * 
        !          1222:  *     r16 (a0) = Maximum number of clock ticks to skip
        !          1223:  * 
        !          1224:  * OUTPUT PARAMETERS:
        !          1225:  *
        !          1226:  *     r0 (v0) = Number of clock ticks actually skipped.
        !          1227:  */
        !          1228:        ORG_CALL_PAL_PRIV(0x3E)
        !          1229: CallPal_WtInt:
        !          1230:        mtpr    $31, qemu_wait
        !          1231:        mov     0, v0
        !          1232:        hw_rei
        !          1233: ENDFN  CallPal_WtInt
        !          1234: 
        !          1235: /*
        !          1236:  * Return From Trap, Fault, or Interrupt
        !          1237:  *
        !          1238:  * INPUT PARAMETERS:
        !          1239:  * 
        !          1240:  *     r30 (sp) = Pointer to the top of the kernel stack
        !          1241:  * 
        !          1242:  * OUTPUT PARAMETERS:
        !          1243:  *
        !          1244:  *     ps       <- (sp+00)
        !          1245:  *     pc       <- (sp+08)
        !          1246:  *     r29 (gp) <- (sp+16)
        !          1247:  *     r16 (a0) <- (sp+24)
        !          1248:  *     r17 (a1) <- (sp+32)
        !          1249:  *     r18 (a2) <- (sp+40)
        !          1250:  */ 
        !          1251:         ORG_CALL_PAL_PRIV(0x3F)
        !          1252:        .globl  CallPal_Rti
        !          1253: CallPal_Rti:
        !          1254:        mfpr    p6, qemu_exc_addr       // Save exc_addr for machine check
        !          1255: 
        !          1256:        ldq     p4, FRM_Q_PS($sp)       // Get the PS
        !          1257:        ldq     p5, FRM_Q_PC($sp)       // Get the return PC
        !          1258:        ldq     $gp, FRM_Q_GP($sp)      // Get gp
        !          1259:        ldq     a0, FRM_Q_A0($sp)       // Get a0
        !          1260:        ldq     a1, FRM_Q_A1($sp)       // Get a1
        !          1261:        ldq     a2, FRM_Q_A2($sp)       // Get a2
        !          1262:        lda     $sp, FRM_K_SIZE($sp)    // Pop the stack
        !          1263: 
        !          1264:        andnot  p5, 3, p5               // Clean return PC<1:0>
        !          1265: 
        !          1266:        and     p4, PS_M_CM, p3
        !          1267:        bne     p3, CallPal_Rti_ToUser
        !          1268: 
        !          1269:        and     p4, PS_M_IPL, p4
        !          1270:        mtpr    p4, qemu_ps
        !          1271:        hw_ret  (p5)
        !          1272: ENDFN  CallPal_Rti
        !          1273: 
        !          1274:        .text   1
        !          1275: CallPal_Rti_ToUser:
        !          1276:        mtpr    p3, qemu_ps
        !          1277:        mtpr    $sp, ptKsp
        !          1278:        mfpr    $sp, qemu_usp
        !          1279:        hw_ret  (p5)
        !          1280: ENDFN  CallPal_Rti_ToUser
        !          1281:        .previous
        !          1282: 
        !          1283: /*
        !          1284:  * OSF/1 Unprivileged CALL_PAL Entry Points
        !          1285:  */
        !          1286: 
        !          1287: #define ORG_CALL_PAL_UNPRIV(X) .org    0x2000+64*(X-0x80)
        !          1288: 
        !          1289: /*
        !          1290:  * A helper routine for the unprivaledged kernel entry points, since the
        !          1291:  * actual stack frame setup code is just a tad too large to fit inline.
        !          1292:  *
        !          1293:  * INPUT PARAMETERS:
        !          1294:  *
        !          1295:  *     p5 = ps
        !          1296:  *     p6 = exc_addr
        !          1297:  *     p7 = return address
        !          1298:  *
        !          1299:  * SIDE EFFECTS:
        !          1300:  *
        !          1301:  *     p0 is clobbered
        !          1302:  *
        !          1303:  */
        !          1304:        .text   1
        !          1305: CallPal_Stack_Frame:
        !          1306:        // Test if we're currently in user mode
        !          1307:        and     p5, PS_M_CM, p0
        !          1308:        beq     p0, 0f
        !          1309: CallPal_Stack_Frame_FromUser:
        !          1310:        // Switch to kernel mode
        !          1311:        mtpr    $31, qemu_ps
        !          1312:        mtpr    $sp, qemu_usp
        !          1313:        mfpr    $sp, ptKsp
        !          1314: 0:
        !          1315:        // Allocate the stack frame
        !          1316:        lda     $sp, -FRM_K_SIZE($sp)
        !          1317:        stq     p5, FRM_Q_PS($sp)
        !          1318:        stq     p6, FRM_Q_PC($sp)
        !          1319:        stq     $gp, FRM_Q_GP($sp)
        !          1320:        stq     a0, FRM_Q_A0($sp)
        !          1321:        stq     a1, FRM_Q_A1($sp)
        !          1322:        stq     a2, FRM_Q_A2($sp)
        !          1323:        ret     $31, (p7), 0
        !          1324: ENDFN  CallPal_Stack_Frame
        !          1325:        .previous
        !          1326: 
        !          1327: /*
        !          1328:  * Breakpoint Trap
        !          1329:  *
        !          1330:  * OUTPUT PARAMETERS:
        !          1331:  *
        !          1332:  *     r16 (a0) = Code for bpt (0)
        !          1333:  *     r17 (a1) = UNPREDICTABLE
        !          1334:  *     r18 (a2) = UNPREDICTABLE
        !          1335:  */ 
        !          1336:         ORG_CALL_PAL_UNPRIV(0x80)
        !          1337: CallPal_Bpt:
        !          1338:        mfpr    p5, qemu_ps
        !          1339:        mfpr    p6, qemu_exc_addr
        !          1340:        bsr     p7, CallPal_Stack_Frame
        !          1341: 
        !          1342:        mfpr    p0, ptEntIF
        !          1343:        mfpr    $gp, ptKgp
        !          1344:        mov     IF_K_BPT, a0
        !          1345:        hw_ret  (p0)
        !          1346: ENDFN  CallPal_Bpt
        !          1347: 
        !          1348: /*
        !          1349:  * Bugcheck Trap
        !          1350:  * 
        !          1351:  * OUTPUT PARAMETERS:
        !          1352:  *
        !          1353:  *     r16 (a0) = Code for bugchk (1)
        !          1354:  *     r17 (a1) = UNPREDICTABLE
        !          1355:  *     r18 (a2) = UNPREDICTABLE
        !          1356:  */ 
        !          1357:         ORG_CALL_PAL_UNPRIV(0x81)
        !          1358: CallPal_BugChk:
        !          1359:        mfpr    p5, qemu_ps
        !          1360:        mfpr    p6, qemu_exc_addr
        !          1361:        bsr     p7, CallPal_Stack_Frame
        !          1362: 
        !          1363:        mfpr    p0, ptEntIF
        !          1364:        mfpr    $gp, ptKgp
        !          1365:        mov     IF_K_BUGCHK, a0
        !          1366:        hw_ret  (p0)
        !          1367: ENDFN  CallPal_BugChk
        !          1368: 
        !          1369: 
        !          1370:        ORG_CALL_PAL_UNPRIV(0x82)
        !          1371: CallPal_OpcDec82:
        !          1372:        br      CallPal_OpcDec
        !          1373: ENDFN  CallPal_OpcDec82
        !          1374: 
        !          1375: /*
        !          1376:  * System Call
        !          1377:  */ 
        !          1378:         ORG_CALL_PAL_UNPRIV(0x83)
        !          1379: CallPal_CallSys:
        !          1380:        mfpr    p5, qemu_ps
        !          1381:        mfpr    p6, qemu_exc_addr
        !          1382: 
        !          1383:        and     p5, PS_M_CM, p0
        !          1384:        beq     p0, 0f
        !          1385: 
        !          1386:        bsr     p7, CallPal_Stack_Frame_FromUser
        !          1387: 
        !          1388:        mfpr    p0, ptEntSys
        !          1389:        mfpr    $gp, ptKgp
        !          1390:        hw_ret  (p0)
        !          1391: 
        !          1392: 0:     subq    p6, 4, p6               // Get PC of CALL_PAL insn
        !          1393:        br      MchkOSBugCheck
        !          1394: ENDFN  CallPal_CallSys
        !          1395: 
        !          1396:        ORG_CALL_PAL_UNPRIV(0x84)
        !          1397: CallPal_OpcDec84:
        !          1398:        br      CallPal_OpcDec
        !          1399: ENDFN  CallPal_OpcDec84
        !          1400: 
        !          1401:        ORG_CALL_PAL_UNPRIV(0x85)
        !          1402: CallPal_OpcDec85:
        !          1403:        br      CallPal_OpcDec
        !          1404: ENDFN  CallPal_OpcDec85
        !          1405: 
        !          1406: 
        !          1407: /*
        !          1408:  * I-Stream Memory Barrier
        !          1409:  *
        !          1410:  * For QEMU, this is of course a no-op.
        !          1411:  */ 
        !          1412:         ORG_CALL_PAL_UNPRIV(0x86)
        !          1413: CallPal_Imb:
        !          1414:        hw_rei
        !          1415: ENDFN  CallPal_Imb
        !          1416: 
        !          1417: 
        !          1418:        ORG_CALL_PAL_UNPRIV(0x87)
        !          1419: CallPal_OpcDec87:
        !          1420:        br      CallPal_OpcDec
        !          1421: ENDFN  CallPal_OpcDec87
        !          1422: 
        !          1423:        ORG_CALL_PAL_UNPRIV(0x88)
        !          1424: CallPal_OpcDec88:
        !          1425:        br      CallPal_OpcDec
        !          1426: ENDFN  CallPal_OpcDec88
        !          1427: 
        !          1428:        ORG_CALL_PAL_UNPRIV(0x89)
        !          1429: CallPal_OpcDec89:
        !          1430:        br      CallPal_OpcDec
        !          1431: ENDFN  CallPal_OpcDec89
        !          1432: 
        !          1433:        ORG_CALL_PAL_UNPRIV(0x8A)
        !          1434: CallPal_OpcDec8A:
        !          1435:        br      CallPal_OpcDec
        !          1436: ENDFN  CallPal_OpcDec8A
        !          1437: 
        !          1438:        ORG_CALL_PAL_UNPRIV(0x8B)
        !          1439: CallPal_OpcDec8B:
        !          1440:        br      CallPal_OpcDec
        !          1441: ENDFN  CallPal_OpcDec8B
        !          1442: 
        !          1443:        ORG_CALL_PAL_UNPRIV(0x8C)
        !          1444: CallPal_OpcDec8C:
        !          1445:        br      CallPal_OpcDec
        !          1446: ENDFN  CallPal_OpcDec8C
        !          1447: 
        !          1448:        ORG_CALL_PAL_UNPRIV(0x8D)
        !          1449: CallPal_OpcDec8D:
        !          1450:        br      CallPal_OpcDec
        !          1451: ENDFN  CallPal_OpcDec8D
        !          1452: 
        !          1453:        ORG_CALL_PAL_UNPRIV(0x8E)
        !          1454: CallPal_OpcDec8E:
        !          1455:        br      CallPal_OpcDec
        !          1456: ENDFN  CallPal_OpcDec8E
        !          1457: 
        !          1458:        ORG_CALL_PAL_UNPRIV(0x8F)
        !          1459: CallPal_OpcDec8F:
        !          1460:        br      CallPal_OpcDec
        !          1461: ENDFN  CallPal_OpcDec8F
        !          1462: 
        !          1463:        ORG_CALL_PAL_UNPRIV(0x90)
        !          1464: CallPal_OpcDec90:
        !          1465:        br      CallPal_OpcDec
        !          1466: ENDFN  CallPal_OpcDec90
        !          1467: 
        !          1468:        ORG_CALL_PAL_UNPRIV(0x91)
        !          1469: CallPal_OpcDec91:
        !          1470:        br      CallPal_OpcDec
        !          1471: ENDFN  CallPal_OpcDec91
        !          1472: 
        !          1473:        ORG_CALL_PAL_UNPRIV(0x92)
        !          1474: CallPal_OpcDec92:
        !          1475:        br      CallPal_OpcDec
        !          1476: ENDFN  CallPal_OpcDec92
        !          1477: 
        !          1478:        ORG_CALL_PAL_UNPRIV(0x93)
        !          1479: CallPal_OpcDec93:
        !          1480:        br      CallPal_OpcDec
        !          1481: ENDFN  CallPal_OpcDec93
        !          1482: 
        !          1483:        ORG_CALL_PAL_UNPRIV(0x94)
        !          1484: CallPal_OpcDec94:
        !          1485:        br      CallPal_OpcDec
        !          1486: ENDFN  CallPal_OpcDec94
        !          1487: 
        !          1488:        ORG_CALL_PAL_UNPRIV(0x95)
        !          1489: CallPal_OpcDec95:
        !          1490:        br      CallPal_OpcDec
        !          1491: ENDFN  CallPal_OpcDec95
        !          1492: 
        !          1493:        ORG_CALL_PAL_UNPRIV(0x96)
        !          1494: CallPal_OpcDec96:
        !          1495:        br      CallPal_OpcDec
        !          1496: ENDFN  CallPal_OpcDec96
        !          1497: 
        !          1498:        ORG_CALL_PAL_UNPRIV(0x97)
        !          1499: CallPal_OpcDec97:
        !          1500:        br      CallPal_OpcDec
        !          1501: ENDFN  CallPal_OpcDec97
        !          1502: 
        !          1503:        ORG_CALL_PAL_UNPRIV(0x98)
        !          1504: CallPal_OpcDec98:
        !          1505:        br      CallPal_OpcDec
        !          1506: ENDFN  CallPal_OpcDec98
        !          1507: 
        !          1508:        ORG_CALL_PAL_UNPRIV(0x99)
        !          1509: CallPal_OpcDec99:
        !          1510:        br      CallPal_OpcDec
        !          1511: ENDFN  CallPal_OpcDec99
        !          1512: 
        !          1513:        ORG_CALL_PAL_UNPRIV(0x9A)
        !          1514: CallPal_OpcDec9A:
        !          1515:        br      CallPal_OpcDec
        !          1516: ENDFN  CallPal_OpcDec9A
        !          1517: 
        !          1518:        ORG_CALL_PAL_UNPRIV(0x9B)
        !          1519: CallPal_OpcDec9B:
        !          1520:        br      CallPal_OpcDec
        !          1521: ENDFN  CallPal_OpcDec9B
        !          1522: 
        !          1523:        ORG_CALL_PAL_UNPRIV(0x9C)
        !          1524: CallPal_OpcDec9C:
        !          1525:        br      CallPal_OpcDec
        !          1526: ENDFN  CallPal_OpcDec9C
        !          1527: 
        !          1528:        ORG_CALL_PAL_UNPRIV(0x9D)
        !          1529: CallPal_OpcDec9D:
        !          1530:        br      CallPal_OpcDec
        !          1531: ENDFN  CallPal_OpcDec9D
        !          1532: 
        !          1533: /*
        !          1534:  * Read Unique Value
        !          1535:  * 
        !          1536:  * OUTPUT PARAMETERS:
        !          1537:  *
        !          1538:  *     r0 (v0) = Returned process unique value
        !          1539: */ 
        !          1540:         ORG_CALL_PAL_UNPRIV(0x9E)
        !          1541: CallPal_RdUnique:
        !          1542:        mfpr    v0, qemu_unique
        !          1543:        hw_rei
        !          1544: ENDFN  CallPal_RdUnique
        !          1545: 
        !          1546: /*
        !          1547:  * Write Unique Value
        !          1548:  * 
        !          1549:  * INPUT PARAMETERS:
        !          1550:  * 
        !          1551:  *     r16 (a0) = New process unique value
        !          1552:  */ 
        !          1553:         ORG_CALL_PAL_UNPRIV(0x9F)
        !          1554: CallPal_WrUnique:
        !          1555:        mtpr    a0, qemu_unique
        !          1556:        hw_rei
        !          1557: ENDFN  CallPal_WrUnique
        !          1558: 
        !          1559:        ORG_CALL_PAL_UNPRIV(0xA0)
        !          1560: CallPal_OpcDecA0:
        !          1561:        br      CallPal_OpcDec
        !          1562: ENDFN  CallPal_OpcDecA0
        !          1563: 
        !          1564:        ORG_CALL_PAL_UNPRIV(0xA1)
        !          1565: CallPal_OpcDecA1:
        !          1566:        br      CallPal_OpcDec
        !          1567: ENDFN  CallPal_OpcDecA1
        !          1568: 
        !          1569:        ORG_CALL_PAL_UNPRIV(0xA2)
        !          1570: CallPal_OpcDecA2:
        !          1571:        br      CallPal_OpcDec
        !          1572: ENDFN  CallPal_OpcDecA2
        !          1573: 
        !          1574:        ORG_CALL_PAL_UNPRIV(0xA3)
        !          1575: CallPal_OpcDecA3:
        !          1576:        br      CallPal_OpcDec
        !          1577: ENDFN  CallPal_OpcDecA3
        !          1578: 
        !          1579:        ORG_CALL_PAL_UNPRIV(0xA4)
        !          1580: CallPal_OpcDecA4:
        !          1581:        br      CallPal_OpcDec
        !          1582: ENDFN  CallPal_OpcDecA4
        !          1583: 
        !          1584:        ORG_CALL_PAL_UNPRIV(0xA5)
        !          1585: CallPal_OpcDecA5:
        !          1586:        br      CallPal_OpcDec
        !          1587: ENDFN  CallPal_OpcDecA5
        !          1588: 
        !          1589:        ORG_CALL_PAL_UNPRIV(0xA6)
        !          1590: CallPal_OpcDecA6:
        !          1591:        br      CallPal_OpcDec
        !          1592: ENDFN  CallPal_OpcDecA6
        !          1593: 
        !          1594:        ORG_CALL_PAL_UNPRIV(0xA7)
        !          1595: CallPal_OpcDecA7:
        !          1596:        br      CallPal_OpcDec
        !          1597: ENDFN  CallPal_OpcDecA7
        !          1598: 
        !          1599:        ORG_CALL_PAL_UNPRIV(0xA8)
        !          1600: CallPal_OpcDecA8:
        !          1601:        br      CallPal_OpcDec
        !          1602: ENDFN  CallPal_OpcDecA8
        !          1603: 
        !          1604:        ORG_CALL_PAL_UNPRIV(0xA9)
        !          1605: CallPal_OpcDecA9:
        !          1606:        br      CallPal_OpcDec
        !          1607: ENDFN  CallPal_OpcDecA9
        !          1608: 
        !          1609: /*
        !          1610:  * Generate Trap
        !          1611:  *
        !          1612:  * OUTPUT PARAMETERS:
        !          1613:  *
        !          1614:  *     r16 (a0) = Code for gentrap (2)
        !          1615:  *     r17 (a1) = UNPREDICTABLE
        !          1616:  *     r18 (a2) = UNPREDICTABLE
        !          1617:  */ 
        !          1618:         ORG_CALL_PAL_UNPRIV(0xAA)
        !          1619: CallPal_GenTrap:
        !          1620:        mfpr    p5, qemu_ps
        !          1621:        mfpr    p6, qemu_exc_addr
        !          1622:        bsr     p7, CallPal_Stack_Frame
        !          1623: 
        !          1624:        mfpr    p0, ptEntIF
        !          1625:        mfpr    $gp, ptKgp
        !          1626:        mov     IF_K_GENTRAP, a0
        !          1627:        hw_ret  (p0)
        !          1628: ENDFN  CallPal_GenTrap
        !          1629: 
        !          1630:        ORG_CALL_PAL_UNPRIV(0xAB)
        !          1631: CallPal_OpcDecAB:
        !          1632:        br      CallPal_OpcDec
        !          1633: ENDFN  CallPal_OpcDecAB
        !          1634: 
        !          1635:        ORG_CALL_PAL_UNPRIV(0xAC)
        !          1636: CallPal_OpcDecAC:
        !          1637:        br      CallPal_OpcDec
        !          1638: ENDFN  CallPal_OpcDecAC
        !          1639: 
        !          1640:        ORG_CALL_PAL_UNPRIV(0xAD)
        !          1641: CallPal_OpcDecAD:
        !          1642:        br      CallPal_OpcDec
        !          1643: ENDFN  CallPal_OpcDecAD
        !          1644: 
        !          1645:        ORG_CALL_PAL_UNPRIV(0xAE)
        !          1646: CallPal_OpcDecAE:
        !          1647:        br      CallPal_OpcDec
        !          1648: ENDFN  CallPal_OpcDecAE
        !          1649: 
        !          1650:        ORG_CALL_PAL_UNPRIV(0xAF)
        !          1651: CallPal_OpcDecAF:
        !          1652:        br      CallPal_OpcDec
        !          1653: ENDFN  CallPal_OpcDecAF
        !          1654: 
        !          1655:        ORG_CALL_PAL_UNPRIV(0xB0)
        !          1656: CallPal_OpcDecB0:
        !          1657:        br      CallPal_OpcDec
        !          1658: ENDFN  CallPal_OpcDecB0
        !          1659: 
        !          1660:        ORG_CALL_PAL_UNPRIV(0xB1)
        !          1661: CallPal_OpcDecB1:
        !          1662:        br      CallPal_OpcDec
        !          1663: ENDFN  CallPal_OpcDecB1
        !          1664: 
        !          1665:        ORG_CALL_PAL_UNPRIV(0xB2)
        !          1666: CallPal_OpcDecB2:
        !          1667:        br      CallPal_OpcDec
        !          1668: ENDFN  CallPal_OpcDecB2
        !          1669: 
        !          1670:        ORG_CALL_PAL_UNPRIV(0xB3)
        !          1671: CallPal_OpcDecB3:
        !          1672:        br      CallPal_OpcDec
        !          1673: ENDFN  CallPal_OpcDecB3
        !          1674: 
        !          1675:        ORG_CALL_PAL_UNPRIV(0xB4)
        !          1676: CallPal_OpcDecB4:
        !          1677:        br      CallPal_OpcDec
        !          1678: ENDFN  CallPal_OpcDecB4
        !          1679: 
        !          1680:        ORG_CALL_PAL_UNPRIV(0xB5)
        !          1681: CallPal_OpcDecB5:
        !          1682:        br      CallPal_OpcDec
        !          1683: ENDFN  CallPal_OpcDecB5
        !          1684: 
        !          1685:        ORG_CALL_PAL_UNPRIV(0xB6)
        !          1686: CallPal_OpcDecB6:
        !          1687:        br      CallPal_OpcDec
        !          1688: ENDFN  CallPal_OpcDecB6
        !          1689: 
        !          1690:        ORG_CALL_PAL_UNPRIV(0xB7)
        !          1691: CallPal_OpcDecB7:
        !          1692:        br      CallPal_OpcDec
        !          1693: ENDFN  CallPal_OpcDecB7
        !          1694: 
        !          1695:        ORG_CALL_PAL_UNPRIV(0xB8)
        !          1696: CallPal_OpcDecB8:
        !          1697:        br      CallPal_OpcDec
        !          1698: ENDFN  CallPal_OpcDecB8
        !          1699: 
        !          1700:        ORG_CALL_PAL_UNPRIV(0xB9)
        !          1701: CallPal_OpcDecB9:
        !          1702:        br      CallPal_OpcDec
        !          1703: ENDFN  CallPal_OpcDecB9
        !          1704: 
        !          1705:        ORG_CALL_PAL_UNPRIV(0xBA)
        !          1706: CallPal_OpcDecBA:
        !          1707:        br      CallPal_OpcDec
        !          1708: ENDFN  CallPal_OpcDecBA
        !          1709: 
        !          1710:        ORG_CALL_PAL_UNPRIV(0xBB)
        !          1711: CallPal_OpcDecBB:
        !          1712:        br      CallPal_OpcDec
        !          1713: ENDFN  CallPal_OpcDecBB
        !          1714: 
        !          1715:        ORG_CALL_PAL_UNPRIV(0xBC)
        !          1716: CallPal_OpcDecBC:
        !          1717:        br      CallPal_OpcDec
        !          1718: ENDFN  CallPal_OpcDecBC
        !          1719: 
        !          1720:        ORG_CALL_PAL_UNPRIV(0xBD)
        !          1721: CallPal_OpcDecBD:
        !          1722:        br      CallPal_OpcDec
        !          1723: ENDFN  CallPal_OpcDecBD
        !          1724: 
        !          1725:        ORG_CALL_PAL_UNPRIV(0xBE)
        !          1726: CallPal_OpcDecBE:
        !          1727:        br      CallPal_OpcDec
        !          1728: ENDFN  CallPal_OpcDecBE
        !          1729: 
        !          1730:        ORG_CALL_PAL_UNPRIV(0xBF)
        !          1731: CallPal_OpcDec:
        !          1732:        mfpr    p5, qemu_ps
        !          1733:        mfpr    p6, qemu_exc_addr
        !          1734:        bsr     p7, CallPal_Stack_Frame
        !          1735: 
        !          1736:        mfpr    p0, ptEntIF
        !          1737:        mfpr    $gp, ptKgp
        !          1738:        mov     IF_K_OPCDEC, a0
        !          1739:        hw_ret  (p0)
        !          1740: ENDFN  CallPal_OpcDec
        !          1741: 
        !          1742:        .org    0x3000
        !          1743:        .text   1
        !          1744: /*
        !          1745:  * PALcode detected processor machine check handler.
        !          1746:  *
        !          1747:  *      The PALcode-detected machine check handler loads a code
        !          1748:  *      indicating the type of machine check error, loads 
        !          1749:  *      the System Control Block (SCB) vector for the 
        !          1750:  *      processor machine check service routine, sets the 
        !          1751:  *      Machine-Check-In-Progress (MIP) flag in the Machine
        !          1752:  *      Check Error Summary register (MCES), and merges
        !          1753:  *      with the common machine check flow.
        !          1754:  *
        !          1755:  *      If a second processor machine check error condition 
        !          1756:  *      is detected while the MIP flag is set, the processor 
        !          1757:  *      is forced into console I/O mode indicating "double 
        !          1758:  *      error abort encountered" as the reason for the halt. 
        !          1759:  * 
        !          1760:  * CALLING SEQUENCE:
        !          1761:  * 
        !          1762:  *      Called when an internal processor error is detected
        !          1763:  *      that cannot be successfully corrected by hardware or
        !          1764:  *      PALcode.
        !          1765:  * 
        !          1766:  * INPUT PARAMETERS:
        !          1767:  *
        !          1768:  *      r14 (p6) = Exception address 
        !          1769:  * 
        !          1770:  * OUTPUT PARAMETERS:
        !          1771:  *
        !          1772:  *      ptMchk0         = saved v0
        !          1773:  *      ptMchk1         = saved t0
        !          1774:  *      ptMchk2         = saved t3
        !          1775:  *      ptMchk3         = saved t4
        !          1776:  *      ptMchk4         = saved t5
        !          1777:  *     ptMchk5         = saved exc_addr
        !          1778:  *      ptMisc<47:32>   = MCHK code
        !          1779:  *      ptMisc<31:16>   = SCB vector
        !          1780:  *      ptMces<MIP>     = Set
        !          1781:  * 
        !          1782:  * SIDE EFFECTS:
        !          1783:  *
        !          1784:  *      r0 (v0), r1 (t0), and r4..r6 (t3..t5) are saved in
        !          1785:  *      PAL temporaries and are available for use as scratch
        !          1786:  *      registers by the system specific machine check 
        !          1787:  *      handler.
        !          1788:  */
        !          1789: 
        !          1790: MchkBugCheck:
        !          1791: MchkOSBugCheck:
        !          1792:        halt
        !          1793: ENDFN  MchkBugCheck
        !          1794: 
        !          1795: /*
        !          1796:  * Common Machine Check Handler
        !          1797:  *
        !          1798:  * INPUT STATE:
        !          1799:  *
        !          1800:  *      ptMchk0                Saved v0
        !          1801:  *      ptMchk1                Saved t0
        !          1802:  *      ptMchk2                Saved t3
        !          1803:  *      ptMchk3                Saved t4
        !          1804:  *      ptMchk4                Saved t5
        !          1805:  *      ptMchk5                Saved exc_addr
        !          1806:  *      ptMisc<47:32>  MCHK code
        !          1807:  *      ptMisc<31:16>  SCB vector
        !          1808:  *      ptMces<MIP>    Set
        !          1809:  *
        !          1810:  * Registers v0, t0, and t3 .. t5 are available for use, in
        !          1811:  * addition to the shadow registers.
        !          1812:  */
        !          1813: 
        !          1814: MchkCommon:
        !          1815:        halt
        !          1816: ENDFN  MchkCommon
        !          1817: 
        !          1818: /*
        !          1819:  * Build Machine Check Logout Frame
        !          1820:  *
        !          1821:  *      This portion of the  machine check handler builds a logout frame
        !          1822:  *      in the PAL impure scratch area, builds a stack frame on the kernel
        !          1823:  *      stack (already built if there was an interrupt machine check),
        !          1824:  *      loads the GP with the KGP, loads the machine check entry 
        !          1825:  *      code in a0, loads a platform-specific interrupt vector 
        !          1826:  *      (typically the same value as the SCB offset) in a1, loads 
        !          1827:  *      the kseg address of the logout area in a2, and dispatches 
        !          1828:  *      to the kernel interrupt handler pointed to by the entInt 
        !          1829:  *      operating system entry point.
        !          1830:  *
        !          1831:  * OUTPUT PARAMETERS:
        !          1832:  * 
        !          1833:  *      a0 (r16) = Machine check entry type
        !          1834:  *      a1 (r17) = Platform-specific interrupt vector
        !          1835:  *      a2 (r18) = Pointer to logout area
        !          1836:  */
        !          1837: 
        !          1838: .macro STORE_IPR       which, offset, base
        !          1839:        mfpr    v0, \which
        !          1840:        stq_p   v0, \offset(\base)
        !          1841: .endm
        !          1842: 
        !          1843: MchkLogOut:
        !          1844:        halt
        !          1845: ENDFN  MchkLogOut
        !          1846: 
        !          1847: MchkDouble:
        !          1848:        bsr     p7, UpdatePCB
        !          1849:        lda     v0, HLT_K_DBL_MCHK
        !          1850:        br      Sys_EnterConsole
        !          1851: ENDFN  MchkDouble
        !          1852: 
        !          1853: MchkFromPal:
        !          1854:        bsr     p7, UpdatePCB
        !          1855:        lda     v0, HLT_K_MCHK_FROM_PAL
        !          1856:        br      Sys_EnterConsole
        !          1857: ENDFN  MchkFromPal
        !          1858: 
        !          1859: MchkKspInvalid:
        !          1860:        bsr     p7, UpdatePCB
        !          1861:        lda     v0, HLT_K_KSP_INVAL
        !          1862:        br      Sys_EnterConsole
        !          1863: ENDFN  MchkKspInvalid
        !          1864: 
        !          1865: /*
        !          1866:  * Update the current PCB with new SP and CC info.
        !          1867:  *
        !          1868:  * INPUT PARAMETERS:
        !          1869:  *
        !          1870:  *     p7      = return linkage
        !          1871:  */
        !          1872: 
        !          1873: UpdatePCB:
        !          1874:        rpcc    p5
        !          1875:        mfpr    p4, ptPcbb
        !          1876: 
        !          1877:        mfpr    p3, qemu_ps             // Check current mode
        !          1878:        and     p3, PS_M_CM, p3
        !          1879:        beq     p3, 1f
        !          1880: 
        !          1881:        mtpr    $sp, qemu_usp           // Save user stack pointer
        !          1882:        stq_p   $sp, PCB_Q_USP(p4)
        !          1883:        br      2f
        !          1884: 
        !          1885: 1:     mtpr    $sp, ptKsp              // Save kernel stack pointer
        !          1886:        stq_p   $sp, PCB_Q_KSP(p4)
        !          1887: 
        !          1888: 2:     srl     p5, 32, p3              // Merge for new time
        !          1889:        addl    p5, p3, p3
        !          1890:        stl_p   p3, PCB_L_PCC(p4)       // Store new time
        !          1891: 
        !          1892:        mfpr    p5, qemu_unique         // Save unique
        !          1893:        stq_p   p5, PCB_Q_UNIQUE(p4)
        !          1894: 
        !          1895:        ret     $31, (p7), 0
        !          1896: ENDFN  UpdatePCB
        !          1897: 
        !          1898: /*
        !          1899:  * FIXME
        !          1900:  */
        !          1901: Sys_EnterConsole:
        !          1902:        halt
        !          1903: 
        !          1904: /*
        !          1905:  * Allocate the initial bootup stack.
        !          1906:  */
        !          1907: 
        !          1908:        .section .bss
        !          1909:        .align 3
        !          1910:        .globl  stack
        !          1911:        .type   stack,@object
        !          1912:        .size   stack,STACK_SIZE
        !          1913: stack: .skip   STACK_SIZE

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.