## diffname pc/bbmalloc.c 1991/0730
## diff -e /dev/null /n/bootesdump/1991/0730/sys/src/9/safari/bbmalloc.c
0a
#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "io.h"
/*
* Allocate memory for use in kernel bitblts.
* The allocated memory must have a flushed instruction
* cache, and the data cache must be flushed by bbdflush().
* To avoid the need for frequent cache flushes, the memory
* is allocated out of an arena, and the i-cache is only
* flushed when it has to be reused. By returning an
* address in non-cached space, the need for flushing the
* d-cache is avoided.
*
* Currently, the only kernel users of bitblt are devbit,
* print, and the cursor stuff in devbit. The cursor
* can get drawn at clock interrupt time, so it might need
* to bbmalloc while another bitblt is going on.
*
* This code will have to be interlocked if we ever get
* a multiprocessor with a bitmapped display.
*/
/* a 0->3 bitblt can take 900 words */
enum {
nbbarena=8192 /* number of words in an arena */
};
static ulong bbarena[nbbarena];
static ulong *bbcur = bbarena;
static ulong *bblast = 0;
void *
bbmalloc(int nbytes)
{
int nw;
int s;
ulong *ans;
nw = nbytes/sizeof(long);
s = splhi();
if(bbcur + nw > &bbarena[nbbarena])
ans = bbarena;
else
ans = bbcur;
bbcur = ans + nw;
splx(s);
/*
if(ans == bbarena)
icflush(ans, sizeof(bbarena));
*/
bblast = ans;
ans = (void *)ans;
return ans;
}
void
bbfree(void *p, int n)
{
ulong *up;
if(p == bblast)
bbcur = (ulong *)(((char *)bblast) + n);
}
void *
bbdflush(void *p, int n)
{
return p;
}
.
## diffname pc/bbmalloc.c 1991/0802
## diff -e /n/bootesdump/1991/0730/sys/src/9/safari/bbmalloc.c /n/bootesdump/1991/0802/sys/src/9/safari/bbmalloc.c
66a
splx(s);
.
64a
s = splhi();
.
63a
int s;
.
17a
* On the safari, all this is unnecessary, since the
* only icache is a miniscule prefetch buffer.
*
.
## diffname pc/bbmalloc.c 1991/0904
## diff -e /n/bootesdump/1991/0802/sys/src/9/safari/bbmalloc.c /n/bootesdump/1991/0904/sys/src/9/safari/bbmalloc.c
79a
.
75c
void*
.
72a
print("sanity bbfree\n");
.
70,71c
i = ((char*)va - bbarena) /n;
if(i >= 0 && i < sizeof(bbused) && bbused[i]){
bbused[i] = 0;
splx(s);
return;
}
.
66,67c
int s, i;
.
64c
bbfree(void *va, int n)
.
54,60c
print("too many bbmallocs\n");
return bbarena;
.
48,52c
a = memchr(bbused, 0, sizeof(bbused));
if(a) {
i = a - bbused;
a = bbarena + i*n;
if(a+n <= bbarena+sizeof(bbarena)) {
bbused[i] = 1;
splx(s);
return a;
}
}
.
46d
42,44c
char *a;
int s, i;
.
30,40c
void*
bbmalloc(int n)
.
8,28c
static char bbarena[10000];
static char bbused[10];
.
6d
## diffname pc/bbmalloc.c 1992/0117
## diff -e /n/bootesdump/1991/0904/sys/src/9/safari/bbmalloc.c /n/bootesdump/1992/0117/sys/src/9/safari/bbmalloc.c
53d
51c
if(u)
return 1;
return 0;
.
48,49c
int
bbonstack(void)
.
## diffname pc/bbmalloc.c 1992/0321
## diff -e /n/bootesdump/1992/0117/sys/src/9/safari/bbmalloc.c /n/bootesdump/1992/0321/sys/src/9/safari/bbmalloc.c
2c
#include "../port/lib.h"
.
## diffname pc/bbmalloc.c 1992/1113
## diff -e /n/bootesdump/1992/0808/sys/src/9/safari/bbmalloc.c /n/bootesdump/1992/1113/sys/src/9/pc/bbmalloc.c
51,52d
47a
void
bbdflush(void *p, int n)
{
USED(p, n);
}
.
45d
38,43c
a = INTENABLED(s) ? 0 : 1;
if(p == bblast[a])
bbcur[a] = (ulong *)(((char *)bblast[a]) + n);
.
35c
int a, s;
.
33c
bbfree(void *p, int n)
.
28,29c
bblast[a] = ans;
return ans;
.
17,26c
a = INTENABLED(s) ? 0 : 1;
if(bbcur[a] + nw > &bbarena[a][nbbarena])
ans = bbarena[a];
else
ans = bbcur[a];
bbcur[a] = ans + nw;
.
15a
nw = nbytes/sizeof(long);
.
13,14c
int nw, a;
int s;
ulong *ans;
.
10,11c
/* a 0->3 bitblt can take 800 longs */
enum {
narena=2, /* put interrupt time stuff in separate arena */
nbbarena=4096 /* number of words in an arena */
};
static ulong bbarena[narena][nbbarena];
static ulong *bbcur[narena] = {&bbarena[0][0], &bbarena[1][0]};
static ulong *bblast[narena] = {0, 0};
#define INTENABLED(v) ((v)&(1<<9))
void *
bbmalloc(int nbytes)
.
7,8c
/*
* Allocate memory for use in kernel bitblts.
*
* This code will have to be interlocked if we ever get
* a multiprocessor with a bitmapped display.
*/
.
5a
#include "io.h"
.
## diffname pc/bbmalloc.c 1993/0402
## diff -e /n/bootesdump/1992/1113/sys/src/9/pc/bbmalloc.c /n/bootesdump/1993/0402/sys/src/9/pc/bbmalloc.c
44a
void
bbinit(void)
{
int i;
if(bbarena[0])
return;
for(i = 0; i < narena; i++)
bbarena[i] = xalloc(nbbarena);
}
.
21c
static ulong *bbarena[narena];
.
## diffname pc/bbmalloc.c 1993/0409
## diff -e /n/bootesdump/1993/0402/sys/src/9/pc/bbmalloc.c /n/bootesdump/1993/0409/sys/src/9/pc/bbmalloc.c
53,54c
for(i = 0; i < narena; i++){
bbarena[i] = xalloc(nbbarena * sizeof(long));
bbcur[i] = bbarena[i];
bblast[i] = 0;
}
.
42a
splx(s);
.
41d
36c
if(bbcur[a] + nw > bbarena[a] + nbbarena)
.
22,23c
static ulong *bbcur[narena];
static ulong *bblast[narena];
.
## diffname pc/bbmalloc.c 1993/1113
## diff -e /n/bootesdump/1993/0409/sys/src/9/pc/bbmalloc.c /n/fornaxdump/1993/1113/sys/src/brazil/pc/bbmalloc.c
82a
}
void
bbexec(void (*memstart)(void), int len, int onstack)
{
memstart();
if(onstack)
return;
bbfree(memstart, len);
.
81a
/*if(u)
return 1;*/
.
73,78d
69c
bbcur[a] = (ulong *)(((char *)bblast[a]) + n + LINEWORDS*sizeof(long));
.
67c
a = INTLEVEL(s)? 1 : 0;
.
47,61d
42a
bblast[a] = ans;
.
40,41c
bbcur[a] = ans + nw + (LINEWORDS);
.
35,36c
a = INTLEVEL(s)? 1 : 0;
if(bbcur[a] + nw > &bbarena[a][nbbarena])
.
25c
#define INTLEVEL(v) (((v)&(1<<9)) == 0)
.
21,23c
static ulong bbarena[narena][nbbarena+LINEWORDS];
static ulong *bbcur[narena] = {&bbarena[0][0], &bbarena[1][0]};
static ulong *bblast[narena] = {0, 0};
.
15c
/* a 0->3 bitblt can take 900 words */
.
9a
* The allocated memory must have a flushed instruction
* cache, and the data cache must be flushed by bbdflush().
* To avoid the need for frequent cache flushes, the memory
* is allocated out of an arena, and the i-cache is only
* flushed when it has to be reused
.
7a
#define LINEWORDS (0)
.
## diffname pc/bbmalloc.c 1994/0413 # deleted
## diff -e /n/fornaxdump/1993/1113/sys/src/brazil/pc/bbmalloc.c /n/fornaxdump/1994/0413/sys/src/brazil/pc/bbmalloc.c
1,81d
|