~kris/9p

9hist

27806bee8a156f30e9634a8e8356ffcb85e89f1e — David du Colombier 32 years ago 500ba80
Plan 9 from Bell Labs 1993-10-01
4 files changed, 38 insertions(+), 17 deletions(-)

M carrera/kbd.c
M carrera/screen.c
M carrera/trap.c
M port/segment.c
M carrera/kbd.c => carrera/kbd.c +11 -2
@@ 166,9 166,8 @@ kbdwait(void)
	int tries;

	for(tries = 0; tries < 2000; tries++){
		if(KBDCTL & Sobf){
		if(KBDCTL & Sobf)
			return 1;
		}
		kdbdly(1);
	}
	return 0;


@@ 185,6 184,16 @@ kbdackwait(void)
	return 0;
}

void
mouseintr(void)
{
	uchar code;

	kbdwait();
	code = KBDDAT;
	print("mouse intr %d\n", code);
}

int
kbdintr(void)
{

M carrera/screen.c => carrera/screen.c +1 -1
@@ 270,7 270,7 @@ screenputc(char *buf)
		cursor.x += pos*w;
		break;
	case '\b':
		if(cursor.x-w >= 0)
		if(cursor.x-w >= window.min.x)
			cursor.x -= w;
		break;
	default:

M carrera/trap.c => carrera/trap.c +3 -0
@@ 305,6 305,9 @@ intr(Ureg *ur)
			case 0x1C:
				kbdintr();
				break;
			case 0x20:
				mouseintr();
				break;
			}
		}
		cause &= ~INTR3;

M port/segment.c => port/segment.c +23 -14
@@ 464,12 464,9 @@ pteflush(Pte *pte, int s, int e)
	int i;
	Page *p;

	if(pte == 0)
		return;

	for(i = s; i < e; i++) {
		p = pte->pages[i];
		if(p != 0)
		if(pagedout(p) == 0)
			memset(p->cachectl, PG_TXTFLUSH, sizeof(p->cachectl));
	}
}


@@ 478,7 475,8 @@ long
syssegflush(ulong *arg)
{
	Segment *s;
	ulong addr, ua, l;
	ulong addr, l;
	Pte *pte;
	int chunk, ps, pe, len;

	addr = arg[0];


@@ 490,23 488,34 @@ syssegflush(ulong *arg)
			error(Ebadarg);

		s->flushme = 1;

	more:
		l = len;
		if(addr+l > s->top)
			l = s->top - addr;
		ua = addr-s->base;
		ps = ua&(PTEMAPMEM-1);
		pe = (ua+l)&(PTEMAPMEM-1);
		pe = (pe+BY2PG-1)&~(BY2PG-1);
		if(pe > PTEMAPMEM)
			pe = PTEMAPMEM;
	
		pteflush(s->map[ua/PTEMAPMEM], ps/BY2PG, pe/BY2PG);

		ps = addr-s->base;
		pte = s->map[ps/PTEMAPMEM];
		ps &= PTEMAPMEM-1;
		pe = PTEMAPMEM;
		if(pe-ps > l){
			pe = ps + l;
			pe = (pe+BY2PG-1)&~(BY2PG-1);
		}
		if(pe == ps) {
			qunlock(&s->lk);
			error(Ebadarg);
		}

		if(pte)
			pteflush(pte, ps/BY2PG, pe/BY2PG);

		chunk = pe-ps;
		len -= chunk;
		addr += chunk;

		if(len > 0 && addr < s->top)
			goto more;

		qunlock(&s->lk);
	}
	flushmmu();