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

Annotation of sys/arch/mips64/mips64/lcore_access.S, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: lcore_access.S,v 1.10 2007/05/20 14:34:23 miod Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2001-2003 Opsycon AB  (www.opsycon.se / www.opsycon.com)
        !             5:  *
        !             6:  * Redistribution and use in source and binary forms, with or without
        !             7:  * modification, are permitted provided that the following conditions
        !             8:  * are met:
        !             9:  * 1. Redistributions of source code must retain the above copyright
        !            10:  *    notice, this list of conditions and the following disclaimer.
        !            11:  * 2. Redistributions in binary form must reproduce the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer in the
        !            13:  *    documentation and/or other materials provided with the distribution.
        !            14:  *
        !            15:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
        !            16:  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            17:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            18:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
        !            19:  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            20:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            21:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            22:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            23:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            24:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            25:  * SUCH DAMAGE.
        !            26:  *
        !            27:  */
        !            28: #include <sys/errno.h>
        !            29: #include <sys/syscall.h>
        !            30:
        !            31: #include <machine/param.h>
        !            32: #include <machine/psl.h>
        !            33: #include <machine/asm.h>
        !            34: #include <machine/cpu.h>
        !            35: #include <machine/regnum.h>
        !            36: #include <machine/cpustate.h>
        !            37: #include <machine/trap.h>
        !            38:
        !            39: #include "assym.h"
        !            40:
        !            41:        .set    mips3
        !            42:
        !            43:        .set    noreorder               # Noreorder is default style!
        !            44:
        !            45: /*
        !            46:  * Primitives
        !            47:  */
        !            48:
        !            49: /*
        !            50:  * This table is indexed by u.u_pcb.pcb_onfault in trap().
        !            51:  * The reason for using this table rather than storing an address in
        !            52:  * u.u_pcb.pcb_onfault is simply to make the code faster.
        !            53:  * This table must match with definitions in trap.h.
        !            54:  */
        !            55:        .globl  onfault_table
        !            56:        .data
        !            57:        .align  3
        !            58: onfault_table:
        !            59:        PTR_VAL 0               # invalid index number
        !            60:        PTR_VAL _copyerr
        !            61:        PTR_VAL _copyerr
        !            62: #if defined(DDB) || defined(DEBUG)
        !            63:        PTR_VAL kt_ddberr
        !            64: #else
        !            65:        PTR_VAL 0
        !            66: #endif
        !            67:        .text
        !            68:
        !            69: /*
        !            70:  * This code is copied the user's stack for returning from signal handlers
        !            71:  * (see sendsig() and sigreturn()). We have to compute the address
        !            72:  * of the sigcontext struct for the sigreturn call.
        !            73:  */
        !            74:        .globl  sigcode
        !            75: sigcode:
        !            76:        PTR_ADDU a0, sp, 4*REGSZ                # address of sigcontext
        !            77:        LI      v0, SYS_sigreturn       # sigreturn(scp)
        !            78:        syscall
        !            79:        break   0                       # just in case sigreturn fails
        !            80:        .globl  esigcode
        !            81: esigcode:
        !            82:
        !            83: /* Mips o32 ABI sigcode. 32 bit pointers. */
        !            84:        .globl  sigcode_o32
        !            85: sigcode_o32:
        !            86:        addu    a0, sp, 16              # address of sigcontext
        !            87:        li      v0, SYS_sigreturn       # sigreturn(scp)
        !            88:        syscall
        !            89:        break   0                       # just in case sigreturn fails
        !            90:        .globl  esigcode_o32
        !            91: esigcode_o32:
        !            92:
        !            93: /*
        !            94:  * Copy a null terminated string within the kernel address space.
        !            95:  * Maxlength may be null if count not wanted.
        !            96:  *     copystr(fromaddr, toaddr, maxlength, &lencopied)
        !            97:  *             caddr_t fromaddr;
        !            98:  *             caddr_t toaddr;
        !            99:  *             u_int maxlength;
        !           100:  *             u_long *lencopied;
        !           101:  */
        !           102: LEAF(copystr, 0)
        !           103:        move    t2, a2                  # Save the number of bytes
        !           104: 1:
        !           105:        lbu     t0, 0(a0)
        !           106:        PTR_SUBU a2, a2, 1
        !           107:        beq     t0, zero, 2f
        !           108:        sb      t0, 0(a1)
        !           109:        PTR_ADDU a0, a0, 1
        !           110:        bne     a2, zero, 1b
        !           111:        PTR_ADDU a1, a1, 1
        !           112: 2:
        !           113:        beq     a3, zero, 3f
        !           114:        PTR_SUBU a2, t2, a2             # compute length copied
        !           115:        REG_S   a2, 0(a3)
        !           116: 3:
        !           117:        j       ra
        !           118:        move    v0, zero
        !           119: END(copystr)
        !           120:
        !           121: #ifndef __LP64__
        !           122: /*
        !           123:  *  Read 64 bits from bus in non LP64 mode.
        !           124:  *  XXX ints should be disabled!
        !           125:  */
        !           126: LEAF(lp32_read8, 0)
        !           127: #if defined(__MIPSEB__)
        !           128:        ld      v1, 0(a0)
        !           129:        jr      ra
        !           130:        dsrl    v0, v1, 32
        !           131: #else
        !           132:        ld      v0, 0(a0)
        !           133:        jr      ra
        !           134:        dsrl    v1, v0, 32
        !           135: #endif
        !           136: END(lp32_read8)
        !           137:
        !           138: /*
        !           139:  *  Write 64 bits to bus in non LP64 mode.
        !           140:  *  XXX ints should be disabled!
        !           141:  */
        !           142: LEAF(lp32_write8, 0)
        !           143: #if defined(__MIPSEB__)
        !           144:        dsll    a2, 32
        !           145:        dsll    a3, 32
        !           146:        dsrl    a3, 32
        !           147:        or      a2, a3
        !           148: #else
        !           149:        dsll    a3, 32
        !           150:        dsll    a2, 32
        !           151:        dsrl    a2, 32
        !           152:        or      a3, a2
        !           153: #endif
        !           154:        jr      ra
        !           155:        sd      a2, 0(a0)
        !           156: END(lp32_write8)
        !           157: #endif
        !           158:
        !           159: /*
        !           160:  * fillw(pat, addr, count)
        !           161:  */
        !           162: LEAF(fillw, 0)
        !           163: 1:
        !           164:        PTR_ADDU a2, a2, -1
        !           165:        sh      a0, 0(a1)
        !           166:        bne     a2,zero, 1b
        !           167:        PTR_ADDU a1, a1, 2
        !           168:
        !           169:        jr      ra
        !           170:        nop
        !           171: END(fillw)
        !           172:
        !           173: /*
        !           174:  * Optimized memory zero code.
        !           175:  * mem_zero_page(addr);
        !           176:  */
        !           177: LEAF(mem_zero_page, 0)
        !           178:        LI      v0, NBPG
        !           179: 1:
        !           180:        PTR_SUBU v0, 8
        !           181:        sd      zero, 0(a0)
        !           182:        bne     zero, v0, 1b
        !           183:        PTR_ADDU a0, 8
        !           184:        jr      ra
        !           185:        nop
        !           186: END(mem_zero_page)
        !           187:
        !           188: /*
        !           189:  *     Block I/O routines mainly used by I/O drivers.
        !           190:  *
        !           191:  *     Args as:        a0 = port
        !           192:  *                     a1 = memory address
        !           193:  *                     a2 = count
        !           194:  */
        !           195: LEAF(insb, 0)
        !           196:        beq     a2, zero, 2f
        !           197:        PTR_ADDU a2, a1
        !           198: 1:
        !           199:        lbu     v0, 0(a0)
        !           200:        PTR_ADDU a1, 1
        !           201:        bne     a1, a2, 1b
        !           202:        sb      v0, -1(a1)
        !           203: 2:
        !           204:        jr      ra
        !           205:        nop
        !           206: END(insb)
        !           207:
        !           208: LEAF(insw, 0)
        !           209:        beq     a2, zero, 2f
        !           210:        PTR_ADDU a2, a2
        !           211:        PTR_ADDU a2, a1
        !           212: 1:
        !           213:        lhu     v0, 0(a0)
        !           214:        PTR_ADDU a1, 2
        !           215:        bne     a1, a2, 1b
        !           216:        sh      v0, -2(a1)
        !           217: 2:
        !           218:        jr      ra
        !           219:        nop
        !           220: END(insw)
        !           221:
        !           222: LEAF(insl, 0)
        !           223:        beq     a2, zero, 2f
        !           224:        PTR_SLL a2, 2
        !           225:        PTR_ADDU a2, a1
        !           226: 1:
        !           227:        lw      v0, 0(a0)
        !           228:        PTR_ADDU a1, 4
        !           229:        bne     a1, a2, 1b
        !           230:        sw      v0, -4(a1)
        !           231: 2:
        !           232:        jr      ra
        !           233:        nop
        !           234: END(insl)
        !           235:
        !           236: LEAF(outsb, 0)
        !           237:        beq     a2, zero, 2f
        !           238:        PTR_ADDU a2, a1
        !           239: 1:
        !           240:        lbu     v0, 0(a1)
        !           241:        PTR_ADDU a1, 1
        !           242:        bne     a1, a2, 1b
        !           243:        sb      v0, 0(a0)
        !           244: 2:
        !           245:        jr      ra
        !           246:        nop
        !           247: END(outsb)
        !           248:
        !           249: LEAF(outsw, 0)
        !           250:        beq     a2, zero, 2f
        !           251:        PTR_ADDU a2, a2
        !           252:        LI      v0, 1
        !           253:        and     v0, a1
        !           254:        bne     v0, zero, 3f            # arghh, unaligned.
        !           255:        PTR_ADDU a2, a1
        !           256: 1:
        !           257:        lhu     v0, 0(a1)
        !           258:        PTR_ADDU a1, 2
        !           259:        bne     a1, a2, 1b
        !           260:        sh      v0, 0(a0)
        !           261: 2:
        !           262:        jr      ra
        !           263:        nop
        !           264: 3:
        !           265:        LWHI    v0, 0(a1)
        !           266:        LWLO    v0, 3(a1)
        !           267:        PTR_ADDU a1, 2
        !           268:        bne     a1, a2, 3b
        !           269:        sh      v0, 0(a0)
        !           270:
        !           271:        jr      ra
        !           272:        nop
        !           273: END(outsw)
        !           274:
        !           275: LEAF(outsl, 0)
        !           276:        beq     a2, zero, 2f
        !           277:        PTR_SLL a2, 2
        !           278:        LI      v0, 3
        !           279:        and     v0, a1
        !           280:        bne     v0, zero, 3f            # arghh, unaligned.
        !           281:        PTR_ADDU a2, a1
        !           282: 1:
        !           283:        lw      v0, 0(a1)
        !           284:        PTR_ADDU a1, 4
        !           285:        bne     a1, a2, 1b
        !           286:        sw      v0, 0(a0)
        !           287: 2:
        !           288:        jr      ra
        !           289:        nop
        !           290: 3:
        !           291:        LWHI    v0, 0(a1)
        !           292:        LWLO    v0, 3(a1)
        !           293:        PTR_ADDU a1, 4
        !           294:        bne     a1, a2, 3b
        !           295:        sw      v0, 0(a0)
        !           296:
        !           297:        jr      ra
        !           298:        nop
        !           299: END(outsl)
        !           300:
        !           301: /*
        !           302:  * Copy a null terminated string from the user address space into
        !           303:  * the kernel address space.
        !           304:  *
        !           305:  *     copyinstr(fromaddr, toaddr, maxlength, &lencopied)
        !           306:  *             caddr_t fromaddr;
        !           307:  *             caddr_t toaddr;
        !           308:  *             u_int maxlength;
        !           309:  *             u_int *lencopied;
        !           310:  */
        !           311: NON_LEAF(copyinstr, FRAMESZ(CF_SZ), ra)
        !           312:        PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
        !           313:        .mask   0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
        !           314:        PTR_S   ra, CF_RA_OFFS(sp)
        !           315:        blt     a0, zero, _copyerr      # make sure address is in user space
        !           316:        li      v0, KT_COPYERR
        !           317:        PTR_L   t3, curprocpaddr
        !           318:        jal     copystr
        !           319:        sw      v0, PCB_ONFAULT(t3)
        !           320:
        !           321:        PTR_L   ra, CF_RA_OFFS(sp)
        !           322:        PTR_L   t3, curprocpaddr
        !           323:        sw      zero, PCB_ONFAULT(t3)
        !           324:        PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
        !           325:        j       ra
        !           326:        move    v0, zero
        !           327: END(copyinstr)
        !           328:
        !           329: /*
        !           330:  * Copy a null terminated string from the kernel address space into
        !           331:  * the user address space.
        !           332:  *
        !           333:  *     copyoutstr(fromaddr, toaddr, maxlength, &lencopied)
        !           334:  *             caddr_t fromaddr;
        !           335:  *             caddr_t toaddr;
        !           336:  *             u_int maxlength;
        !           337:  *             u_int *lencopied;
        !           338:  */
        !           339: NON_LEAF(copyoutstr, FRAMESZ(CF_SZ), ra)
        !           340:        PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
        !           341:        .mask   0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
        !           342:        PTR_S   ra, CF_RA_OFFS(sp)
        !           343:        blt     a1, zero, _copyerr      # make sure address is in user space
        !           344:        li      v0, KT_COPYERR
        !           345:        PTR_L   t3, curprocpaddr
        !           346:        jal     copystr
        !           347:        sw      v0, PCB_ONFAULT(t3)
        !           348:
        !           349:        PTR_L   ra, CF_RA_OFFS(sp)
        !           350:        PTR_L   t3, curprocpaddr
        !           351:        sw      zero, PCB_ONFAULT(t3)
        !           352:        PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
        !           353:        j       ra
        !           354:        move    v0, zero
        !           355: END(copyoutstr)
        !           356:
        !           357: /*
        !           358:  * Copy specified amount of data from user space into the kernel
        !           359:  *     copyin(from, to, len)
        !           360:  *             caddr_t *from;  (user source address)
        !           361:  *             caddr_t *to;    (kernel destination address)
        !           362:  *             unsigned len;
        !           363:  */
        !           364: NON_LEAF(copyin, FRAMESZ(CF_SZ), ra)
        !           365:        PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
        !           366:        .mask   0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
        !           367:        PTR_S   ra, CF_RA_OFFS(sp)
        !           368:        blt     a0, zero, _copyerr      # make sure address is in user space
        !           369:        li      v0, KT_COPYERR
        !           370:        PTR_L   t3, curprocpaddr
        !           371:        jal     bcopy
        !           372:        sw      v0, PCB_ONFAULT(t3)
        !           373:
        !           374:        PTR_L   ra, CF_RA_OFFS(sp)
        !           375:        PTR_L   t3, curprocpaddr
        !           376:        sw      zero, PCB_ONFAULT(t3)
        !           377:        PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
        !           378:        j       ra
        !           379:        move    v0, zero
        !           380: END(copyin)
        !           381:
        !           382: /*
        !           383:  * Copy specified amount of data from kernel to the user space
        !           384:  *     copyout(from, to, len)
        !           385:  *             caddr_t *from;  (kernel source address)
        !           386:  *             caddr_t *to;    (user destination address)
        !           387:  *             unsigned len;
        !           388:  */
        !           389: NON_LEAF(copyout, FRAMESZ(CF_SZ), ra)
        !           390:        PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
        !           391:        .mask   0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
        !           392:        PTR_S   ra, CF_RA_OFFS(sp)
        !           393:        blt     a1, zero, _copyerr      # make sure address is in user space
        !           394:        li      v0, KT_COPYERR
        !           395:        PTR_L   t3, curprocpaddr
        !           396:        jal     bcopy
        !           397:        sw      v0, PCB_ONFAULT(t3)
        !           398:
        !           399:        PTR_L   ra, CF_RA_OFFS(sp)
        !           400:        PTR_L   t3, curprocpaddr
        !           401:        sw      zero, PCB_ONFAULT(t3)
        !           402:        PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
        !           403:        j       ra
        !           404:        move    v0, zero
        !           405: END(copyout)
        !           406:
        !           407: _copyerr:
        !           408:        PTR_L   ra, CF_RA_OFFS(sp)
        !           409:        PTR_L   t3, curprocpaddr
        !           410:        sw      zero, PCB_ONFAULT(t3)
        !           411:        PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
        !           412:        j       ra
        !           413:        li      v0, EFAULT              # return error
        !           414:
        !           415: /*
        !           416:  *  kcopy is a wrapper around bcopy that catches bad memory references.
        !           417:  */
        !           418: NON_LEAF(kcopy, FRAMESZ(CF_SZ), ra)
        !           419:        PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
        !           420:        .mask   0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
        !           421:        PTR_S   ra, CF_RA_OFFS(sp)
        !           422:        li      v0, KT_KCOPYERR
        !           423:        PTR_L   t3, curprocpaddr
        !           424:        jal     bcopy
        !           425:        sw      v0, PCB_ONFAULT(t3)
        !           426:
        !           427:        PTR_L   ra, CF_RA_OFFS(sp)
        !           428:        PTR_L   t3, curprocpaddr
        !           429:        sw      zero, PCB_ONFAULT(t3)
        !           430:        PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
        !           431:        j       ra
        !           432:        move    v0, zero
        !           433: END(kcopy)

CVSweb