Annotation of coherent/b/kernel/i386/ff.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * fakeff.c
                      3:  * Simulate all the calls for far memory access from COH 286.
                      4:  * Far pointers are simulated with virtual addresses.
                      5:  */
                      6: #include <sys/coherent.h>
                      7: #include <sys/seg.h>
                      8: #include <sys/fakeff.h>
                      9: 
                     10: extern SR allocp;
                     11: 
                     12: /*
                     13:  * Initialize a virtual address to access physical memory at location
                     14:  * 'paddr', of size 'len' bytes.  It provides read and write (but not
                     15:  * execute) access.  When no longer required, a virtual address should be
                     16:  * released by vrelse.
                     17:  */
                     18: faddr_t
                     19: map_pv(paddr, len)
                     20: __paddr_t paddr;
                     21: fsize_t len;
                     22: {
                     23:        int s;                  /* Return value of sphi().  */
                     24:        int npage;              /* Number of pages we must allocate.  */
                     25:        faddr_t chunk_start;    /* Start of allocated segment in vmem.  */
                     26:        faddr_t retval;         /* Address of desired physical memory in vmem.  */
                     27:        int base1;              /* Offset into ptable1_v[].  */
                     28:        cseg_t  pte;            /* Build page table entries here.  */
                     29: 
                     30:        /* Figure out how many clicks we need to map.
                     31:         *         [                ]           What we want.
                     32:         *      [       |       |       ]       What we get.
                     33:         * Total number of clicks is:
                     34:         *      (click up from (paddr+len)) - (click down from paddr)
                     35:         */
                     36:                
                     37:        npage = btoc(paddr+len) - btocrd(paddr);
                     38: 
                     39:        /* Note that sysmem.vaddre is ALWAYS click aligned.  */
                     40:        
                     41:        /*
                     42:         * Allocate the required chunk of virtual memory space.
                     43:         * This could be a lot more sophisticated.  For expedience,
                     44:         * there is no way to free this after it has been allocated,
                     45:         * and there are no checks to see if we ran out of virtual space.
                     46:         */
                     47:        s = sphi();
                     48:        chunk_start = sysmem.vaddre;
                     49:        sysmem.vaddre += ctob(npage);
                     50:        spl(s);
                     51: 
                     52:        /*
                     53:         * Figure out where the desired physical address ends up in vmem.
                     54:         */
                     55:        retval = chunk_start + (paddr - ctob(btoc(paddr)));
                     56:        
                     57:        /*
                     58:         * Load the page table.
                     59:         */
                     60:        base1 = btocrd(chunk_start);
                     61:        pte = ctob(btocrd(paddr));
                     62:        do {
                     63:                ptable1_v[base1] = pte | SEG_SRW;
                     64:                base1++;
                     65:                pte += ctob(1); /* Bump up to next physical click.  */
                     66:        } while (--npage > 0);
                     67:        mmuupd();       /* Tell the mmu about the new map.  */
                     68: 
                     69:        return(retval);
                     70: } /* map_pv() */
                     71: 
                     72: /*
                     73:  * Release a virtual address that we previously obtained with function
                     74:  * map_pv().
                     75:  */
                     76: void
                     77: unmap_pv(faddr)
                     78: faddr_t faddr;
                     79: {
                     80:        /* For the moment, this function does nothing.  */
                     81: }              
                     82: 
                     83: /*
                     84:  * Translate virtual address to physical address.
                     85:  * Returns the current physical address associated with virtual address 'vaddr'.
                     86:  * Returns 0 if that portion of virtual address space is not associated with
                     87:  * any physical memory.
                     88:  */
                     89: paddr_t
                     90: vtop(vaddr)
                     91: caddr_t vaddr;
                     92: {
                     93:        paddr_t retval;
                     94:        unsigned int ptable_idx;        /* Index into ptable1_v[].  */
                     95: 
                     96:        ptable_idx = btocrd(vaddr);
                     97: 
                     98:        /*
                     99:         * There is a 4Mbyte virtual page table ptable1_v[] which is
                    100:         * all the bottom level page tables appended into a big array.
                    101:         * Note that there are huge holes in this data structure, for
                    102:         * unmapped virtual address space.
                    103:         *
                    104:         * We are going to look up 'vaddr' in the virtual page table
                    105:         * ptable1_v[].
                    106:         *
                    107:         * But first, we have to see if the portion of page table we are
                    108:         * going to look at exists.  We do this by looking at the one click
                    109:         * long page table that maps the virtual page table, PPTABLE1_V[].
                    110:         */
                    111:        retval = 0;     /* Assume entry not found.  */
                    112: 
                    113:        if (ptable0_v[btosrd(vaddr)] & SEG_SRO) {
                    114:                /*
                    115:                 * ASSERTION:  The portion of ptable1_v[] we want is valid.
                    116:                 */
                    117:                if (ptable1_v[ptable_idx] & SEG_SRO) {
                    118: 
                    119:                        /*
                    120:                         * ASSERTION:  'vaddr' corresponds to some
                    121:                         * physical memory.
                    122:                         *
                    123:                         * Note that the address of a physical click is
                    124:                         * all above bit 11 in the PTE.
                    125:                         */
                    126:                        retval = (ptable1_v[ptable_idx] & ~(NBPC - 1));
                    127:                        retval += ((long) vaddr & (NBPC - 1));
                    128:                }
                    129:        }
                    130: 
                    131:        T_PIGGY( 0x10, printf("vtop(%x)=%x, ", vaddr, retval); );
                    132: 
                    133:        return(retval);
                    134: } /* vtop() */ 
                    135: 
                    136: /*
                    137:  * Translate system global address 'vpaddr' to physical address.
                    138:  *
                    139:  * May cause a panic if 'vpaddr' does not correspond to a real physical
                    140:  * address.
                    141:  */
                    142: paddr_t
                    143: vptop(vpaddr)
                    144: paddr_t vpaddr;
                    145: {
                    146:        paddr_t retval;
                    147:        cseg_t pte;     /* Page table entry from sysmem.u.pbase[].  */
                    148: 
                    149:        T_PIGGY( 0x10, printf("vptop(%x)=", vpaddr); );
                    150: 
                    151:        pte = sysmem.u.pbase[btocrd(vpaddr)];
                    152:        pte &= ~(NBPC - 1);     /* Strip off the non-address information.  */
                    153: 
                    154:        retval = pte | (vpaddr & (NBPC - 1));
                    155: 
                    156:        T_PIGGY( 0x10, printf("%x,", retval); );
                    157: 
                    158:        return(retval);
                    159: } /* vptop() */
                    160: 
                    161: /*
                    162:  * Convert from virtual address to system global address.  Similar to MAPIO(),
                    163:  * but does not require separate segment and offset.
                    164:  *
                    165:  * Only works for Kernel Space virtual addresses.
                    166:  */
                    167: paddr_t
                    168: vtovp(vaddr)
                    169: caddr_t vaddr;
                    170: {
                    171:        paddr_t retval;
                    172: 
                    173:        T_PIGGY( 0x10, printf("vtopvp(%x)=", vaddr); );
                    174: 
                    175:        retval = MAPIO((allocp.sr_segp->s_vmem), (vaddr - allocp.sr_base));
                    176: 
                    177:        T_PIGGY( 0x10, printf("%x, ", retval); );
                    178: 
                    179:        return( retval );
                    180: }

unix.superglobalmegacorp.com

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