1*27Sbill/*	subr_rmap.c.sav	3.1	10/14/12	*/
2*27Sbill
3*27Sbill#include "../h/param.h"
4*27Sbill#include "../h/systm.h"
5*27Sbill#include "../h/map.h"
6*27Sbill#include "../h/dir.h"
7*27Sbill#include "../h/user.h"
8*27Sbill#include "../h/proc.h"
9*27Sbill#include "../h/mtpr.h"
10*27Sbill#include "../h/text.h"
11*27Sbill
12*27Sbill/*
13*27Sbill * Allocate 'size' units from the given
14*27Sbill * map. Return the base of the allocated
15*27Sbill * space.
16*27Sbill * In a map, the addresses are increasing and the
17*27Sbill * list is terminated by a 0 size.
18*27Sbill * The swap map unit is 512 bytes.
19*27Sbill * Algorithm is first-fit.
20*27Sbill */
21*27Sbillmalloc(mp, size)
22*27Sbillstruct map *mp;
23*27Sbill{
24*27Sbill	register int a;
25*27Sbill	register struct map *bp;
26*27Sbill
27*27Sbill	if (size <= 0)
28*27Sbill		panic("malloc");
29*27Sbill	for (bp=mp; bp->m_size; bp++) {
30*27Sbill		if (bp->m_size >= size) {
31*27Sbill			a = bp->m_addr;
32*27Sbill			bp->m_addr += size;
33*27Sbill			if ((bp->m_size -= size) == 0) {
34*27Sbill				do {
35*27Sbill					bp++;
36*27Sbill					(bp-1)->m_addr = bp->m_addr;
37*27Sbill				} while ((bp-1)->m_size = bp->m_size);
38*27Sbill			}
39*27Sbill			if (mp == swapmap && a % CLSIZE)
40*27Sbill				panic("malloc swapmap");
41*27Sbill			return(a);
42*27Sbill		}
43*27Sbill	}
44*27Sbill	return(0);
45*27Sbill}
46*27Sbill
47*27Sbill/*
48*27Sbill * Free the previously allocated space aa
49*27Sbill * of size units into the specified map.
50*27Sbill * Sort aa into map and combine on
51*27Sbill * one or both ends if possible.
52*27Sbill */
53*27Sbillmfree(mp, size, a)
54*27Sbillstruct map *mp;
55*27Sbillregister int size, a;
56*27Sbill{
57*27Sbill	register struct map *bp;
58*27Sbill	register int t;
59*27Sbill
60*27Sbill	if (a <= 0)
61*27Sbill		panic("mfree addr");
62*27Sbill	if (size <= 0)
63*27Sbill		panic("mfree size");
64*27Sbill	bp = mp;
65*27Sbill	for (; bp->m_addr<=a && bp->m_size!=0; bp++)
66*27Sbill		continue;
67*27Sbill	if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size > a)
68*27Sbill		panic("mfree begov");
69*27Sbill	if (a+size > bp->m_addr && bp->m_size)
70*27Sbill		panic("mfree endov");
71*27Sbill	if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) {
72*27Sbill		(bp-1)->m_size += size;
73*27Sbill		if (a+size == bp->m_addr) {
74*27Sbill			(bp-1)->m_size += bp->m_size;
75*27Sbill			while (bp->m_size) {
76*27Sbill				bp++;
77*27Sbill				(bp-1)->m_addr = bp->m_addr;
78*27Sbill				(bp-1)->m_size = bp->m_size;
79*27Sbill			}
80*27Sbill		}
81*27Sbill	} else {
82*27Sbill		if (a+size == bp->m_addr && bp->m_size) {
83*27Sbill			bp->m_addr -= size;
84*27Sbill			bp->m_size += size;
85*27Sbill		} else if (size) {
86*27Sbill			do {
87*27Sbill				t = bp->m_addr;
88*27Sbill				bp->m_addr = a;
89*27Sbill				a = t;
90*27Sbill				t = bp->m_size;
91*27Sbill				bp->m_size = size;
92*27Sbill				bp++;
93*27Sbill			} while (size = t);
94*27Sbill		}
95*27Sbill	}
96*27Sbill	if ((mp == kernelmap) && kmapwnt) {
97*27Sbill		kmapwnt = 0;
98*27Sbill		wakeup((caddr_t)kernelmap);
99*27Sbill	}
100*27Sbill}
101