M pc/devvga.c => pc/devvga.c +23 -10
@@ 6,6 6,8 @@
#include "io.h"
#include "../port/error.h"
+#include <libg.h>
+#include <gnot.h>
#include "devtab.h"
#include "vga.h"
@@ 128,16 130,15 @@ vgaread(Chan *c, void *buf, long n, ulong offset)
case Qvgatype:
return readstr(offset, buf, n, vgacard);
case Qvgasize:
- sprint(obuf, "%dx%d%x%d %s",
- screeninfo.maxx, screeninfo.maxy,
- (screeninfo.packed == 0) ? 256 : 16,
- (screeninfo.interlaced != 0) ? "interlaced" : "non-interlaced");
+ sprint(obuf, "%d %d",
+ gscreen.r.max.x, gscreen.r.max.y);
return readstr(offset, buf, n, obuf);
case Qvgaport:
if (offset + n >= 0x8000)
error(Ebadarg);
- for (port=offset; port<offset+n; port++)
+ for (port=offset; port<offset+n; port++) {
*cp++ = inb(port);
+ }
return n;
}
}
@@ 145,9 146,8 @@ vgaread(Chan *c, void *buf, long n, ulong offset)
long
vgawrite(Chan *c, void *buf, long n, ulong offset)
{
- uchar *cp = buf;
- void (*outfunc)(int, int);
- int port, i;
+ char cbuf[20], *cp;
+ int port, i, maxx, maxy;
switch(c->qid.path&~CHDIR){
case Qdir:
@@ 163,12 163,25 @@ vgawrite(Chan *c, void *buf, long n, ulong offset)
case Qvgasize:
if(offset != 0)
error(Ebadarg);
- error(Eperm);
+ if(n >= sizeof cbuf)
+ n = sizeof cbuf - 1;
+ memmove(cbuf, buf, n);
+ cbuf[n-1] = 0;
+ cp = cbuf;
+ maxx = strtoul(cp, &cp, 0);
+ maxy = strtoul(cp, &cp, 0);
+ if (maxx == 0 || maxy == 0 ||
+ maxx > 1280 || maxy > 1024)
+ error(Ebadarg);
+ setscreen(maxx, maxy, 1);
+ return n;
case Qvgaport:
+ cp = buf;
if (offset + n >= 0x8000)
error(Ebadarg);
- for (port=offset; port<offset+n; port++)
+ for (port=offset; port<offset+n; port++) {
outb(port, *cp++);
+ }
return n;
}
}
M pc/vga.c => pc/vga.c +12 -80
@@ 26,10 26,6 @@ struct{
#define MAXX 640
#define MAXY 480
-/*
-#define MAXX 800
-#define MAXY 600
-*/
#define SCREENMEM (0xA0000 | KZERO)
@@ 76,28 72,6 @@ VGAmode mode12 =
0x01, 0x10, 0x0f, 0x00, 0x00,
};
-/*
- * cardinal (tseng labs) 800x600 display, 16 bit color.
- */
-VGAmode mode25 =
-{
- /* general */
- 0xe3, 0x00, /* 0x70, 0x04, these are read-only */
- /* sequence */
- 0x03, 0x01, 0x0f, 0x00, 0x06,
- /* crt */
- 0x5f, 0x4f, 0x50, 0x02, 0x54, 0x80, 0x0b, 0x3e,
- 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0,
- 0xea, 0x8c, 0xdf, 0x28, 0x00, 0xe7, 0x04, 0xe3,
- 0xff,
- /* graphics */
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0f,
- 0xff,
- /* attribute */
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x3f,
- 0x01, 0x10, 0x0f, 0x00, 0x00,
-};
void
genout(int reg, int val)
@@ 141,27 115,6 @@ crout(int reg, int val)
outb(CR, val);
}
-/*
- * m is a bit mask of planes to be affected by CPU writes
- */
-vgawrmask(int m)
-{
- srout(Smmask, m&0xf);
-}
-
-/*
- * p is the plane that will respond to CPU reads
- */
-vgardplane(int p)
-{
- grout(Grms, p&3);
-}
-
-vgadump(void)
-{
- print("misc is 0x%ux fc is 0x%ux\n", inb(EMISCR), inb(EFCR));
-}
-
void
setmode(VGAmode *v)
{
@@ 272,6 225,17 @@ dumpmodes(void) {
#endif
void
+setscreen(int maxx, int maxy, int bpp) {
+ gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, flipD[S]);
+ gscreen.width = maxx/32;
+ gscreen.r.max = Pt(maxx, maxy);
+ gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, flipD[0]);
+ out.pos.x = MINX;
+ out.pos.y = 0;
+ out.bwid = defont0.info[' '].width;
+}
+
+void
screeninit(void)
{
int i, j, k;
@@ 290,11 254,7 @@ screeninit(void)
l = defont->bits->base;
for(i = defont->bits->width*Dy(defont->bits->r); i > 0; i--, l++)
*l = (*l<<24) | ((*l>>8)&0x0000ff00) | ((*l<<8)&0x00ff0000) | (*l>>24);
-
- gbitblt(&gscreen, Pt(0, 0), &gscreen, gscreen.r, flipD[0]);
- out.pos.x = MINX;
- out.pos.y = 0;
- out.bwid = defont0.info[' '].width;
+ setscreen(MAXX, MAXY, 1);
}
void
@@ 395,34 355,6 @@ mouseclock(void)
mouseupdate(1);
}
-vgaset(char *cmd)
-{
- int set;
- int reg;
- int val;
-
- set = *cmd++;
- cmd++;
- reg = strtoul(cmd, &cmd, 0);
- cmd++;
- val = strtoul(cmd, &cmd, 0);
- switch(set){
- case 'a':
- arout(reg, val);
- break;
- case 'g':
- grout(reg, val);
- break;
- case 'c':
- crout(reg, val);
- break;
- case 's':
- srout(reg, val);
- break;
- }
-}
-
-
/*
* a fatter than usual cursor for the safari
*/
M pc/vga.h => pc/vga.h +3 -5
@@ 17,8 17,6 @@ enum
ARR= 0x3C1, /* attribute registers (reading) */
};
-extern void genout(int, int);
-extern void srout(int, int);
-extern void grout(int, int);
-extern void arout(int, int);
-extern void crout(int, int);
+extern void setscreen(int, int, int);
+
+extern struct GBitmap gscreen;
M port/devcons.c => port/devcons.c +1 -1
@@ 607,7 607,7 @@ consread(Chan *c, void *buf, long n, ulong offset)
error(Ebadarg);
chal = u->p->pgrp->crypt->chal;
chal[0] = RXschal;
- for(i=1; i<8; i++)
+ for(i=1; i<AUTHLEN; i++)
chal[i] = nrand(256);
memmove(buf, chal, 8);
encrypt(evekey, buf, 8);
M port/devmnt.c => port/devmnt.c +1 -1
@@ 242,7 242,7 @@ mntauth(Mnt *m, Mntrpc *f, char *serv, ushort fid)
memmove(r->request.uname, u->p->user, NAMELEN);
chal[0] = FScchal;
for(i = 1; i < AUTHLEN; i++)
- chal[i++] = nrand(256);
+ chal[i] = nrand(256);
memmove(r->request.chal, chal, AUTHLEN);
strncpy(r->request.chal+AUTHLEN, serv, NAMELEN);
M port/devwren.c => port/devwren.c +1 -0
@@ 191,6 191,7 @@ wrenwrite(Chan *c, char *a, long n, ulong offset)
if(n)
return n;
error("end of device");
+ return 0; /* not reached */
}
static long
M port/proc.c => port/proc.c +2 -5
@@ 106,9 106,7 @@ sched(void)
}
gotolabel(&m->sched);
}
- spllo();
p = runproc();
- splhi();
mapstack(p);
gotolabel(&p->sched);
}
@@ 147,7 145,7 @@ ready(Proc *p)
}
/*
- * Always called spllo
+ * Always called splhi
*/
Proc*
runproc(void)
@@ 157,6 155,7 @@ runproc(void)
int i;
loop:
+ spllo();
while(runhiq.head==0 && runloq.head==0)
for(i=0; i<10; i++) /* keep out of shared memory for a while */
;
@@ 170,7 169,6 @@ loop:
p = rq->head;
if(p==0 || p->mach){ /* p->mach==0 only when process state is saved */
unlock(&runhiq);
- spllo();
goto loop;
}
if(p->rnext == 0)
@@ 181,7 179,6 @@ loop:
print("runproc %s %d %s\n", p->text, p->pid, statename[p->state]);
unlock(&runhiq);
p->state = Scheding;
- spllo();
return p;
}
M port/stream.c => port/stream.c +2 -13
@@ 171,14 171,6 @@ newblock(Bclass *bcp)
/*
* allocate a block
*/
-static int
-isblock(void *arg)
-{
- Bclass *bcp;
-
- bcp = (Bclass *)arg;
- return bcp->first!=0;
-}
Block *
allocb(ulong size)
{
@@ 217,10 209,6 @@ allocb(ulong size)
bp->next = 0;
bp->list = 0;
bp->type = M_DATA;
- bp->flags &= S_CLASS;
- if(bp->lim-bp->rptr<size && size<4096)
- panic("allocb %lux %lux %d %ux %d", bp->lim, bp->rptr,
- size, bp->flags, bcp-bclass);
return bp;
}
@@ 237,11 225,12 @@ freeb(Block *bp)
int x;
ulong pc;
+#ifdef asdf
pc = getcallerpc(((uchar*)&bp) - sizeof(bp));
if((bp->flags&S_CLASS) >= Nclass) /* Check for double free */
panic("freeb class last(%lux) this(%lux)", bp->pc, pc);
bp->pc = pc;
-
+#endif asdf
for(; bp; bp = nbp){
bcp = &bclass[bp->flags & S_CLASS];
bp->flags = bp->flags|S_CLASS; /* Check for double free */
M port/sysproc.c => port/sysproc.c +1 -1
@@ 571,7 571,7 @@ syserrstr(ulong *arg)
}
long
-sysforkpgrp(ulong *arg)
+sys__forkpgrp__(ulong *arg)
{
int mask;
Pgrp *pg;
M port/systab.h => port/systab.h +3 -3
@@ 13,7 13,7 @@ Syscall sysalarm;
Syscall sysexec;
Syscall sysexits;
Syscall sys__fork__;
-Syscall sysforkpgrp;
+Syscall sys__forkpgrp__;
Syscall sysfstat;
Syscall syssegbrk;
Syscall sysmount;
@@ 52,7 52,7 @@ Syscall *systab[]={
[EXEC] sysexec,
[EXITS] sysexits,
[__FORK__] sys__fork__,
- [FORKPGRP] sysforkpgrp,
+ [__FORKPGRP__] sys__forkpgrp__,
[FSTAT] sysfstat,
[SEGBRK] syssegbrk,
[MOUNT] sysmount,
@@ 92,7 92,7 @@ char *sysctab[]={
[EXEC] "Exec",
[EXITS] "Exits",
[__FORK__] "__fork_",
- [FORKPGRP] "Forkpgrp",
+ [__FORKPGRP__] "__forkpgrp_",
[FSTAT] "Fstat",
[SEGBRK] "Segbrk",
[MOUNT] "Mount",