~kris/9p

9hist

90f6e3533941b1db7af8caf03641c3275d111a4f — David du Colombier 35 years ago f568417
Plan 9 from Bell Labs 1991-07-26
7 files changed, 45 insertions(+), 31 deletions(-)

M port/alarm.c
M port/qlock.c
M port/segment.c
M port/swap.c
M power/fns.h
M power/l.s
M power/lock.c
M port/alarm.c => port/alarm.c +12 -13
@@ 107,20 107,19 @@ checkalarms(void)
					(*f)(alist[i]);
				alist[i]->busy = 0;
			}
		} else
		}else
			unlock(&m->alarmlock);
	}

	if(m == MACHP(0) && canqlock(&alarms)) {
	if(m == MACHP(0) && canqlock(&alarms)){
		now = MACHP(0)->ticks;
		while((rp = alarms.head) && rp->alarm <= now) {
			if(rp->alarm != 0L) {
				if(canlock(&rp->debug)) {
		while((rp = alarms.head) && rp->alarm <= now){
			if(rp->alarm != 0L){
				if(canlock(&rp->debug)){
					postnote(rp, 0, "alarm", NUser);
					unlock(&rp->debug);
					rp->alarm = 0L;
				}
				else
				}else
					break;
			}
			alarms.head = rp->palarm;


@@ 137,7 136,7 @@ procalarm(ulong time)

	when = MS2TK(time);
	old = u->p->alarm - MACHP(0)->ticks;
	if(when == 0) {
	if(when == 0){
		u->p->alarm = 0;
		return TK2MS(old);
	}


@@ 146,8 145,8 @@ procalarm(ulong time)

	qlock(&alarms);
	l = &alarms.head;
	for(f = *l; f; f = f->palarm) {
		if(u->p == f) {
	for(f = *l; f; f = f->palarm){
		if(u->p == f){
			*l = f->palarm;
			break;
		}


@@ 155,10 154,10 @@ procalarm(ulong time)
	}

	u->p->palarm = 0;
	if(alarms.head) {
	if(alarms.head){
		l = &alarms.head;
		for(f = *l; f; f = f->palarm) {
			if(f->alarm > when) {
		for(f = *l; f; f = f->palarm){
			if(f->alarm > when){
				u->p->palarm = f;
				*l = u->p;
				goto done;

M port/qlock.c => port/qlock.c +3 -0
@@ 53,7 53,10 @@ qunlock(QLock *q)
		unlock(&q->queue);
		ready(p);
	}else{
		/* horrible botch because clock does a canqlock */
		int s = splhi();
		unlock(&q->use);
		unlock(&q->queue);
		splx(s);
	}
}

M port/segment.c => port/segment.c +17 -11
@@ 94,20 94,26 @@ putseg(Segment *s)
	Pte **pp, **emap;
	Image *i;

	if(s && decref(s) == 0) {
	if(s == 0)
		return;

	i = s->image;
	if(i && i->s == s && s->ref == 1){
		lock(i);
		if(s->ref == 1)
			i->s = 0;
		unlock(i);
	}

	if(decref(s) == 0) {
		if(i)
			putimage(i);

		emap = &s->map[SEGMAPSIZE];
		for(pp = s->map; pp < emap; pp++)
			if(*pp)
				freepte(s, *pp);

		if(i = s->image) {
			lock(i);
			if(i->s == s)
				i->s = 0;
			unlock(i);
			putimage(i);
		}

		lock(&segalloc);
		s->next = segalloc.free;		
		segalloc.free = s;


@@ 395,10 401,10 @@ mfreeseg(Segment *s, ulong start, int pages)
					goto done;
				j++;
			}
			j = 0;
		}
		else
			pages -= PTEMAPMEM/BY2PG;
			pages -= PTEPERTAB-j;
		j = 0;
	}
done:
	flushmmu();

M port/swap.c => port/swap.c +2 -0
@@ 114,6 114,8 @@ pager(void *junk)

			sleep(&swapalloc.r, needpages, 0);

			if(p->state == Dead || p->kp)
				continue;
			if(swapimage.c) {
				for(i = 0; i < NSEG; i++)
					if(s = p->seg[i]) {

M power/fns.h => power/fns.h +1 -0
@@ 26,6 26,7 @@ void	flushmmu(void);
void	gettlb(int, ulong*);
ulong	gettlbvirt(int);
void	gotopc(ulong);
ulong	getcallerpc(void);
void	icflush(void *, ulong);
void	ioboardinit(void);
void	intr(Ureg*);

M power/l.s => power/l.s +5 -0
@@ 146,6 146,11 @@ TEXT	gotolabel(SB), $-4
	MOVW	4(R2), R29
	RET

TEXT	getcallerpc(SB), $0

	MOVW	(SP), R1
	RET

TEXT	gotopc(SB), $8

	MOVW	$(64*1024), R1

M power/lock.c => power/lock.c +5 -7
@@ 103,15 103,12 @@ lkpgfree(Page *pg)
	unlock(&semalloc.lock);
}

#define PCOFF -9

/*
 * If l->sbsem is zero, allocate a hardware semaphore first.
 */
void
lock(Lock *ll)
lock(Lock *l)
{
	Lock *l = ll;
	int i;
	ulong *sbsem;



@@ 133,16 130,16 @@ lock(Lock *ll)
	 * Try the fast grab first
	 */
	if((*sbsem&1) == 0){
		l->pc = ((ulong*)&ll)[PCOFF];
		l->pc = getcallerpc();
		return;
	}
	for(i=0; i<10000000; i++)
    		if((*sbsem&1) == 0){
			l->pc = ((ulong*)&ll)[PCOFF];
			l->pc = getcallerpc();
			return;
	}
	*sbsem = 0;
	print("lock loop %lux pc %lux held by pc %lux\n", l, ((ulong*)&ll)[PCOFF], l->pc);
	print("lock loop %lux pc %lux held by pc %lux\n", l, getcallerpc(), l->pc);
	dumpstack();
}



@@ 167,6 164,7 @@ canlock(Lock *l)
	}
	if(*sbsem & 1)
		return 0;
	l->pc = getcallerpc();
	return 1;
}