--- researchv9/sys/sun3/dummy1.c 2018/04/24 17:21:59 1.1.1.1 +++ researchv9/sys/sun3/dummy1.c 2018/04/24 17:30:15 1.1.1.2 @@ -1,4 +1,137 @@ #define DUMMY(x) x(){ panic("x"); } -DUMMY(localetheraddr) DUMMY(dumpsys) + +#include "../h/param.h" +#include "../h/callout.h" +#include "../h/map.h" + +/* + * untimeout is called to remove a function timeout call + * from the callout structure. + */ +untimeout(fun, arg) + int (*fun)(); + caddr_t arg; +{ + register struct callout *p1, *p2; + register int s; + + s = splclock(); + for (p1 = &calltodo; (p2 = p1->c_next) != 0; p1 = p2) { + if (p2->c_func == fun && p2->c_arg == arg) { + if (p2->c_next && p2->c_time > 0) + p2->c_next->c_time += p2->c_time; + p1->c_next = p2->c_next; + p2->c_next = callfree; + callfree = p2; + break; + } + } + (void) splx(s); +} + +/* + * Allocate 'size' units from the given map, starting at address 'addr'. + * Return 'addr' if successful, 0 if not. + * This may cause the creation or destruction of a resource map segment. + * + * This routine will return failure status if there is not enough room + * for a required additional map segment. + * + * An attempt to use this on 'swapmap' will result in + * a failure return. This is due mainly to laziness and could be fixed + * to do the right thing, although it probably will never be used. + */ +rmget(mp, size, addr) + register struct map *mp; +{ + register struct mapent *ep = (struct mapent *)(mp+1); + register struct mapent *bp, *bp2; + + if (size <= 0) + panic("rmget"); + if (mp == swapmap) + return (0); + /* + * Look for a map segment containing the requested address. + * If none found, return failure. + */ + for (bp = ep; bp->m_size; bp++) + if (bp->m_addr <= addr && bp->m_addr + bp->m_size > addr) + break; + if (bp->m_size == 0) + return (0); + + /* + * If segment is too small, return failure. + * If big enough, allocate the block, compressing or expanding + * the map as necessary. + */ + if (bp->m_addr + bp->m_size < addr + size) + return (0); + if (bp->m_addr == addr) + if (bp->m_addr + bp->m_size == addr + size) { + /* + * Allocate entire segment and compress map + */ + bp2 = bp; + while (bp2->m_size) { + bp2++; + (bp2-1)->m_addr = bp2->m_addr; + (bp2-1)->m_size = bp2->m_size; + } + } else { + /* + * Allocate first part of segment + */ + bp->m_addr += size; + bp->m_size -= size; + } + else + if (bp->m_addr + bp->m_size == addr + size) { + /* + * Allocate last part of segment + */ + bp->m_size -= size; + } else { + /* + * Allocate from middle of segment, but only + * if table can be expanded. + */ + for (bp2=bp; bp2->m_size; bp2++) + ; + if (bp2 == mp->m_limit) + return (0); + while (bp2 > bp) { + (bp2+1)->m_addr = bp2->m_addr; + (bp2+1)->m_size = bp2->m_size; + bp2--; + } + (bp+1)->m_addr = addr + size; + (bp+1)->m_size = + bp->m_addr + bp->m_size - (addr + size); + bp->m_size = addr - bp->m_addr; + } + return (addr); +} + +/* + * Set the local ethernet address + */ +localetheraddr(f, t) +u_char *f, *t; +{ + static first = 1; + static u_char ether[6]; + + if (first && f) { + first = 0; + bcopy(f, ether, 6); + printf("Ethernet address = "); + printf("%x:%x:%x:%x:%x:%x\n", + f[0], f[1], f[2], f[3], f[4], f[5]); + } + if (t) + bcopy(ether, t, 6); +}