Annotation of researchv9/sys/boot/stand/standalloc.c, revision 1.1.1.1

1.1       root        1: /*     standalloc.c    1.1     86/02/03        */
                      2: 
                      3: /*
                      4:  * Copyright (c) 1985 by Sun Microsystems, Inc.
                      5:  */
                      6: 
                      7: /*
                      8:  * standalloc.c
                      9:  *
                     10:  * ROM Monitor's routines for allocating resources needed on a temporary
                     11:  * basis (eg, for initialization or for boot drivers).
                     12:  *
                     13:  * Note, all requests are rounded up to fill a page.  This is not a
                     14:  * malloc() replacement!
                     15:  */
                     16: 
                     17: /* This flag causes printfs */
                     18: #undef PD
                     19: 
                     20: #include "../mon/cpu.map.h"
                     21: #include "../mon/cpu.addrs.h"
                     22: #include <sys/param.h>
                     23: #include <sys/inode.h>
                     24: #include "saio.h"
                     25: 
                     26: /*
                     27:  * Artifice so standalone code uses same variable names as monitor's
                     28:  * for debugging.  FIXME?  Or leave this way?
                     29:  */
                     30: struct globram {
                     31:        char *g_nextrawvirt;
                     32:        char *g_nextdmaaddr;
                     33:        struct pgmapent g_nextmainmap;
                     34: } gp[1];
                     35: 
                     36: 
                     37: /*
                     38:  * Valid, supervisor-only, memory page's map entry.
                     39:  * (To be copied to a map entry and then modified.)
                     40:  */
                     41: struct pgmapent mainmapinit = 
                     42:        {1, PMP_SUP, VPM_MEMORY, 0, 0, 0};
                     43: 
                     44: 
                     45: /*
                     46:  * Say Something Here FIXME
                     47:  */
                     48: char *
                     49: resalloc(type, bytes)
                     50:        enum RESOURCES type;
                     51:        register unsigned bytes;
                     52: {
                     53:        register char * addr;   /* Allocated address */
                     54:        register char * raddr;  /* Running addr in loop */
                     55: 
                     56:        /* Initialize if needed. */
                     57:        if (gp->g_nextrawvirt == 0) {
                     58: #ifdef SUN2
                     59:                reset_alloc(0x100000);
                     60: #endif
                     61: #ifdef SUN3
                     62:                reset_alloc(*romp->v_memoryavail);
                     63: #endif
                     64:        }
                     65: 
                     66: #ifdef PD
                     67: printf("resalloc(%x, %x) %x %x ", type, bytes,
                     68:        gp->g_nextrawvirt, gp->g_nextdmaaddr);
                     69: #endif PD
                     70:        if (bytes == 0)
                     71:                return (char *)0;
                     72: 
                     73:        bytes = (bytes + (BYTESPERPG - 1)) & ~(BYTESPERPG - 1);
                     74: 
                     75:        switch (type) {
                     76: 
                     77:        case RES_RAWVIRT:
                     78:                addr = gp->g_nextrawvirt;
                     79:                gp->g_nextrawvirt += bytes;
                     80:                return addr;
                     81: 
                     82:        case RES_DMAVIRT:
                     83:                addr = gp->g_nextdmaaddr;
                     84:                gp->g_nextdmaaddr += bytes;
                     85:                return addr;
                     86: 
                     87:        case RES_MAINMEM:
                     88:                addr = gp->g_nextrawvirt;
                     89:                gp->g_nextrawvirt += bytes;
                     90:                break;
                     91: 
                     92:        case RES_DMAMEM:
                     93:                addr = gp->g_nextdmaaddr;
                     94:                gp->g_nextdmaaddr += bytes;
                     95:                break;
                     96: 
                     97:        default:
                     98:                return (char *)0;
                     99:        }
                    100:        
                    101:        /*
                    102:         * Now map in main memory.
                    103:         * Note that this loop goes backwards!!
                    104:         */
                    105: #ifdef PD
                    106: printf("mapping to %x returning %x\n", gp->g_nextmainmap, addr);
                    107: #endif
                    108:        for (raddr = addr;
                    109:             bytes > 0;
                    110:             raddr += BYTESPERPG, bytes -= BYTESPERPG,
                    111:              gp->g_nextmainmap.pm_page -= 1) {
                    112:                setpgmap(raddr, gp->g_nextmainmap);
                    113:                bzero((caddr_t)raddr, BYTESPERPG);
                    114:        } 
                    115: 
                    116:        return addr;
                    117: }
                    118: 
                    119: #ifdef SUN2
                    120: struct pgmapent devmaps[] = {
                    121: /* MAINMEM */
                    122:        {1, PMP_SUP, MPM_MEMORY, 0, 0, 0},              
                    123: /* OBIO */
                    124:        {1, PMP_SUP, MPM_IO, 0, 0, 0},                  
                    125: /* MBMEM */
                    126:        {1, PMP_SUP, VPM_VME0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},             
                    127: /* MBIO */
                    128:        {1, PMP_SUP, VPM_VME8, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},             
                    129: /* VME16A16D */
                    130:        {1, PMP_SUP, VPM_VME8, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},             
                    131: /* VME16A32D -- invalid */
                    132:        {0, PMP_SUP, VPM_VME8, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},             
                    133: /* VME24A16D -- kludge low 8 megs only */
                    134:        {1, PMP_SUP, VPM_VME0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},             
                    135: /* VME24A32D -- invalid */
                    136:        {0, PMP_SUP, VPM_VME0, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},             
                    137: /* VME32A16D -- invalid */
                    138:        {0, PMP_SUP, VPM_VME0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},             
                    139: /* VME32A32D -- invalid */
                    140:        {0, PMP_SUP, VPM_VME0, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},             
                    141: };
                    142: #endif SUN2
                    143: 
                    144: #ifdef SUN3
                    145: struct pgmapent devmaps[] = {
                    146: /* MAINMEM */
                    147:        {1, PMP_SUP, VPM_MEMORY, 0, 0, 0},              
                    148: /* OBIO */
                    149:        {1, PMP_SUP, VPM_IO, 0, 0, 0},                  
                    150: /* MBMEM */
                    151:        {1, PMP_SUP, VPM_VME16, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},            
                    152: /* MBIO */
                    153:        {1, PMP_SUP, VPM_VME16, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},            
                    154: /* VME16A16D */
                    155:        {1, PMP_SUP, VPM_VME16, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},            
                    156: /* VME16A32D */
                    157:        {1, PMP_SUP, VPM_VME32, 0, 0, 0xFFFF0000 >> BYTES_PG_SHIFT},            
                    158: /* VME24A16D */
                    159:        {1, PMP_SUP, VPM_VME16, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},            
                    160: /* VME24A32D */
                    161:        {1, PMP_SUP, VPM_VME32, 0, 0, 0xFF000000 >> BYTES_PG_SHIFT},            
                    162: /* VME32A16D */
                    163:        {1, PMP_SUP, VPM_VME16, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},            
                    164: /* VME32A32D */
                    165:        {1, PMP_SUP, VPM_VME32, 0, 0, 0x00000000 >> BYTES_PG_SHIFT},            
                    166: };
                    167: #endif SUN3
                    168: 
                    169: 
                    170: /*
                    171:  * devalloc() allocates virtual memory and maps it to a device
                    172:  * at a specific physical address.
                    173:  *
                    174:  * It returns the virtual address of that physical device.
                    175:  */
                    176: char *
                    177: devalloc(devtype, physaddr, bytes)
                    178:        enum MAPTYPES   devtype;
                    179:        register char *         physaddr;
                    180:        register unsigned       bytes;
                    181: {
                    182:        char *          addr;
                    183:        register char * raddr;
                    184:        register int    pages;
                    185:        struct pgmapent mapper;
                    186: 
                    187: #ifdef PD
                    188: printf("devalloc(%x, %x, %x) ", devtype, physaddr, bytes);
                    189: #endif
                    190:        if (!bytes)
                    191:                return (char *)0;
                    192: 
                    193:        pages = bytes + ((int)(physaddr) & (BYTESPERPG-1));
                    194:        addr = resalloc(RES_RAWVIRT, pages);
                    195:        if (!addr)
                    196:                return (char *)0;
                    197: 
                    198:        mapper = devmaps[(int)devtype];         /* Set it up first */
                    199:        mapper.pm_page += (int)(physaddr) >> BYTES_PG_SHIFT;
                    200: 
                    201:        for (raddr = addr;
                    202:             pages > 0;
                    203:             raddr += BYTESPERPG, pages -= BYTESPERPG,
                    204:              mapper.pm_page += 1) {
                    205: #ifdef PD
                    206: printf("mapping to %x ", mapper);
                    207: #endif
                    208:                setpgmap(raddr, mapper);
                    209:        } 
                    210: 
                    211: #ifdef PD
                    212: printf("returns roughly %x\n", addr);
                    213: #endif
                    214:        return addr + ((int)(physaddr) & (BYTESPERPG-1));
                    215: }
                    216: 
                    217: /*
                    218:  * reset_alloc() does all the setup and all the releasing for the PROMs.
                    219:  */
                    220: reset_alloc(memsize)
                    221:        unsigned memsize;
                    222: {
                    223: #ifdef SUN2
                    224:        gp->g_nextrawvirt = (char *)0x100000;
                    225: #endif
                    226: #ifdef SUN3
                    227:        int i, addr, pmeg;
                    228: 
                    229:        gp->g_nextrawvirt = (char *)0x200000;
                    230:        /*
                    231:         * The monitor only allocates as many PMEGs as there is real
                    232:         * memory so we have to set up more PMEGs for virtual memory
                    233:         * on machines with only 2 megabytes.
                    234:         */
                    235:        for (i=0; i < 0x100000; i += PGSPERSEG*BYTESPERPG) {    /* 1 Meg */
                    236:                addr = (int)gp->g_nextrawvirt + i;
                    237:                pmeg = addr / (PGSPERSEG*BYTESPERPG);
                    238:                setsegmap(addr, pmeg);
                    239:        }
                    240: #endif
                    241:        gp->g_nextdmaaddr = DVMA_BASE;
                    242:        gp->g_nextmainmap = mainmapinit;
                    243:        gp->g_nextmainmap.pm_page = (memsize>>BYTES_PG_SHIFT) - 1;
                    244: #ifdef PD
                    245: printf("reset_alloc(%x)\n", memsize);
                    246: #endif
                    247: }

unix.superglobalmegacorp.com

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