Add untested code to recognize SIS900 and WPC-11 ethernet cards.
Move PC kernel to 0xF0000000, rewrite PC mmu.c accordingly.
Make memory banks described by array inside of hard-coding two banks.
On PC, add E820 memory map scan and VGA VESA support.
[rsc] --rw-rw-r-- M 451989 glenda sys 23542 Nov 6 09:32 sys/src/9/pc/ether83815.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether83815.c:81,86 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether83815.c:81,87
enum { /* Variants */
Nat83815 = (0x0020<<16)|0x100B,
+ Sis900 = (0x0630<<16)|0x1039, /* untested */
};
typedef struct Ctlr Ctlr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether83815.c:841,846 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether83815.c:842,848
continue;
case Nat83815:
+ case Sis900:
break;
}
[rsc] --rw-rw-r-- M 451989 glenda sys 630 Nov 6 10:08 sys/src/9/alphapc/apc
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/apc:36,42 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/apc:36,42
arch164
sdata pci sdscsi
- sd53c8xx pci sdscsi
+ # sd53c8xx pci sdscsi
uarti8250
[rsc] --rw-rw-r-- M 451989 glenda sys 5196 Nov 6 10:08 sys/src/9/alphapc/dat.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/dat.h:1,4 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/dat.h:1,5
typedef struct Conf Conf;
+ typedef struct Confmem Confmem;
typedef struct FPsave FPsave;
typedef struct ISAConf ISAConf;
typedef struct Label Label;
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/dat.h:32,37 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/dat.h:33,39
ulong sr;
ulong pc;
Proc *p;
+ Mach *m;
ulong pid;
ushort isilock;
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/dat.h:63,77 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/dat.h:65,84
long fpstatus;
};
+ struct Confmem
+ {
+ ulong base;
+ ulong npage;
+ ulong kbase;
+ ulong klimit;
+ };
+
struct Conf
{
ulong nmach; /* processors */
ulong nproc; /* processes */
- ulong npage0; /* total physical pages of memory */
- ulong npage1; /* total physical pages of memory */
+ Confmem mem[2];
ulong npage; /* total physical pages of memory */
- ulong base0; /* base of bank 0 */
- ulong base1; /* base of bank 1 */
ulong upages; /* user page pool */
ulong nimage; /* number of page cache image headers */
ulong nswap; /* number of swap pages */
[rsc] --rw-rw-r-- M 451989 glenda sys 7420 Nov 6 10:08 sys/src/9/alphapc/devvga.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/devvga.c:130,139 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/devvga.c:130,136
len += snprint(p+len, READSTR-len, "blanktime %lud\n", blanktime);
len += snprint(p+len, READSTR-len, "hwaccel %s\n", hwaccel ? "on" : "off");
len += snprint(p+len, READSTR-len, "hwblank %s\n", hwblank ? "on" : "off");
- if(scr->pciaddr)
- snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->pciaddr);
- else
- snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->aperture);
+ snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->paddr);
n = readstr(offset, a, n, p);
poperror();
free(p);
[rsc] --rw-rw-r-- M 451989 glenda sys 3613 Nov 6 10:08 sys/src/9/alphapc/fns.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/fns.h:98,108 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/fns.h:98,110
void touser(void*);
void trapinit(void);
void unaligned(void);
- ulong upamalloc(ulong, int, int);
+ ulong upaalloc(int, int);
void upafree(ulong, int);
#define userureg(ur) ((ur)->status & UMODE)
+ void* vmap(ulong, int);
void wrent(int, void*);
void wrvptptr(uvlong);
+ void vunmap(void*, int);
#define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1]))
#define KADDR(a) ((void*)((ulong)(a)|KZERO))
[rsc] --rw-rw-r-- M 451989 glenda sys 13672 Nov 6 10:08 sys/src/9/alphapc/main.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/main.c:454,470 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/main.c:454,470
* allocating low memory pages from bank 0 for any peripherals
* which only have a 24bit address counter.
*/
- conf.npage0 = (8*1024*1024)/BY2PG;
- conf.base0 = 0;
+ conf.mem[0].npage = (8*1024*1024)/BY2PG;
+ conf.mem[0].base = 0;
- conf.npage1 = (b->max-8*1024*1024)/BY2PG;
- conf.base1 = 8*1024*1024;
+ conf.mem[1].npage = (b->max-8*1024*1024)/BY2PG;
+ conf.mem[1].base = 8*1024*1024;
- conf.npage = conf.npage0+conf.npage1;
+ conf.npage = conf.mem[0].npage+conf.mem[1].npage;
conf.upages = (conf.npage*70)/100;
- conf.npage0 -= ktop/BY2PG;
- conf.base0 += ktop;
+ conf.mem[0].npage -= ktop/BY2PG;
+ conf.mem[0].base += ktop;
conf.ialloc = ((conf.npage-conf.upages)/2)*BY2PG;
/*
[rsc] --rw-rw-r-- M 451989 glenda sys 4945 Nov 6 10:08 sys/src/9/alphapc/mmu.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/mmu.c:224,231 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/mmu.c:224,231
}
- ulong
- upamalloc(ulong pa, int size, int align)
+ void*
+ vmap(ulong pa, int size)
{
void *va;
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/mmu.c:234,250 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/mmu.c:234,249
*/
if(pa == 0)
return 0;
- USED(align);
va = kmapv(((uvlong)0x88<<32LL)|pa, size);
if(va == nil)
return 0;
- return PADDR(va);
+ return (void*)va;
}
void
- upafree(ulong, int)
+ vunmap(void*, int)
{
- print("upafree: virtual mapping not freed\n");
+ print("vunmap: virtual mapping not freed\n");
}
void
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/mmu.c:263,266 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/mmu.c:262,280
}
}
- void checkmmu(ulong, ulong) { }
+ ulong
+ upaalloc(int, int)
+ {
+ return 0;
+ }
+
+ void
+ upafree(ulong, int)
+ {
+ }
+
+ void
+ checkmmu(ulong, ulong)
+ {
+ }
+
[rsc] --rw-rw-r-- M 451989 glenda sys 3818 Nov 6 10:08 sys/src/9/alphapc/screen.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/screen.h:68,74 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/screen.h:68,74
void (*enable)(VGAscr*);
void (*disable)(VGAscr*);
void (*page)(VGAscr*, int);
- ulong (*linear)(VGAscr*, int*, int*);
+ void (*linear)(VGAscr*, int, int);
void (*drawinit)(VGAscr*);
int (*fill)(VGAscr*, Rectangle, ulong);
void (*flush)(VGAscr*, Rectangle);
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/screen.h:91,96 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/screen.h:91,97
struct VGAscr {
Lock devlock;
VGAdev* dev;
+ Pcidev* pci;
VGAcur* cur;
ulong storage;
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/screen.h:98,114 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/screen.h:99,114
int useflush;
- ulong aperture; /* physical address, kernel */
- ulong pciaddr; /* physical address, user */
- int isupamem;
+ ulong paddr; /* frame buffer */
+ void* vaddr;
int apsize;
ulong io; /* device specific registers */
-
+ ulong *mmio;
+
ulong colormap[Pcolours][3];
int palettedepth;
- ulong *mmio;
Memimage* gscreen;
Memdata* gscreendata;
Memsubfont* memdefont;
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/screen.h:142,155 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/screen.h:142,168
extern Rectangle physgscreenr; /* actual monitor size */
extern void blankscreen(int);
+ extern VGAcur swcursor;
+ extern void swcursorinit(void);
+ extern void swcursorhide(void);
+ extern void swcursoravoid(Rectangle);
+ extern void swcursorunhide(void);
+
/* devdraw.c */
extern void deletescreenimage(void);
extern int drawhasclients(void);
extern ulong blanktime;
+ extern QLock drawlock;
+
/* vga.c */
extern void vgascreenwin(VGAscr*);
extern void vgaimageinit(ulong);
- extern ulong vgapcilinear(VGAscr*, int*, int*, int, int);
+ extern void vgalinearpciid(VGAscr*, int, int);
+ extern void vgalinearpci(VGAscr*);
+ extern void vgalinearaddr(VGAscr*, ulong, int);
extern void drawblankscreen(int);
extern void vgablank(VGAscr*, int);
+
+ extern Lock vgascreenlock;
+
[rsc] --rw-rw-r-- M 451989 glenda sys 50963 Nov 6 10:08 sys/src/9/alphapc/sd53c8xx.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/alphapc/sd53c8xx.c:1817,1824 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/alphapc/sd53c8xx.c:1817,1822
{ SYM_1010_DID, 0xff, "SYM53C1010", Burst128, 16, 64, Prefetch|LocalRAM|BigFifo|Wide|Ultra|Ultra2 },
};
- #define offsetof(s, t) ((ulong)&((s *)0)->t)
-
static int
xfunc(Controller *c, enum na_external x, unsigned long *v)
{
[rsc] --rw-rw-r-- M 451989 glenda bitsy 5829 Nov 6 10:09 sys/src/9/bitsy/dat.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/dat.h:1,5 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/dat.h:1,6
typedef struct Cisdat Cisdat;
typedef struct Conf Conf;
+ typedef struct Confmem Confmem;
typedef struct FPU FPU;
typedef struct FPenv FPenv;
typedef struct FPsave FPsave;
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/dat.h:37,42 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/dat.h:38,44
ulong sr;
ulong pc;
Proc *p;
+ Mach *m;
ushort isilock;
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/dat.h:62,80 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/dat.h:64,88
ulong regs[8][3]; /* emulated fp */
};
+ struct Confmem
+ {
+ ulong base;
+ ulong npage;
+ ulong limit;
+ ulong kbase;
+ ulong klimit;
+ };
+
struct Conf
{
ulong nmach; /* processors */
ulong nproc; /* processes */
- ulong npage0; /* total physical pages of memory */
- ulong npage1; /* total physical pages of memory */
+ Confmem mem[2];
ulong npage; /* total physical pages of memory */
ulong upages; /* user page pool */
ulong nimage; /* number of page cache image headers */
ulong nswap; /* number of swap pages */
int nswppo; /* max # of pageouts per segment pass */
- ulong base0; /* base of bank 0 */
- ulong base1; /* base of bank 1 */
ulong copymode; /* 0 is copy on write, 1 is copy on reference */
int monitor;
ulong ialloc; /* bytes available for interrupt time allocation */
[rsc] --rw-rw-r-- M 451989 glenda bitsy 9589 Nov 6 10:09 sys/src/9/bitsy/devpenmouse.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/devpenmouse.c:53,58 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/devpenmouse.c:53,60
Lock;
Mousestate;
ulong lastcounter; /* value when /dev/mouse read */
+ ulong resize;
+ ulong lastresize;
Rendez r;
Ref;
QLock;
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/devpenmouse.c:285,290 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/devpenmouse.c:287,296
mouse.lastcounter = m.counter;
if(n > 1+4*12)
n = 1+4*12;
+ if(mouse.lastresize != mouse.resize){
+ mouse.lastresize = mouse.resize;
+ buf[0] = 'r';
+ }
memmove(va, buf, n);
return n;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/devpenmouse.c:481,487 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/devpenmouse.c:487,494
int
penmousechanged(void*)
{
- return mouse.lastcounter != mouse.counter;
+ return mouse.lastcounter != mouse.counter ||
+ mouse.lastresize != mouse.resize;
}
Point
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/devpenmouse.c:489,491 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/devpenmouse.c:496,509
{
return mouse.xy;
}
+
+ /*
+ * notify reader that screen has been resized (ha!)
+ */
+ void
+ mouseresize(void)
+ {
+ mouse.resize++;
+ wakeup(&mouse.r);
+ }
+
[rsc] --rw-rw-r-- M 451989 glenda bitsy 8816 Nov 6 10:09 sys/src/9/bitsy/main.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/main.c:268,273 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/main.c:268,274
int
probemem(ulong addr)
{
+ int i;
ulong *p;
ulong a;
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/main.c:274,287 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/main.c:275,286
addr += OneMeg - sizeof(ulong);
p = (ulong*)addr;
*p = addr;
- for(a = conf.base0+OneMeg-sizeof(ulong); a < conf.npage0; a += OneMeg){
- p = (ulong*)a;
- *p = 0;
+ for(i=0; i<nelem(conf.mem); i++){
+ for(a = conf.mem[i].base+OneMeg-sizeof(ulong); a < conf.mem[i].limit; a += OneMeg){
+ p = (ulong*)a;
+ *p = 0;
+ }
}
- for(a = conf.base1+OneMeg-sizeof(ulong); a < conf.npage1; a += OneMeg){
- p = (ulong*)a;
- *p = 0;
- }
p = (ulong*)addr;
if(*p != addr)
return -1;
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/main.c:295,350 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/main.c:294,339
void
confinit(void)
{
- int i;
+ int i, j;
ulong addr;
ulong ktop;
/* find first two contiguous sections of available memory */
addr = PHYSDRAM0;
- conf.base0 = conf.npage0 = addr;
- conf.base1 = conf.npage1 = addr;
- for(i = 0; i < 512; i++){
- if(probemem(addr) == 0)
- break;
- addr += OneMeg;
+ for(i=0; i<nelem(conf.mem); i++){
+ conf.mem[i].base = addr;
+ conf.mem[i].limit = addr;
}
- for(; i < 512; i++){
- if(probemem(addr) < 0)
- break;
- addr += OneMeg;
- conf.npage0 = addr;
+ for(j=0; j<nelem(conf.mem); j++){
+ conf.mem[j].base = addr;
+ conf.mem[j].limit = addr;
+
+ for(i = 0; i < 512; i++){
+ if(probemem(addr) == 0)
+ break;
+ addr += OneMeg;
+ }
+ for(; i < 512; i++){
+ if(probemem(addr) < 0)
+ break;
+ addr += OneMeg;
+ conf.mem[j].limit = addr;
+ }
}
+
+ conf.npage = 0;
+ for(i=0; i<nelem(conf.mem); i++){
+ /* take kernel out of allocatable space */
+ ktop = PGROUND((ulong)end);
+ if(ktop >= conf.mem[i].base && ktop <= conf.mem[i].limit)
+ conf.mem[i].base = ktop;
+
+ /* zero memory */
+ memset((void*)conf.mem[i].base, 0, conf.mem[i].limit - conf.mem[i].base);
- conf.base1 = conf.npage1 = addr;
- for(; i < 512; i++){
- if(probemem(addr) == 0)
- break;
- addr += OneMeg;
+ conf.mem[i].npage = (conf.mem[i].limit - conf.mem[i].base)/BY2PG;
+ conf.npage += conf.mem[i].npage;
}
- for(; i < 512; i++){
- if(probemem(addr) < 0)
- break;
- addr += OneMeg;
- conf.npage1 = addr;
- }
-
- /* take kernel out of allocatable space */
- ktop = PGROUND((ulong)end);
- if(ktop >= conf.base0 && ktop <= conf.npage0)
- conf.base0 = ktop;
- else if(ktop >= conf.base1 && ktop <= conf.npage1)
- conf.base1 = ktop;
- else
- iprint("kernel not in allocatable space\n");
-
- /* zero memory */
- memset((void*)conf.base0, 0, conf.npage0 - conf.base0);
- memset((void*)conf.base1, 0, conf.npage1 - conf.base1);
-
- /* make npage the right thing */
- conf.npage0 = (conf.npage0 - conf.base0)/BY2PG;
- conf.npage1 = (conf.npage1 - conf.base1)/BY2PG;
- conf.npage = conf.npage0+conf.npage1;
if(conf.npage > 16*MB/BY2PG){
conf.upages = (conf.npage*60)/100;
[rsc] --rw-rw-r-- M 451989 glenda bitsy 2459 Nov 6 10:09 sys/src/9/bitsy/mkfile
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/mkfile:104,110 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/mkfile:104,110
$AS init9.s
$LD -l -R1 -o init.out init9.$O initcode.$O /arm/lib/libc.a
{echo 'uchar initcode[]={'
- strip < init.out | xd -1x |
+ strip -o /fd/1 init.out | xd -1x |
sed -e 's/^[0-9a-f]+ //' -e 's/ ([0-9a-f][0-9a-f])/0x\1,/g'
echo '};'} > init.h
[rsc] --rw-rw-r-- M 451989 glenda bitsy 44404 Nov 6 10:09 sys/src/9/bitsy/sdata.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/sdata.c:742,747 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/sdata.c:742,748
sdev->ifc = &sdataifc;
sdev->ctlr = ctlr;
+ sdev->idno = 'C';
sdev->nunit = 1;
ctlr->sdev = sdev;
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/sdata.c:1571,1596 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/sdata.c:1572,1577
return ataprobe(port, port+0x204, irq);
}
- static SDev*
- ataid(SDev* sdev)
- {
- int i;
-
- if(sdev == nil)
- return nil;
- i = 0;
- while(sdev){
- if(sdev->ifc == &sdataifc){
- sdev->idno = 'C'+i;
- i++;
- snprint(sdev->name, KNAMELEN, "sd%c", sdev->idno);
- }
- sdev = sdev->next;
- }
-
- return nil;
- }
-
static int ataitype;
static int atairq;
static int
/n/sourcesdump/2005/1106/plan9/sys/src/9/bitsy/sdata.c:2089,2095 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/bitsy/sdata.c:2070,2075
nil, /* pnp */
atalegacy, /* legacy */
- ataid, /* id */
ataenable, /* enable */
nil, /* disable */
[rsc] --rw-rw-r-- M 451989 glenda sys 1160 Nov 6 10:09 sys/src/9/boot/bootauth.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/boot/bootauth.c:22,28 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/boot/bootauth.c:22,30
ac = 0;
av = argv;
av[ac++] = "factotum";
- //av[ac++] = "-d";
+ if(getenv("debugfactotum"))
+ av[ac++] = "-p";
+ //av[ac++] = "-d"; //debug traces
//av[ac++] = "-D"; //9p messages
if(cpuflag)
av[ac++] = "-S";
[rsc] --rw-rw-r-- M 451989 glenda sys 3843 Nov 6 10:10 sys/src/9/mtx/dat.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/mtx/dat.h:1,4 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/mtx/dat.h:1,5
typedef struct Conf Conf;
+ typedef struct Confmem Confmem;
typedef struct FPsave FPsave;
typedef struct ISAConf ISAConf;
typedef struct Label Label;
/n/sourcesdump/2005/1106/plan9/sys/src/9/mtx/dat.h:33,39 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/mtx/dat.h:34,40
ulong sr;
ulong pc;
Proc *p;
- ulong pid;
+ Mach *m;
ushort isilock;
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/mtx/dat.h:68,82 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/mtx/dat.h:69,88
};
};
+ struct Confmem
+ {
+ ulong base;
+ ulong npage;
+ ulong kbase;
+ ulong klimit;
+ };
+
struct Conf
{
ulong nmach; /* processors */
ulong nproc; /* processes */
- ulong npage0; /* total physical pages of memory */
- ulong npage1; /* total physical pages of memory */
+ Confmem mem[1];
ulong npage; /* total physical pages of memory */
- ulong base0; /* base of bank 0 */
- ulong base1; /* base of bank 1 */
ulong upages; /* user page pool */
ulong nimage; /* number of page cache image headers */
ulong nswap; /* number of swap pages */
[rsc] --rw-rw-r-- M 451989 glenda sys 8307 Nov 6 10:10 sys/src/9/mtx/main.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/mtx/main.c:288,300 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/mtx/main.c:288,296
pa = PGROUND(PADDR(end));
- conf.npage0 = memsize/BY2PG;
- conf.base0 = pa;
-
- conf.npage1 = 0;
- conf.base1 = pa;
-
- conf.npage = conf.npage0 + conf.npage1;
+ conf.mem[0].npage = memsize/BY2PG;
+ conf.mem[0].base = pa;
+ conf.npage = conf.mem[0].npage;
conf.nmach = 1;
conf.nproc = 100 + ((conf.npage*BY2PG)/MB)*5;
[rsc] --rw-rw-r-- M 451989 glenda sys 8748 Nov 6 10:16 sys/src/9/pc/apic.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/apic.c:376,378 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/apic.c:376,391
{
timerintr(u, 0);
}
+
+ void
+ lapicintron(void)
+ {
+ lapicw(LapicTPR, 0);
+ }
+
+ void
+ lapicintroff(void)
+ {
+ lapicw(LapicTPR, 0xFF);
+ }
+
[rsc] --rw-rw-r-- M 451989 glenda sys 3723 Nov 6 10:16 sys/src/9/pc/apm.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/apm.c:103,108 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/apm.c:103,110
if(isaconfig("apm", 0, &isa) == 0)
return;
+ /* XXX use realmode() */
+
/*
* APM info passed from boot loader.
* Now we need to set up the GDT entries for APM.
[rsc] --rw-rw-r-- M 451989 glenda sys 2357 Nov 6 10:16 sys/src/9/pc/archmp.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/archmp.c:62,67 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/archmp.c:62,69
.reset= mpshutdown,
.intrinit= mpinit,
.intrenable= mpintrenable,
+ .intron= lapicintron,
+ .introff= lapicintroff,
.fastclock= i8253read,
.timerset= lapictimerset,
};
[rsc] --rw-rw-r-- M 451989 glenda sys 6462 Nov 6 10:16 sys/src/9/pc/dat.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/dat.h:1,4 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/dat.h:1,5
typedef struct Conf Conf;
+ typedef struct Confmem Confmem;
typedef struct FPsave FPsave;
typedef struct ISAConf ISAConf;
typedef struct Label Label;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/dat.h:32,37 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/dat.h:33,39
ulong sr;
ulong pc;
Proc *p;
+ Mach *m;
ushort isilock;
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/dat.h:73,85 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/dat.h:75,94
uchar regs[80]; /* floating point registers */
};
+ struct Confmem
+ {
+ ulong base;
+ ulong npage;
+ ulong kbase;
+ ulong klimit;
+ };
+
struct Conf
{
ulong nmach; /* processors */
ulong nproc; /* processes */
ulong monitor; /* has monitor? */
- ulong npage0; /* total physical pages of memory */
- ulong npage1; /* total physical pages of memory */
+ Confmem mem[4]; /* physical memory */
ulong npage; /* total physical pages of memory */
ulong upages; /* user page pool */
ulong nimage; /* number of page cache image headers */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/dat.h:102,107 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/dat.h:111,117
Page* mmupdb; /* page directory base */
Page* mmufree; /* unused page table pages */
Page* mmuused; /* used page table pages */
+ uint lastkmap; /* last entry used by kmap */
};
/*
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/dat.h:212,223 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/dat.h:222,233
};
/*
- * Fake kmap
+ * KMap the structure doesn't exist, but the functions do.
*/
- typedef void KMap;
- #define VA(k) ((ulong)(k))
- #define kmap(p) (KMap*)((p)->pa|KZERO)
- #define kunmap(k)
+ typedef struct KMap KMap;
+ #define VA(k) ((void*)(k))
+ KMap* kmap(Page*);
+ void kunmap(KMap*);
struct
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/dat.h:243,248 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/dat.h:253,260
int (*intrenable)(Vctl*);
int (*intrvecno)(int);
int (*intrdisable)(int);
+ void (*introff)(void);
+ void (*intron)(void);
void (*clockenable)(void);
uvlong (*fastclock)(uvlong*);
[rsc] --rw-rw-r-- M 451989 glenda sys 18594 Nov 6 10:17 sys/src/9/pc/devarch.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devarch.c:520,525 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devarch.c:520,527
.intrenable= i8259enable,
.intrvecno= i8259vecno,
.intrdisable= i8259disable,
+ .intron= i8259on,
+ .introff= i8259off,
.clockenable= i8253enable,
.fastclock= i8253read,
[rsc] --rw-rw-r-- M 451989 glenda sys 10315 Nov 6 10:17 sys/src/9/pc/devether.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devether.c:416,422 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devether.c:416,422
i = sprint(buf, "#l%d: %s: %dMbps port 0x%luX irq %d",
ctlrno, cards[cardno].type, ether->mbps, ether->port, ether->irq);
if(ether->mem)
- i += sprint(buf+i, " addr 0x%luX", PADDR(ether->mem));
+ i += sprint(buf+i, " addr 0x%luX", ether->mem);
if(ether->size)
i += sprint(buf+i, " size 0x%luX", ether->size);
i += sprint(buf+i, ": %2.2ux%2.2ux%2.2ux%2.2ux%2.2ux%2.2ux",
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devether.c:425,440 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devether.c:425,439
sprint(buf+i, "\n");
print(buf);
- if (ether->mbps >= 1000) {
+ if(ether->mbps >= 1000){
netifinit(ether, name, Ntypes, 512*1024);
if(ether->oq == 0)
ether->oq = qopen(512*1024, Qmsg, 0, 0);
- } else if(ether->mbps >= 100){
+ }else if(ether->mbps >= 100){
netifinit(ether, name, Ntypes, 256*1024);
if(ether->oq == 0)
ether->oq = qopen(256*1024, Qmsg, 0, 0);
- }
- else{
+ }else{
netifinit(ether, name, Ntypes, 128*1024);
if(ether->oq == 0)
ether->oq = qopen(128*1024, Qmsg, 0, 0);
[rsc] --rw-rw-r-- M 451989 glenda sys 40203 Nov 6 10:18 sys/src/9/pc/devpccard.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devpccard.c:515,520 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devpccard.c:515,521
int i;
uchar intl;
char *p;
+ void *baddrva;
if (initialized)
return;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devpccard.c:623,636 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devpccard.c:624,638
intl = pci->intl;
if ((baddr = pcicfgr32(cb->pci, PciBAR0)) == 0) {
- int align = (pci->did == Ricoh_478_did)? 0x10000: 0x1000;
+ int size = (pci->did == Ricoh_478_did)? 0x10000: 0x1000;
- baddr = upamalloc(baddr, align, align);
+ baddr = upaalloc(size, size);
+ baddrva = vmap(baddr, size);
pcicfgw32(cb->pci, PciBAR0, baddr);
- cb->regs = (ulong *)KADDR(baddr);
+ cb->regs = (ulong *)baddrva;
}
else
- cb->regs = (ulong *)KADDR(upamalloc(baddr, 4096, 0));
+ cb->regs = (ulong *)vmap(baddr, 4096);
cb->state = SlotEmpty;
/* Don't really know what to do with this... */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devpccard.c:810,816 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devpccard.c:812,818
continue;
}
- bar = upamalloc(0, pci->mem[i].size, BY2PG);
+ bar = upaalloc(pci->mem[i].size, BY2PG);
pci->mem[i].bar = bar | (pci->mem[i].bar & 0x80);
pcicfgw32(pci, PciBAR0 + i * sizeof(ulong), pci->mem[i].bar);
pcicfgw32(cb->pci, PciCBMBR0 + memindex * 8, bar);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devpccard.c:834,840 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devpccard.c:836,842
print("#Y%ld: WARNING: Too many memory spaces, not mapping ROM space\n",
cb - cbslots);
else {
- pci->rom.bar = upamalloc(0, size, BY2PG);
+ pci->rom.bar = upaalloc(size, BY2PG);
pci->rom.size = size;
pcicfgw32(pci, PciEBAR0, pci->rom.bar);
[rsc] --rw-rw-r-- M 451989 glenda sys 45676 Nov 6 10:18 sys/src/9/pc/devtv.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:557,563 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:557,563
tv = &tvs[ntvs++];
tv->variant = &variant[i];
tv->pci = pci;
- tv->bt848 = (Bt848 *)upamalloc(pci->mem[0].bar & ~0x0F, 4 * K, K);
+ tv->bt848 = (Bt848 *)vmap(pci->mem[0].bar & ~0x0F, 4 * K);
if (tv->bt848 == nil)
panic("#V: Cannot allocate memory for Bt848");
bt848 = tv->bt848;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:591,597 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:591,597
panic("#V: Unsupported Hauppage board");
tv->bt878 = bt878 =
- (Bt848 *)upamalloc(pci878->mem[0].bar & ~0x0F, 4 * K, K);
+ (Bt848 *)vmap(pci878->mem[0].bar & ~0x0F, 4 * K);
if (bt878 == nil)
panic("#V: Cannot allocate memory for the Bt878");
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1206,1212 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1206,1212
}
static ulong *
- riscpacked(ulong paddr, int fnum, int w, int h, int stride, ulong **lastjmp)
+ riscpacked(ulong pa, int fnum, int w, int h, int stride, ulong **lastjmp)
{
ulong *p, *pbase;
int i;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1224,1230 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1224,1230
for (i = 0; i != h / 2; i++) {
*p++ = riscwrite | w | riscwrite_sol | riscwrite_eol;
- *p++ = paddr + i * 2 * stride;
+ *p++ = pa + i * 2 * stride;
}
*p++ = riscsync | riscsync_resync | riscsync_vro;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1235,1241 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1235,1241
for (i = 0; i != h / 2; i++) {
*p++ = riscwrite | w | riscwrite_sol | riscwrite_eol;
- *p++ = paddr + (i * 2 + 1) * stride;
+ *p++ = pa + (i * 2 + 1) * stride;
}
// reset status. you really need two instructions ;-(.
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1248,1254 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1248,1254
}
static ulong *
- riscplanar411(ulong paddr, int fnum, int w, int h, ulong **lastjmp)
+ riscplanar411(ulong pa, int fnum, int w, int h, ulong **lastjmp)
{
ulong *p, *pbase, Cw, Yw, Ch;
uchar *Ybase, *Cbbase, *Crbase;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1260,1266 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1260,1266
assert(p);
Yw = w;
- Ybase = (uchar *)paddr;
+ Ybase = (uchar *)pa;
Cw = w >> 1;
Ch = h >> 1;
Cbbase = Ybase + Yw * h;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1302,1308 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1302,1308
}
static ulong *
- riscplanar422(ulong paddr, int fnum, int w, int h, ulong **lastjmp)
+ riscplanar422(ulong pa, int fnum, int w, int h, ulong **lastjmp)
{
ulong *p, *pbase, Cw, Yw;
uchar *Ybase, *Cbbase, *Crbase;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1314,1320 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1314,1320
assert(p);
Yw = w;
- Ybase = (uchar *)paddr;
+ Ybase = (uchar *)pa;
Cw = w >> 1;
Cbbase = Ybase + Yw * h;
Crbase = Cbbase + Cw * h;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1357,1363 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1357,1363
}
static ulong *
- riscaudio(ulong paddr, int nblocks, int bsize)
+ riscaudio(ulong pa, int nblocks, int bsize)
{
ulong *p, *pbase;
int i;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1372,1378 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1372,1378
*p++ = riscwrite | riscwrite_sol | riscwrite_eol | bsize | riscirq |
((i & 0xf) << risclabelshift_set) |
((~i & 0xf) << risclabelshift_reset);
- *p++ = paddr + i * bsize;
+ *p++ = pa + i * bsize;
}
*p++ = riscsync | riscsync_vro;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1556,1562 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1556,1562
}
static void
- vgastart(Tv *tv, ulong paddr, int stride)
+ vgastart(Tv *tv, ulong pa, int stride)
{
Frame *frame;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devtv.c:1568,1574 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devtv.c:1568,1574
}
frame->fbase = nil;
- frame->fstart = riscpacked(paddr, 0, ntsc_hactive * getbitspp(tv) / 8,
+ frame->fstart = riscpacked(pa, 0, ntsc_hactive * getbitspp(tv) / 8,
ntsc_vactive, stride * getbitspp(tv) / 8,
&frame->fjmp);
*frame->fjmp = PADDR(frame->fstart);
[rsc] --rw-rw-r-- M 451989 glenda sys 9332 Nov 6 10:18 sys/src/9/pc/devvga.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:6,11 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:6,12
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:16,21 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:17,23
enum {
Qdir,
+ Qvgabios,
Qvgactl,
Qvgaovl,
Qvgaovlctl,
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:23,28 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:25,31
static Dirtab vgadir[] = {
".", { Qdir, 0, QTDIR }, 0, 0550,
+ "vgabios", { Qvgabios, 0 }, 0x100000, 0440,
"vgactl", { Qvgactl, 0 }, 0, 0660,
"vgaovl", { Qvgaovl, 0 }, 0, 0660,
"vgaovlctl", { Qvgaovlctl, 0 }, 0, 0660,
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:40,45 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:43,49
CMpalettedepth,
CMpanning,
CMsize,
+ CMtextmode,
CMtype,
CMunblank,
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:56,61 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:60,66
CMpalettedepth, "palettedepth", 2,
CMpanning, "panning", 2,
CMsize, "size", 3,
+ CMtextmode, "textmode", 1,
CMtype, "type", 2,
CMunblank, "unblank", 1,
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:153,158 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:158,171
case Qdir:
return devdirread(c, a, n, vgadir, nelem(vgadir), devgen);
+ case Qvgabios:
+ if(offset >= 0x100000)
+ return 0;
+ if(offset+n >= 0x100000)
+ n = 0x100000 - offset;
+ memmove(a, (uchar*)kaddr(0)+offset, n);
+ return n;
+
case Qvgactl:
scr = &vgascreen[0];
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:186,192 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:199,207
len += snprint(p+len, READSTR-len, "hwaccel %s\n", hwaccel ? "on" : "off");
len += snprint(p+len, READSTR-len, "hwblank %s\n", hwblank ? "on" : "off");
len += snprint(p+len, READSTR-len, "panning %s\n", panning ? "on" : "off");
- snprint(p+len, READSTR-len, "addr 0x%lux\n", scr->aperture);
+ len += snprint(p+len, READSTR-len, "addr p 0x%lux v 0x%p size 0x%ux\n", scr->paddr, scr->vaddr, scr->apsize);
+ USED(len);
+
n = readstr(offset, a, n, p);
poperror();
free(p);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:233,239 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:248,264
unlock(&cursor);
return;
}
-
+ if(strcmp(cb->f[1], "soft") == 0){
+ lock(&cursor);
+ swcursorinit();
+ if(scr->cur && scr->cur->disable)
+ scr->cur->disable(scr);
+ scr->cur = &swcursor;
+ if(scr->cur->enable)
+ scr->cur->enable(scr);
+ unlock(&cursor);
+ return;
+ }
for(i = 0; vgacur[i]; i++){
if(strcmp(cb->f[1], vgacur[i]->name))
continue;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:261,269 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:286,296
}
break;
+ case CMtextmode:
+ screeninit();
+ return;
+
case CMsize:
- if(drawhasclients())
- error(Ebusy);
x = strtoul(cb->f[1], &p, 0);
if(x == 0 || x > 2048)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:291,296 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:318,324
if(screensize(x, y, z, chan))
error(Egreg);
vgascreenwin(scr);
+ resetscreenimage();
cursoron(1);
return;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devvga.c:337,343 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devvga.c:365,371
align = 0;
else
align = strtoul(cb->f[2], 0, 0);
- if(screenaperture(size, align))
+ if(screenaperture(size, align) < 0)
error("not enough free address space");
return;
/*
[rsc] --rw-rw-r-- M 451989 glenda sys 4715 Nov 6 10:18 sys/src/9/pc/dma.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/dma.c:140,149 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/dma.c:140,148
* if this isn't kernel memory or crossing 64k boundary or above 16 meg
* use the bounce buffer.
*/
- pa = PADDR(va);
- if((((ulong)va)&0xF0000000) != KZERO
- || (pa&0xFFFF0000) != ((pa+len)&0xFFFF0000)
- || pa >= 16*MB) {
+ if((ulong)va < KZERO
+ || ((pa=PADDR(va))&0xFFFF0000) != ((pa+len)&0xFFFF0000)
+ || pa >= 16*MB){
if(xp->bva == nil)
return -1;
if(len > xp->blen)
[rsc] --rw-rw-r-- M 451989 glenda sys 13953 Nov 6 10:18 sys/src/9/pc/ether79c970.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether79c970.c:522,528 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether79c970.c:522,527
ctlr->iow = io32w;
}else{
print("#l%d: card doesn't talk right\n", ether->ctlrno);
- iprint("#l%d: card doesn't talk right\n", ether->ctlrno);
iunlock(ctlr);
return -1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether79c970.c:538,545 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether79c970.c:537,542
break;
default:
print("#l%d: unknown PCnet card version %.7ux\n",
- ether->ctlrno, x&0xFFFFFFF);
- iprint("#l%d: unknown PCnet card version %.7ux\n",
ether->ctlrno, x&0xFFFFFFF);
iunlock(ctlr);
return -1;
[rsc] --rw-rw-r-- M 451989 glenda sys 18400 Nov 6 10:19 sys/src/9/pc/ether8139.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8139.c:243,249 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8139.c:243,249
ctlr = edev->ctlr;
p = malloc(READSTR);
- l = snprint(p, READSTR, "rcr %8.8uX\n", ctlr->rcr);
+ l = snprint(p, READSTR, "rcr %#8.8ux\n", ctlr->rcr);
l += snprint(p+l, READSTR-l, "ierrs %d\n", ctlr->ierrs);
l += snprint(p+l, READSTR-l, "etxth %d\n", ctlr->etxth);
l += snprint(p+l, READSTR-l, "taligned %d\n", ctlr->taligned);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8139.c:255,274 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8139.c:255,274
ctlr->rec += csr16r(ctlr, Rec);
l += snprint(p+l, READSTR-l, "rec %d\n", ctlr->rec);
- l += snprint(p+l, READSTR-l, "Tcr %8.8luX\n", csr32r(ctlr, Tcr));
- l += snprint(p+l, READSTR-l, "Config0 %2.2uX\n", csr8r(ctlr, Config0));
- l += snprint(p+l, READSTR-l, "Config1 %2.2uX\n", csr8r(ctlr, Config1));
- l += snprint(p+l, READSTR-l, "Msr %2.2uX\n", csr8r(ctlr, Msr));
- l += snprint(p+l, READSTR-l, "Config3 %2.2uX\n", csr8r(ctlr, Config3));
- l += snprint(p+l, READSTR-l, "Config4 %2.2uX\n", csr8r(ctlr, Config4));
+ l += snprint(p+l, READSTR-l, "Tcr %#8.8lux\n", csr32r(ctlr, Tcr));
+ l += snprint(p+l, READSTR-l, "Config0 %#2.2ux\n", csr8r(ctlr, Config0));
+ l += snprint(p+l, READSTR-l, "Config1 %#2.2ux\n", csr8r(ctlr, Config1));
+ l += snprint(p+l, READSTR-l, "Msr %#2.2ux\n", csr8r(ctlr, Msr));
+ l += snprint(p+l, READSTR-l, "Config3 %#2.2ux\n", csr8r(ctlr, Config3));
+ l += snprint(p+l, READSTR-l, "Config4 %#2.2ux\n", csr8r(ctlr, Config4));
- l += snprint(p+l, READSTR-l, "Bmcr %4.4uX\n", csr16r(ctlr, Bmcr));
- l += snprint(p+l, READSTR-l, "Bmsr %4.4uX\n", csr16r(ctlr, Bmsr));
- l += snprint(p+l, READSTR-l, "Anar %4.4uX\n", csr16r(ctlr, Anar));
- l += snprint(p+l, READSTR-l, "Anlpar %4.4uX\n", csr16r(ctlr, Anlpar));
- l += snprint(p+l, READSTR-l, "Aner %4.4uX\n", csr16r(ctlr, Aner));
- l += snprint(p+l, READSTR-l, "Nwaytr %4.4uX\n", csr16r(ctlr, Nwaytr));
- snprint(p+l, READSTR-l, "Cscr %4.4uX\n", csr16r(ctlr, Cscr));
+ l += snprint(p+l, READSTR-l, "Bmcr %#4.4ux\n", csr16r(ctlr, Bmcr));
+ l += snprint(p+l, READSTR-l, "Bmsr %#4.4ux\n", csr16r(ctlr, Bmsr));
+ l += snprint(p+l, READSTR-l, "Anar %#4.4ux\n", csr16r(ctlr, Anar));
+ l += snprint(p+l, READSTR-l, "Anlpar %#4.4ux\n", csr16r(ctlr, Anlpar));
+ l += snprint(p+l, READSTR-l, "Aner %#4.4ux\n", csr16r(ctlr, Aner));
+ l += snprint(p+l, READSTR-l, "Nwaytr %#4.4ux\n", csr16r(ctlr, Nwaytr));
+ snprint(p+l, READSTR-l, "Cscr %#4.4ux\n", csr16r(ctlr, Cscr));
n = readstr(offset, a, n, p);
free(p);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8139.c:589,595 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8139.c:589,595
* other than try to reinitialise the chip?
*/
if((isr & (Serr|Timerbit)) != 0){
- iprint("rtl8139interrupt: imr %4.4uX isr %4.4uX\n",
+ iprint("rtl8139interrupt: imr %#4.4ux isr %#4.4ux\n",
csr16r(ctlr, Imr), isr);
if(isr & Timerbit)
csr32w(ctlr, TimerInt, 0);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8139.c:621,627 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8139.c:621,627
continue;
if(ioalloc(port, p->mem[0].size, 0, "rtl8139") < 0){
- print("rtl8139: port 0x%uX in use\n", port);
+ print("rtl8139: port %#ux in use\n", port);
continue;
}
[rsc] --rw-rw-r-- M 451989 glenda sys 32294 Nov 6 10:19 sys/src/9/pc/ether82543gc.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82543gc.c:1243,1249 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82543gc.c:1243,1250
static void
gc82543pci(void)
{
- int port, cls;
+ int cls;
+ void *mem;
Pcidev *p;
Ctlr *ctlr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82543gc.c:1262,1269 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82543gc.c:1263,1270
break;
}
- port = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
- if(port == 0){
+ mem = vmap(p->mem[0].bar & ~0x0F, p->mem[0].size);
+ if(mem == 0){
print("gc82543: can't map %8.8luX\n", p->mem[0].bar);
continue;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82543gc.c:1280,1290 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82543gc.c:1281,1290
cls*4);
}
ctlr = malloc(sizeof(Ctlr));
- ctlr->port = port;
+ ctlr->port = p->mem[0].bar & ~0x0F;
ctlr->pcidev = p;
ctlr->id = (p->did<<16)|p->vid;
-
- ctlr->nic = KADDR(ctlr->port);
+ ctlr->nic = mem;
if(gc82543reset(ctlr)){
free(ctlr);
[rsc] --rw-rw-r-- M 451989 glenda sys 30107 Nov 6 10:19 sys/src/9/pc/ether82557.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:290,296 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:290,296
if(timeo >= 100){
ctlr->command = -1;
iunlock(&ctlr->rlock);
- iprint("i82557: command 0x%uX %uX timeout\n", c, v);
+ iprint("i82557: command %#ux %#ux timeout\n", c, v);
return;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:462,468 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:462,468
for(i = 0; i < (1<<ctlr->eepromsz); i++){
if(i && ((i & 0x07) == 0))
len += snprint(p+len, READSTR-len, "\n ");
- len += snprint(p+len, READSTR-len, " %4.4uX", ctlr->eeprom[i]);
+ len += snprint(p+len, READSTR-len, " %4.4ux", ctlr->eeprom[i]);
}
if((ctlr->eeprom[6] & 0x1F00) && !(ctlr->eeprom[6] & 0x8000)){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:471,477 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:471,477
for(i = 0; i < 6; i++){
static int miir(Ctlr*, int, int);
- len += snprint(p+len, READSTR-len, " %4.4uX",
+ len += snprint(p+len, READSTR-len, " %4.4ux",
miir(ctlr, phyaddr, i));
}
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:523,529 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:523,529
ctlr->action = 0;
}
else{
- print("#l%d: action 0x%uX\n", ether->ctlrno, ctlr->action);
+ print("#l%d: action %#ux\n", ether->ctlrno, ctlr->action);
ctlr->action = 0;
break;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:630,636 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:630,636
pbp = nil;
count = rfd->count & 0x3FFF;
if((count < ETHERMAXTU/4) && (pbp = iallocb(count))){
- memmove(pbp->rp, bp->rp+sizeof(Rfd)-sizeof(rfd->data), count);
+ memmove(pbp->rp, bp->rp+offsetof(Rfd, data[0]), count);
pbp->wp = pbp->rp + count;
rfd->count = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:637,643 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:637,643
rfd->field = 0;
}
else if(xbp = rfdalloc(rfd->link)){
- bp->rp += sizeof(Rfd)-sizeof(rfd->data);
+ bp->rp += offsetof(Rfd, data[0]);
bp->wp = bp->rp + count;
xbp->next = bp->next;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:748,754 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:748,754
}
if(status & (StatCX|StatFR|StatCNA|StatRNR|StatMDI|StatSWI))
- panic("#l%d: status %uX\n", ether->ctlrno, status);
+ panic("#l%d: status %#ux\n", ether->ctlrno, status);
}
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:955,961 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:955,961
*/
port = p->mem[1].bar & ~0x01;
if(ioalloc(port, p->mem[1].size, 0, "i82557") < 0){
- print("i82557: port 0x%uX in use\n", port);
+ print("i82557: port %#ux in use\n", port);
continue;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:997,1003 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:997,1003
oui <<= 6;
x = miir(ctlr, i, 3);
oui |= x>>10;
- //print("phy%d: oui %uX reg1 %uX\n", i, oui, miir(ctlr, i, 1));
+ //print("phy%d: oui %#ux reg1 %#ux\n", i, oui, miir(ctlr, i, 1));
ctlr->eeprom[6] = i;
if(oui == 0xAA00)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether82557.c:1093,1099 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether82557.c:1093,1099
sum += x;
}
if(sum != 0xBABA)
- print("#l%d: EEPROM checksum - 0x%4.4uX\n", ether->ctlrno, sum);
+ print("#l%d: EEPROM checksum - %#4.4ux\n", ether->ctlrno, sum);
/*
* Eeprom[6] indicates whether there is a PHY and whether
[rsc] --rw-rw-r-- M 451989 glenda sys 17702 Nov 6 10:19 sys/src/9/pc/ether8390.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8390.c:400,406 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8390.c:400,406
*/
if(hdr.next < ctlr->pstart || hdr.next >= ctlr->pstop
|| len < 60 || len > sizeof(Etherpkt)){
- print("dp8390: H#%2.2ux#%2.2ux#%2.2ux#%2.2ux,%lud\n",
+ print("dp8390: H%2.2ux+%2.2ux+%2.2ux+%2.2ux,%lud\n",
hdr.status, hdr.next, hdr.len0, hdr.len1, len);
regw(ctlr, Cr, Page0|RdABORT|Stp);
ringinit(ctlr);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8390.c:588,594 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8390.c:588,594
if(isr & (Txe|Ptx)){
r = regr(ctlr, Tsr);
if((isr & Txe) && (r & (Cdh|Fu|Crs|Abt))){
- print("dp8390: Tsr#%2.2ux|", r);
+ print("dp8390: Tsr %#2.2ux", r);
ether->oerrs++;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8390.c:686,692 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8390.c:686,692
if(reverse[1] == 0){
for(i = 0; i < 64; i++)
reverse[i] = ((i&1)<<5) | ((i&2)<<3) | ((i&4)<<1)
- | ((i&8)>>1) | ((i&16)>>3) | ((i&32)>>5);
+ | ((i&8)>>1) | ((i&16)>>3) | ((i&32)>>5);
}
/*
[rsc] --rw-rw-r-- M 451989 glenda sys 48733 Nov 6 10:19 sys/src/9/pc/etherelnk3.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherelnk3.c:1485,1499 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherelnk3.c:1485,1499
break;
case 0x5157:
ctlr->eepromcmd = EepromRead8bRegister;
- ctlr->cbfnpa = upamalloc(p->mem[2].bar, p->mem[2].size, 0);
+ ctlr->cbfnpa = p->mem[2].bar&~0x0F;
+ ctlr->cbfn = vmap(p->mem[2].bar&~0x0F, p->mem[2].size);
break;
case 0x6056:
ctlr->eepromcmd = EepromReadOffRegister;
- ctlr->cbfnpa = upamalloc(p->mem[2].bar, p->mem[2].size, 0);
+ ctlr->cbfnpa = p->mem[2].bar&~0x0F;
+ ctlr->cbfn = vmap(p->mem[2].bar&~0x0F, p->mem[2].size);
break;
}
- if(ctlr->cbfnpa != 0)
- ctlr->cbfn = KADDR(ctlr->cbfnpa);
pcisetbme(p);
}
}
[rsc] --rw-rw-r-- M 451989 jmk sys 44431 Nov 6 10:19 sys/src/9/pc/etherigbe.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherigbe.c:439,445 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherigbe.c:439,445
typedef struct Ctlr Ctlr;
typedef struct Ctlr {
- int port;
+ ulong port;
Pcidev* pcidev;
Ctlr* next;
int active;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherigbe.c:1468,1474 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherigbe.c:1468,1475
ctlr->mii = nil;
return -1;
}
- print("oui %X phyno %d\n", phy->oui, phy->phyno);
+ USED(phy);
+ // print("oui %X phyno %d\n", phy->oui, phy->phyno);
/*
* 8254X-specific PHY registers not in 802.3:
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherigbe.c:1848,1857 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherigbe.c:1849,1859
static void
igbepci(void)
{
- int port, cls;
+ int cls;
Pcidev *p;
Ctlr *ctlr;
-
+ void *mem;
+
p = nil;
while(p = pcimatch(p, 0, 0)){
if(p->ccrb != 0x02 || p->ccru != 0)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherigbe.c:1874,1881 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherigbe.c:1876,1883
break;
}
- port = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
- if(port == 0){
+ mem = vmap(p->mem[0].bar & ~0x0F, p->mem[0].size);
+ if(mem == nil){
print("igbe: can't map %8.8luX\n", p->mem[0].bar);
continue;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherigbe.c:1893,1903 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherigbe.c:1895,1905
break;
}
ctlr = malloc(sizeof(Ctlr));
- ctlr->port = port;
+ ctlr->port = p->mem[0].bar & ~0x0F;
ctlr->pcidev = p;
ctlr->id = (p->did<<16)|p->vid;
ctlr->cls = cls*4;
- ctlr->nic = KADDR(ctlr->port);
+ ctlr->nic = mem;
if(igbereset(ctlr)){
free(ctlr);
[rsc] --rw-rw-r-- M 451989 glenda sys 3747 Nov 6 10:19 sys/src/9/pc/etherwavelan.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherwavelan.c:87,92 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherwavelan.c:87,93
int did;
} wavelanpci[] = {
0x1260, 0x3873, /* Intersil Prism2.5 */
+ 0x1737, 0x0019, /* Linksys WPC-11 untested */
};
static Ctlr *ctlrhead, *ctlrtail;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherwavelan.c:95,101 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherwavelan.c:96,102
wavelanpciscan(void)
{
int i;
- ulong pa;
+ void *mem;
Pcidev *p;
Ctlr *ctlr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherwavelan.c:117,129 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherwavelan.c:118,130
ctlr = malloc(sizeof(Ctlr));
ctlr->pcidev = p;
- pa = upamalloc(p->mem[0].bar&~0xF, p->mem[0].size, 0);
- if(pa == 0){
- print("wavelanpci: %.4ux %.4ux: upamalloc 0x%.8lux %d failed\n", p->vid, p->did, p->mem[0].bar&~0xF, p->mem[0].size);
+ mem = vmap(p->mem[0].bar&~0xF, p->mem[0].size);
+ if(mem == nil){
+ print("wavelanpci: %.4ux %.4ux: vmap 0x%.8lux %d failed\n", p->vid, p->did, p->mem[0].bar&~0xF, p->mem[0].size);
free(ctlr);
continue;
}
- ctlr->mmb = (ushort*)KADDR(pa);
+ ctlr->mmb = mem;
if(ctlrhead != nil)
ctlrtail->next = ctlr;
else
[rsc] --rw-rw-r-- M 451989 glenda sys 4461 Nov 6 10:19 sys/src/9/pc/fns.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/fns.h:3,11 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/fns.h:3,9
void aamloop(int);
Dirtab* addarchfile(char*, int, long(*)(Chan*,void*,long,vlong), long(*)(Chan*,void*,long,vlong));
void archinit(void);
- void bootargs(ulong);
- int cistrcmp(char*, char*);
- int cistrncmp(char*, char*, int);
+ void bootargs(void*);
void clockintr(Ureg*, void*);
void (*coherence)(void);
void cpuid(char*, int*, int*);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/fns.h:46,56 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/fns.h:44,56
void i8253link(void);
uvlong i8253read(uvlong*);
void i8253timerset(uvlong);
+ int i8259disable(int);
+ int i8259enable(Vctl*);
void i8259init(void);
int i8259isr(int);
- int i8259enable(Vctl*);
+ void i8259on(void);
+ void i8259off(void);
int i8259vecno(int);
- int i8259disable(int);
void idle(void);
void idlehands(void);
int inb(int);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/fns.h:61,66 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/fns.h:61,69
void insl(int, void*, int);
int intrdisable(int, void (*)(Ureg *, void *), void*, int, char*);
void intrenable(int, void (*)(Ureg*, void*), void*, int, char*);
+ void introff(void);
+ void intron(void);
+ void invlpg(ulong);
void iofree(int);
void ioinit(void);
int iounused(int, int);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/fns.h:68,73 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/fns.h:71,77
int ioreserve(int, int, int, char*);
int iprint(char*, ...);
int isaconfig(char*, int, ISAConf*);
+ void* kaddr(ulong);
void kbdenable(void);
void kbdinit(void);
#define kmapinval()
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/fns.h:82,91 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/fns.h:86,94
void mb386(void);
void mb586(void);
void meminit(void);
+ void memorysummary(void);
#define mmuflushtlb(pdb) putcr3(pdb)
void mmuinit(void);
- ulong mmukmap(ulong, ulong, int);
- int mmukmapsync(ulong);
ulong* mmuwalk(ulong*, ulong, int, int);
uchar nvramread(int);
void nvramwrite(int, uchar);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/fns.h:95,100 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/fns.h:98,104
void outss(int, void*, int);
void outl(int, ulong);
void outsl(int, void*, int);
+ ulong paddr(void*);
int pciscan(int, Pcidev**);
ulong pcibarsize(Pcidev*, int);
int pcicfgr8(Pcidev*, int);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/fns.h:122,139 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/fns.h:126,149
void pcmspecialclose(int);
void (*_pcmspecialclose)(int);
void pcmunmap(int, PCMmap*);
+ int pdbmap(ulong*, ulong, ulong, int);
void procrestore(Proc*);
void procsave(Proc*);
void procsetup(Proc*);
void putcr3(ulong);
void putcr4(ulong);
+ void* rampage(void);
void rdmsr(int, vlong*);
+ void realmode(Ureg*);
void screeninit(void);
void (*screenputs)(char*, int);
void syncclock(void);
+ void* tmpmap(Page*);
+ void tmpunmap(void*);
void touser(void*);
void trapenable(int, void (*)(Ureg*, void*), void*, char*);
void trapinit(void);
+ void trapinit0(void);
int tas(void*);
uvlong tscticks(uvlong*);
ulong umbmalloc(ulong, int, int);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/fns.h:140,154 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/fns.h:150,168
void umbfree(ulong, int);
ulong umbrwmalloc(ulong, int, int);
void umbrwfree(ulong, int);
- ulong upamalloc(ulong, int, int);
+ ulong upaalloc(int, int);
void upafree(ulong, int);
+ void upareserve(ulong, int);
#define userureg(ur) (((ur)->cs & 0xFFFF) == UESEL)
void vectortable(void);
+ void* vmap(ulong, int);
+ int vmapsync(ulong);
+ void vunmap(void*, int);
void wrmsr(int, vlong);
int xchgw(ushort*, int);
#define waserror() (up->nerrlab++, setlabel(&up->errlab[up->nerrlab-1]))
- #define KADDR(a) ((void*)((ulong)(a)|KZERO))
- #define PADDR(a) ((ulong)(a)&~KZERO)
+ #define KADDR(a) kaddr(a)
+ #define PADDR(a) paddr((void*)(a))
#define dcflush(a, b)
[rsc] --rw-rw-r-- M 451989 glenda sys 4586 Nov 6 10:19 sys/src/9/pc/i8259.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/i8259.c:197,199 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/i8259.c:197,214
iunlock(&i8259lock);
return 0;
}
+
+ void
+ i8259on(void)
+ {
+ outb(Int0aux, i8259mask&0xFF);
+ outb(Int1aux, (i8259mask>>8)&0xFF);
+ }
+
+ void
+ i8259off(void)
+ {
+ outb(Int0aux, 0xFF);
+ outb(Int1aux, 0xFF);
+ }
+
[rsc] --rw-rw-r-- M 451989 glenda sys 28347 Nov 6 10:20 sys/src/9/pc/l.s
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:1,4 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:1,6
#include "mem.h"
+ #include "/sys/src/boot/pc/x16.h"
+ #undef DELAY
#define PADDR(a) ((a) & ~KZERO)
#define KADDR(a) (KZERO|(a))
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:13,18 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:15,21
#define RDTSC BYTE $0x0F; BYTE $0x31 /* RDTSC, result in AX/DX (lo/hi) */
#define RDMSR BYTE $0x0F; BYTE $0x32 /* RDMSR, result in AX/DX (lo/hi) */
#define HLT BYTE $0xF4
+ #define INVLPG BYTE $0x0F; BYTE $0x01; BYTE $0x39 /* INVLPG (%ecx) */
/*
* Macros for calculating offsets within the page directory base
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:27,34 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:30,37
* 9load currently sets up the mmu, however the first 16MB of memory is identity
* mapped, so behave as if the mmu was not setup
*/
- TEXT _start0x80100020(SB), $0
- MOVL $_start0x00100020(SB), AX
+ TEXT _startKADDR(SB), $0
+ MOVL $_startPADDR(SB), AX
ANDL $~KZERO, AX
JMP* AX
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:40,49 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:43,52
LONG $0x00010003 /* flags */
LONG $-(0x1BADB002 + 0x00010003) /* checksum */
LONG $_multibootheader-KZERO(SB) /* header_addr */
- LONG $_start0x80100020-KZERO(SB) /* load_addr */
+ LONG $_startKADDR-KZERO(SB) /* load_addr */
LONG $edata-KZERO(SB) /* load_end_addr */
LONG $end-KZERO(SB) /* bss_end_addr */
- LONG $_start0x80100020-KZERO(SB) /* entry_addr */
+ LONG $_startKADDR-KZERO(SB) /* entry_addr */
LONG $0 /* mode_type */
LONG $0 /* width */
LONG $0 /* height */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:51,57 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:54,60
/*
* In protected mode with paging turned off and segment registers setup to linear map all memory.
- * Entered via a jump to 0x00100020, the physical address of the virtual kernel entry point of 0x80100020
+ * Entered via a jump to PADDR(entry), the physical address of the virtual kernel entry point of KADDR(entry)
* Make the basic page tables for processor 0. Four pages are needed for the basic set:
* a page directory, a page table for mapping the first 4MB of physical memory to KZERO,
* and virtual and physical pages for mapping the Mach structure.
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:60,66 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:63,69
* identity mapping is removed once the MMU is going and the JMP has been made
* to virtual memory.
*/
- TEXT _start0x00100020(SB), $0
+ TEXT _startPADDR(SB), $0
CLI /* make sure interrupts are off */
/* set up the gdt so we have sane plan 9 style gdts. */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:109,118 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:112,132
* that's needed as we start executing in physical addresses.
*/
TEXT tgdtptr(SB), $0
-
WORD $(3*8)
LONG $tgdt-KZERO(SB)
+ TEXT m0rgdtptr(SB), $0
+ WORD $(NGDT*8-1)
+ LONG $(CPU0GDT-KZERO)
+
+ TEXT m0gdtptr(SB), $0
+ WORD $(NGDT*8-1)
+ LONG $CPU0GDT
+
+ TEXT m0idtptr(SB), $0
+ WORD $(256*8-1)
+ LONG $IDTADDR
+
TEXT mode32bit(SB), $0
/* At this point, the GDT setup is done. */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:126,132 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:140,146
MOVL $PADDR(CPU0PDB), AX
ADDL $PDO(KZERO), AX /* page directory offset for KZERO */
- MOVL $PADDR(CPU0PTE), (AX) /* PTE's for 0x80000000 */
+ MOVL $PADDR(CPU0PTE), (AX) /* PTE's for KZERO */
MOVL $(PTEWRITE|PTEVALID), BX /* page permissions */
ORL BX, (AX)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:212,217 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:226,459
JMP _idle
/*
+ * Save registers.
+ */
+ TEXT saveregs(SB), $0
+ /* appease 8l */
+ SUBL $32, SP
+ POPL AX
+ POPL AX
+ POPL AX
+ POPL AX
+ POPL AX
+ POPL AX
+ POPL AX
+ POPL AX
+
+ PUSHL AX
+ PUSHL BX
+ PUSHL CX
+ PUSHL DX
+ PUSHL BP
+ PUSHL DI
+ PUSHL SI
+ PUSHFL
+
+ XCHGL 32(SP), AX /* swap return PC and saved flags */
+ XCHGL 0(SP), AX
+ XCHGL 32(SP), AX
+ RET
+
+ TEXT restoreregs(SB), $0
+ /* appease 8l */
+ PUSHL AX
+ PUSHL AX
+ PUSHL AX
+ PUSHL AX
+ PUSHL AX
+ PUSHL AX
+ PUSHL AX
+ PUSHL AX
+ ADDL $32, SP
+
+ XCHGL 32(SP), AX /* swap return PC and saved flags */
+ XCHGL 0(SP), AX
+ XCHGL 32(SP), AX
+
+ POPFL
+ POPL SI
+ POPL DI
+ POPL BP
+ POPL DX
+ POPL CX
+ POPL BX
+ POPL AX
+ RET
+
+ /*
+ * Assumed to be in protected mode at time of call.
+ * Switch to real mode, execute an interrupt, and
+ * then switch back to protected mode.
+ *
+ * Assumes:
+ *
+ * - no device interrupts are going to come in
+ * - 0-16MB is identity mapped in page tables
+ * - realmode() has copied us down from 0x100000 to 0x8000
+ * - can use code segment 0x0800 in real mode
+ * to get at l.s code
+ * - l.s code is less than 1 page
+ */
+ #define RELOC (RMCODE-KTZERO)
+
+ TEXT realmodeidtptr(SB), $0
+ WORD $(4*256-1)
+ LONG $0
+
+ TEXT realmode0(SB), $0
+ CALL saveregs(SB)
+
+ /* switch to low code address */
+ LEAL physcode-KZERO(SB), AX
+ JMP *AX
+
+ TEXT physcode(SB), $0
+
+ /* switch to low stack */
+ MOVL SP, AX
+ MOVL $0x7C00, SP
+ PUSHL AX
+
+ /* change gdt to physical pointer */
+ MOVL m0rgdtptr-KZERO(SB), GDTR
+
+ /* load IDT with real-mode version*/
+ MOVL realmodeidtptr-KZERO(SB), IDTR
+
+ /* edit INT $0x00 instruction below */
+ MOVL $(RMUADDR-KZERO+48), AX /* &rmu.trap */
+ MOVL (AX), AX
+ MOVB AX, realmodeintrinst+(-KZERO+1+RELOC)(SB)
+
+ /* disable paging */
+ MOVL CR0, AX
+ ANDL $0x7FFFFFFF, AX
+ MOVL AX, CR0
+ /* JMP .+2 to clear prefetch queue*/
+ BYTE $0xEB; BYTE $0x00
+
+ /* jump to 16-bit code segment */
+ /* JMPFAR SELECTOR(KESEG16, SELGDT, 0):$again16bit(SB) /**/
+ BYTE $0xEA
+ LONG $again16bit-KZERO(SB)
+ WORD $SELECTOR(KESEG16, SELGDT, 0)
+
+ TEXT again16bit(SB), $0
+ /*
+ * Now in 16-bit compatibility mode.
+ * These are 32-bit instructions being interpreted
+ * as 16-bit instructions. I'm being lazy and
+ * not using the macros because I know when
+ * the 16- and 32-bit instructions look the same
+ * or close enough.
+ */
+
+ /* disable protected mode and jump to real mode cs */
+ OPSIZE; MOVL CR0, AX
+ OPSIZE; XORL BX, BX
+ OPSIZE; INCL BX
+ OPSIZE; XORL BX, AX
+ OPSIZE; MOVL AX, CR0
+
+ /* JMPFAR 0x0800:now16real */
+ BYTE $0xEA
+ WORD $now16real-KZERO(SB)
+ WORD $0x0800
+
+ TEXT now16real(SB), $0
+ /* copy the registers for the bios call */
+ LWI(0x0000, rAX)
+ MOVW AX,SS
+ LWI(RMUADDR, rBP)
+
+ /* offsets are in Ureg */
+ LXW(44, xBP, rAX)
+ MOVW AX, DS
+ LXW(40, xBP, rAX)
+ MOVW AX, ES
+
+ OPSIZE; LXW(0, xBP, rDI)
+ OPSIZE; LXW(4, xBP, rSI)
+ OPSIZE; LXW(16, xBP, rBX)
+ OPSIZE; LXW(20, xBP, rDX)
+ OPSIZE; LXW(24, xBP, rCX)
+ OPSIZE; LXW(28, xBP, rAX)
+
+ CLC
+
+ TEXT realmodeintrinst(SB), $0
+ INT $0x00
+
+ /* save the registers after the call */
+
+ LWI(0x7bfc, rSP)
+ OPSIZE; PUSHFL
+ OPSIZE; PUSHL AX
+
+ LWI(0, rAX)
+ MOVW AX,SS
+ LWI(RMUADDR, rBP)
+
+ OPSIZE; SXW(rDI, 0, xBP)
+ OPSIZE; SXW(rSI, 4, xBP)
+ OPSIZE; SXW(rBX, 16, xBP)
+ OPSIZE; SXW(rDX, 20, xBP)
+ OPSIZE; SXW(rCX, 24, xBP)
+ OPSIZE; POPL AX
+ OPSIZE; SXW(rAX, 28, xBP)
+
+ MOVW DS, AX
+ OPSIZE; SXW(rAX, 44, xBP)
+ MOVW ES, AX
+ OPSIZE; SXW(rAX, 40, xBP)
+
+ OPSIZE; POPL AX
+ OPSIZE; SXW(rAX, 64, xBP) /* flags */
+
+ /* re-enter protected mode and jump to 32-bit code */
+ OPSIZE; MOVL $1, AX
+ OPSIZE; MOVL AX, CR0
+
+ /* JMPFAR SELECTOR(KESEG, SELGDT, 0):$again32bit(SB) /**/
+ OPSIZE
+ BYTE $0xEA
+ LONG $again32bit-KZERO(SB)
+ WORD $SELECTOR(KESEG, SELGDT, 0)
+
+ TEXT again32bit(SB), $0
+ MOVW $SELECTOR(KDSEG, SELGDT, 0),AX
+ MOVW AX,DS
+ MOVW AX,SS
+ MOVW AX,ES
+ MOVW AX,FS
+ MOVW AX,GS
+
+ /* enable paging and jump to kzero-address code */
+ MOVL CR0, AX
+ ORL $0x80000000, AX
+ MOVL AX, CR0
+ LEAL again32kzero(SB), AX
+ JMP* AX
+
+ TEXT again32kzero(SB), $0
+ /* breathe a sigh of relief - back in 32-bit protected mode */
+
+ /* switch to old stack */
+ PUSHL AX /* match popl below for 8l */
+ MOVL $0x7BFC, SP
+ POPL SP
+
+ /* restore idt */
+ MOVL m0idtptr(SB),IDTR
+
+ /* restore gdt */
+ MOVL m0gdtptr(SB), GDTR
+
+ CALL restoreregs(SB)
+ RET
+
+ /*
+ /*
* Port I/O.
* in[bsl] input a byte|short|long
* ins[bsl] input a string of bytes|shorts|longs
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:347,352 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:589,600
MOVL AX, CR4
RET
+ TEXT invlpg(SB), $0
+ /* 486+ only */
+ MOVL va+0(FP), CX
+ INVLPG
+ RET
+
TEXT _cycles(SB), $0 /* time stamp counter */
RDTSC
MOVL vlong+0(FP), CX /* &vlong */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/l.s:442,462 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/l.s:690,710
* FNxxx variations) so WAIT instructions must be explicitly placed in the
* code as necessary.
*/
- #define FPOFF(l) ;\
- MOVL CR0, AX ;\
- ANDL $0xC, AX /* EM, TS */ ;\
- CMPL AX, $0x8 ;\
- JEQ l ;\
- WAIT ;\
- l: ;\
- MOVL CR0, AX ;\
- ANDL $~0x4, AX /* EM=0 */ ;\
- ORL $0x28, AX /* NE=1, TS=1 */ ;\
+ #define FPOFF(l) ;\
+ MOVL CR0, AX ;\
+ ANDL $0xC, AX /* EM, TS */ ;\
+ CMPL AX, $0x8 ;\
+ JEQ l ;\
+ WAIT ;\
+ l: ;\
+ MOVL CR0, AX ;\
+ ANDL $~0x4, AX /* EM=0 */ ;\
+ ORL $0x28, AX /* NE=1, TS=1 */ ;\
MOVL AX, CR0
- #define FPON ;\
- MOVL CR0, AX ;\
- ANDL $~0xC, AX /* EM=0, TS=0 */ ;\
+ #define FPON ;\
+ MOVL CR0, AX ;\
+ ANDL $~0xC, AX /* EM=0, TS=0 */ ;\
MOVL AX, CR0
TEXT fpoff(SB), $0 /* disable */
[rsc] --rw-rw-r-- M 451989 glenda sys 15224 Nov 6 10:20 sys/src/9/pc/main.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:29,34 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:29,35
char *confval[MAXCONF];
int nconf;
uchar *sp; /* user stack of init proc */
+ int delaylink;
static void
options(void)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:69,74 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:70,76
}
}
+ void mmuinit0(void);
void
main(void)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:81,86 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:83,91
print("\nPlan 9\n");
+ trapinit0();
+ mmuinit0();
+
kbdinit();
i8253init();
cpuidentify();
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:101,107 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:106,116
arch->clockenable();
procinit0();
initseg();
- links();
+ if(delaylink){
+ bootlinks();
+ pcimatch(0, 0, 0);
+ }else
+ links();
conf.monitor = 1;
chandevreset();
pageinit();
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:194,202 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:203,211
void
userinit(void)
{
+ void *v;
Proc *p;
Segment *s;
- KMap *k;
Page *pg;
p = newproc();
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:226,239 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:235,252
/*
* User Stack
+ *
+ * N.B. cannot call newpage() with clear=1, because pc kmap
+ * requires up != nil. use tmpmap instead.
*/
s = newseg(SG_STACK, USTKTOP-USTKSIZE, USTKSIZE/BY2PG);
p->seg[SSEG] = s;
- pg = newpage(1, 0, USTKTOP-BY2PG);
+ pg = newpage(0, 0, USTKTOP-BY2PG);
+ v = tmpmap(pg);
+ memset(v, 0, BY2PG);
segpage(s, pg);
- k = kmap(pg);
- bootargs(VA(k));
- kunmap(k);
+ bootargs(v);
+ tmpunmap(v);
/*
* Text
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:241,252 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:254,266
s = newseg(SG_TEXT, UTZERO, 1);
s->flushme++;
p->seg[TSEG] = s;
- pg = newpage(1, 0, UTZERO);
+ pg = newpage(0, 0, UTZERO);
memset(pg->cachectl, PG_TXTFLUSH, sizeof(pg->cachectl));
segpage(s, pg);
- k = kmap(s->map[0]->pages[0]);
- memmove((ulong*)VA(k), initcode, sizeof initcode);
- kunmap(k);
+ v = tmpmap(pg);
+ memset(v, 0, BY2PG);
+ memmove(v, initcode, sizeof initcode);
+ tmpunmap(v);
ready(p);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:263,269 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:277,283
}
void
- bootargs(ulong base)
+ bootargs(void *base)
{
int i, ac;
uchar *av[32];
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:295,303 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:309,317
sp -= (ac+1)*sizeof(sp);
lsp = (uchar**)sp;
for(i = 0; i < ac; i++)
- *lsp++ = av[i] + ((USTKTOP - BY2PG) - base);
+ *lsp++ = av[i] + ((USTKTOP - BY2PG) - (ulong)base);
*lsp = 0;
- sp += (USTKTOP - BY2PG) - base - sizeof(ulong);
+ sp += (USTKTOP - BY2PG) - (ulong)base - sizeof(ulong);
}
char*
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:344,350 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:358,364
confinit(void)
{
char *p;
- int userpcnt;
+ int i, userpcnt;
ulong kpages;
if(p = getconf("*kernelpercent"))
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:352,358 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:366,374
else
userpcnt = 0;
- conf.npage = conf.npage0 + conf.npage1;
+ conf.npage = 0;
+ for(i=0; i<nelem(conf.mem); i++)
+ conf.npage += conf.mem[i].npage;
conf.nproc = 100 + ((conf.npage*BY2PG)/MB)*5;
if(cpuserver)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:397,402 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:413,426
if(conf.npage*BY2PG < 16*MB)
imagmem->minarena = 4*1024*1024;
}
+
+ /*
+ * can't go past the end of virtual memory
+ * (ulong)-KZERO is 2^32 - KZERO
+ */
+ if(kpages > ((ulong)-KZERO)/BY2PG)
+ kpages = ((ulong)-KZERO)/BY2PG;
+
conf.upages = conf.npage - kpages;
conf.ialloc = (kpages/2)*BY2PG;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:493,499 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:517,523
* math coprocessor emulation fault
*/
static void
- mathemu(Ureg*, void*)
+ mathemu(Ureg *ureg, void*)
{
if(up->fpstate & FPillegal){
/* someone did floating point in a note handler */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/main.c:521,527 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/main.c:545,552
up->fpstate = FPactive;
break;
case FPactive:
- panic("math emu");
+ panic("math emu pid %ld %s pc 0x%lux",
+ up->pid, up->text, ureg->pc);
break;
}
}
[rsc] --rw-rw-r-- M 451989 glenda sys 5209 Nov 6 10:20 sys/src/9/pc/mem.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mem.h:11,16 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mem.h:11,17
#define BY2V 8 /* bytes per double word */
#define BY2PG 4096 /* bytes per page */
#define WD2PG (BY2PG/BY2WD) /* words per page */
+ #define BY2XPG (4096*1024) /* bytes per big page */
#define PGSHIFT 12 /* log(BY2PG) */
#define ROUND(s, sz) (((s)+((sz)-1))&~((sz)-1))
#define PGROUND(s) ROUND(s, BY2PG)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mem.h:27,66 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mem.h:28,75
#define TK2SEC(t) ((t)/HZ) /* ticks to seconds */
/*
- * Fundamental addresses
- */
- #define IDTADDR 0x80000800 /* idt */
- #define REBOOTADDR 0x00001000 /* reboot code - physical address */
- #define APBOOTSTRAP 0x80001000 /* AP bootstrap code */
- #define CONFADDR 0x80001200 /* info passed from boot loader */
- #define CPU0PDB 0x80002000 /* bootstrap processor PDB */
- #define CPU0PTE 0x80003000 /* bootstrap processor PTE's for 0-4MB */
- #define CPU0GDT 0x80004000 /* bootstrap processor GDT */
- #define MACHADDR 0x80005000 /* as seen by current processor */
- #define CPU0MACH 0x80006000 /* Mach for bootstrap processor */
- #define MACHSIZE BY2PG
- /*
- * N.B. ramscan knows that CPU0MACH+BY2PG is the end of reserved data
- * N.B. _start0x00100020 knows that CPU0PDB is the first reserved page
- * and that there are 5 of them.
- */
-
- /*
* Address spaces
- *
- * User is at 0-2GB
- * Kernel is at 2GB-4GB
*/
+ #define KZERO 0xF0000000 /* base of kernel address space */
+ #define KTZERO (KZERO+0x100000) /* first address in kernel text - 9load sits below */
+ #define VPT (KZERO-VPTSIZE)
+ #define VPTSIZE BY2XPG
+ #define NVPT (VPTSIZE/BY2WD)
+ #define KMAP (VPT-KMAPSIZE)
+ #define KMAPSIZE BY2XPG
+ #define VMAP (KMAP-VMAPSIZE)
+ #define VMAPSIZE (0x10000000-VPTSIZE-KMAPSIZE)
#define UZERO 0 /* base of user address space */
#define UTZERO (UZERO+BY2PG) /* first address in user text */
- #define KZERO 0x80000000 /* base of kernel address space */
- #define KTZERO 0x80100000 /* first address in kernel text */
- #define USTKTOP (KZERO-BY2PG) /* byte just beyond user stack */
+ #define USTKTOP (VMAP-BY2PG) /* byte just beyond user stack */
#define USTKSIZE (16*1024*1024) /* size of user stack */
#define TSTKTOP (USTKTOP-USTKSIZE) /* end of new stack in sysexec */
#define TSTKSIZ 100
/*
+ * Fundamental addresses - bottom 64kB saved for return to real mode
+ */
+ #define CONFADDR (KZERO+0x1200) /* info passed from boot loader */
+ #define TMPADDR (KZERO+0x2000) /* used for temporary mappings */
+ #define APBOOTSTRAP (KZERO+0x3000) /* AP bootstrap code */
+ #define RMUADDR (KZERO+0x7C00) /* real mode Ureg */
+ #define RMCODE (KZERO+0x8000) /* copy of first page of KTEXT */
+ #define RMBUF (KZERO+0x9000) /* buffer for user space - known to vga */
+ #define IDTADDR (KZERO+0x10800) /* idt */
+ #define REBOOTADDR (KZERO+0x11000) /* reboot code - physical address */
+ #define CPU0PDB (KZERO+0x12000) /* bootstrap processor PDB */
+ #define CPU0PTE (KZERO+0x13000) /* bootstrap processor PTE's for 0-4MB */
+ #define CPU0GDT (KZERO+0x14000) /* bootstrap processor GDT */
+ #define MACHADDR (KZERO+0x15000) /* as seen by current processor */
+ #define CPU0MACH (KZERO+0x16000) /* Mach for bootstrap processor */
+ #define MACHSIZE BY2PG
+ /*
+ * N.B. ramscan knows that CPU0MACH+BY2PG is the end of reserved data
+ * N.B. _startPADDR knows that CPU0PDB is the first reserved page
+ * and that there are 5 of them.
+ */
+
+ /*
* known x86 segments (in GDT) and their selectors
*/
#define NULLSEG 0 /* null segment */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mem.h:72,77 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mem.h:81,87
#define APMCSEG 6 /* APM code segment */
#define APMCSEG16 7 /* APM 16-bit code segment */
#define APMDSEG 8 /* APM data segment */
+ #define KESEG16 9 /* kernel executable 16-bit */
#define NGDT 10 /* number of GDT entries required */
/* #define APM40SEG 8 /* APM segment 0x40 */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mem.h:141,143 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mem.h:151,154
#define PTX(va) ((((ulong)(va))>>12) & 0x03FF)
#define getpgcolor(a) 0
+
[rsc] --rw-rw-r-- M 451989 glenda sys 18222 Nov 6 10:20 sys/src/9/pc/memory.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:8,13 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:8,14
#include "dat.h"
#include "fns.h"
#include "io.h"
+ #include "ureg.h"
#define MEMDEBUG 0
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:15,26 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:16,28
MemUPA = 0, /* unbacked physical address */
MemRAM = 1, /* physical memory */
MemUMB = 2, /* upper memory block (<16MB) */
- NMemType = 3,
+ MemReserved = 3,
+ NMemType = 4,
KB = 1024,
MemMinMB = 4, /* minimum physical memory (<=4MB) */
- MemMaxMB = 768, /* maximum physical memory to check */
+ MemMaxMB = 3*1024+768, /* maximum physical memory to check */
NMemBase = 10,
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:27,33 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:29,35
typedef struct Map Map;
struct Map {
- int size;
+ ulong size;
ulong addr;
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:40,45 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:42,50
Lock;
};
+ /*
+ * Memory allocation tracking.
+ */
static Map mapupa[16];
static RMap rmapupa = {
"unallocated unbacked physical memory",
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:82,88 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:87,93
print("%s\n", rmap->name);
for(mp = rmap->map; mp->size; mp++)
- print("\t%8.8luX %8.8uX %8.8luX\n", mp->addr, mp->size, mp->addr+mp->size);
+ print("\t%8.8luX %8.8luX (%lud)\n", mp->addr, mp->addr+mp->size, mp->size);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:91,99 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:96,101
{
ulong maxpa, maxpa1, maxpa2;
- if(MEMDEBUG == 0)
- return;
-
maxpa = (nvramread(0x18)<<8)|nvramread(0x17);
maxpa1 = (nvramread(0x31)<<8)|nvramread(0x30);
maxpa2 = (nvramread(0x16)<<8)|nvramread(0x15);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:209,214 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:211,231
return 0;
}
+ /*
+ * Allocate from the ram map directly to make page tables.
+ * Called by mmuwalk during e820scan.
+ */
+ void*
+ rampage(void)
+ {
+ ulong m;
+
+ m = mapalloc(&rmapram, 0, BY2PG, BY2PG);
+ if(m == 0)
+ return nil;
+ return KADDR(m);
+ }
+
static void
umbscan(void)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:269,287 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:286,297
}
static void
- ramscan(ulong maxmem)
+ lowraminit(void)
{
- ulong *k0, kzero, map, maxpa, pa, *pte, *table, *va, x, n;
- int nvalid[NMemType];
+ ulong n, pa, x;
uchar *bda;
/*
- * The bootstrap code has has created a prototype page
- * table which maps the first MemMinMB of physical memory to KZERO.
- * The page directory is at m->pdb and the first page of
- * free memory is after the per-processor MMU information.
- */
- /*
* Initialise the memory bank information for conventional memory
* (i.e. less than 640KB). The base is the first location after the
* bootstrap processor MMU information and the limit is obtained from
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:297,304 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:307,329
pa = MemMinMB*MB;
mapfree(&rmapram, x, pa-x);
memset(KADDR(x), 0, pa-x); /* keep us honest */
+ }
+ static void
+ ramscan(ulong maxmem)
+ {
+ ulong *k0, kzero, map, maxkpa, maxpa, pa, *pte, *table, *va, vbase, x;
+ int nvalid[NMemType];
+
/*
+ * The bootstrap code has has created a prototype page
+ * table which maps the first MemMinMB of physical memory to KZERO.
+ * The page directory is at m->pdb and the first page of
+ * free memory is after the per-processor MMU information.
+ */
+ pa = MemMinMB*MB;
+
+ /*
* Check if the extended memory size can be obtained from the CMOS.
* If it's 0 then it's either not known or >= 64MB. Always check
* at least 24MB in case there's a memory gap (up to 8MB) below 16MB;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:314,323 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:339,347
maxpa = MB+x*KB;
if(maxpa < 24*MB)
maxpa = 24*MB;
- maxmem = MemMaxMB*MB;
- }
- else
+ }else
maxpa = maxmem;
+ maxkpa = (u32int)-KZERO; /* 2^32 - KZERO */
/*
* March up memory from MemMinMB to maxpa 1MB at a time,
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:330,344 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:354,377
map = 0;
x = 0x12345678;
memset(nvalid, 0, sizeof(nvalid));
+
+ /*
+ * Can't map memory to KADDR(pa) when we're walking because
+ * can only use KADDR for relatively low addresses. Instead,
+ * map each 4MB we scan to the virtual address range 4MB-8MB
+ * while we are scanning.
+ */
+ vbase = 4*MB;
while(pa < maxpa){
/*
* Map the page. Use mapalloc(&rmapram, ...) to make
* the page table if necessary, it will be returned to the
- * pool later if it isn't needed.
+ * pool later if it isn't needed. Map in a fixed range (the second 4M)
+ * because high physical addresses cannot be passed to KADDR.
*/
- va = KADDR(pa);
+ va = (void*)(vbase + pa%(4*MB));
table = &m->pdb[PDX(va)];
- if(*table == 0){
+ if(pa%(4*MB) == 0){
if(map == 0 && (map = mapalloc(&rmapram, 0, BY2PG, BY2PG)) == 0)
break;
memset(KADDR(map), 0, BY2PG);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:350,359 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:383,391
*pte = pa|PTEWRITE|PTEUNCACHED|PTEVALID;
mmuflushtlb(PADDR(m->pdb));
-
/*
* Write a pattern to the page and write a different
- * pattern to a possible mirror at KZER0. If the data
+ * pattern to a possible mirror at KZERO. If the data
* reads back correctly the chunk is some type of RAM (possibly
* a linearly-mapped VGA framebuffer, for instance...) and
* can be cleared and added to the memory pool. If not, the
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:389,395 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:421,426
*pte = 0;
pa += MB;
}
-
/*
* Done with this 4MB chunk, review the options:
* 1) not physical memory and >=16MB - invalidate the PDB entry;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:399,406 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:430,446
* 4) mixed or no 4MB page extension - commit the already
* initialised space for the page table.
*/
- if((pa % (4*MB)) == 0){
- table = &m->pdb[PDX(va)];
+ if(pa%(4*MB) == 0 && pa >= 32*MB && nvalid[MemUPA] == (4*MB)/BY2PG){
+ /*
+ * If we encounter a 4MB chunk of missing memory
+ * at a sufficiently high offset, call it the end of
+ * memory. Otherwise we run the risk of thinking
+ * that video memory is real RAM.
+ */
+ break;
+ }
+ if(pa <= maxkpa && pa%(4*MB) == 0){
+ table = &m->pdb[PDX(KADDR(pa - 4*MB))];
if(nvalid[MemUPA] == (4*MB)/BY2PG)
*table = 0;
else if(nvalid[MemRAM] == (4*MB)/BY2PG && (m->cpuiddx & 0x08))
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:407,444 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:447,713
*table = (pa - 4*MB)|PTESIZE|PTEWRITE|PTEVALID;
else if(nvalid[MemUMB] == (4*MB)/BY2PG && (m->cpuiddx & 0x08))
*table = (pa - 4*MB)|PTESIZE|PTEWRITE|PTEUNCACHED|PTEVALID;
- else
+ else{
+ *table = map|PTEWRITE|PTEVALID;
map = 0;
+ }
}
-
mmuflushtlb(PADDR(m->pdb));
x += 0x3141526;
}
-
/*
* If we didn't reach the end of the 4MB chunk, that part won't
* be mapped. Commit the already initialised space for the page table.
*/
- if(pa % (4*MB))
+ if(pa % (4*MB) && pa <= maxkpa){
+ m->pdb[PDX(KADDR(pa))] = map|PTEWRITE|PTEVALID;
map = 0;
-
+ }
if(map)
mapfree(&rmapram, map, BY2PG);
- if(pa < maxmem)
- mapfree(&rmapupa, pa, maxmem-pa);
- if(maxmem < 0xFFE00000)
- mapfree(&rmapupa, maxmem, 0x00000000-maxmem);
- if(MEMDEBUG)
- print("maxmem %luX %luX\n", maxmem, 0x00000000-maxmem);
+
+ m->pdb[PDX(vbase)] = 0;
+ mmuflushtlb(PADDR(m->pdb));
+
+ mapfree(&rmapupa, pa, (u32int)-pa);
*k0 = kzero;
}
+ /*
+ * BIOS Int 0x15 E820 memory map.
+ */
+ enum
+ {
+ SMAP = ('S'<<24)|('M'<<16)|('A'<<8)|'P',
+ Ememory = 1,
+ Ereserved = 2,
+ Carry = 1,
+ };
+
+ typedef struct Emap Emap;
+ struct Emap
+ {
+ uvlong base;
+ uvlong len;
+ ulong type;
+ };
+ static Emap emap[16];
+ int nemap;
+
+ static char *etypes[] =
+ {
+ "type=0",
+ "memory",
+ "reserved",
+ "acpi reclaim",
+ "acpi nvs",
+ };
+
+ static int
+ emapcmp(const void *va, const void *vb)
+ {
+ Emap *a, *b;
+
+ a = (Emap*)va;
+ b = (Emap*)vb;
+ if(a->base < b->base)
+ return -1;
+ if(a->base > b->base)
+ return 1;
+ if(a->len < b->len)
+ return -1;
+ if(a->len > b->len)
+ return 1;
+ return a->type - b->type;
+ }
+
+ static void
+ map(ulong base, ulong len, int type)
+ {
+ ulong e, n;
+ ulong *table, flags, maxkpa;
+
+ /*
+ * Split any call crossing 4*MB to make below simpler.
+ */
+ if(base < 4*MB && len > 4*MB-base){
+ n = 4*MB - base;
+ map(base, n, type);
+ map(4*MB, len-n, type);
+ }
+
+ /*
+ * Let lowraminit and umbscan hash out the low 4MB.
+ */
+ if(base < 4*MB)
+ return;
+
+ /*
+ * Any non-memory below 16*MB is used as upper mem blocks.
+ */
+ if(type == MemUPA && base < 16*MB && base+len > 16*MB){
+ map(base, 16*MB-base, MemUMB);
+ map(16*MB, len-(16*MB-base), MemUPA);
+ return;
+ }
+
+ /*
+ * Memory below CPU0MACH is reserved for the kernel
+ * and already mapped.
+ */
+ if(base < PADDR(CPU0MACH)+BY2PG){
+ n = PADDR(CPU0MACH)+BY2PG - base;
+ if(len <= n)
+ return;
+ map(PADDR(CPU0MACH), len-n, type);
+ return;
+ }
+
+ /*
+ * Memory between KTZERO and end is the kernel itself
+ * and is already mapped.
+ */
+ if(base < PADDR(KTZERO) && base+len > PADDR(KTZERO)){
+ map(base, PADDR(KTZERO)-base, type);
+ return;
+ }
+ if(PADDR(KTZERO) < base && base < PADDR(PGROUND((ulong)end))){
+ n = PADDR(PGROUND((ulong)end));
+ if(len <= n)
+ return;
+ map(PADDR(PGROUND((ulong)end)), len-n, type);
+ return;
+ }
+
+ /*
+ * Now we have a simple case.
+ */
+ // print("map %.8lux %.8lux %d\n", base, base+len, type);
+ switch(type){
+ case MemRAM:
+ mapfree(&rmapram, base, len);
+ flags = PTEWRITE;
+ break;
+ case MemUMB:
+ mapfree(&rmapumb, base, len);
+ flags = PTEWRITE|PTEUNCACHED;
+ break;
+ case MemUPA:
+ mapfree(&rmapupa, base, len);
+ /* don't need to map this but will anyway */
+ flags = PTEWRITE|PTEUNCACHED;
+ break;
+ default:
+ case MemReserved:
+ /* don't put in any pools but still map it. */
+ flags = PTEWRITE|PTEUNCACHED;
+ break;
+ }
+
+ /*
+ * bottom 4MB is already mapped - just twiddle flags.
+ * (not currently used - see above)
+ */
+ if(base < 4*MB){
+ table = KADDR(PPN(m->pdb[PDX(base)]));
+ e = base+len;
+ base = PPN(base);
+ for(; base<e; base+=BY2PG)
+ table[PTX(base)] |= flags;
+ return;
+ }
+
+ /*
+ * Only map from KZERO to 2^32.
+ */
+ maxkpa = -KZERO;
+ if(base >= maxkpa)
+ return;
+ if(len > maxkpa-base)
+ len = maxkpa - base;
+ pdbmap(m->pdb, base|flags, base+KZERO, len);
+ }
+
+ static int
+ e820scan(void)
+ {
+ int i;
+ Ureg u;
+ ulong cont, base, last, len;
+ Emap *e;
+
+ if(getconf("*norealmode") || getconf("*noe820scan"))
+ return -1;
+
+ cont = 0;
+ for(i=0; i<nelem(emap); i++){
+ memset(&u, 0, sizeof u);
+ u.ax = 0xE820;
+ u.bx = cont;
+ u.cx = 20;
+ u.dx = SMAP;
+ u.es = (PADDR(RMBUF)>>4)&0xF000;
+ u.di = PADDR(RMBUF)&0xFFFF;
+ u.trap = 0x15;
+ realmode(&u);
+ cont = u.bx;
+ if((u.flags&Carry) || u.ax != SMAP || u.cx != 20)
+ break;
+ e = &emap[nemap++];
+ *e = *(Emap*)RMBUF;
+ if(u.bx == 0)
+ break;
+ }
+ if(nemap == 0)
+ return -1;
+
+ qsort(emap, nemap, sizeof emap[0], emapcmp);
+
+ for(i=0; i<nemap; i++){
+ e = &emap[i];
+ print("E820: %.8llux %.8llux ", e->base, e->base+e->len);
+ if(e->type < nelem(etypes))
+ print("%s\n", etypes[e->type]);
+ else
+ print("type=%lud\n", e->type);
+ }
+
+ last = 0;
+ for(i=0; i<nemap; i++){
+ e = &emap[i];
+ /*
+ * pull out the info but only about the low 32 bits...
+ */
+ if(e->base >= (1LL<<32))
+ break;
+ base = e->base;
+ if(base+e->len > (1LL<<32))
+ len = -base;
+ else
+ len = e->len;
+ /*
+ * If the map skips addresses, mark them available.
+ */
+ if(last < e->base)
+ map(last, e->base-last, MemUPA);
+ last = base+len;
+ if(e->type == Ememory)
+ map(base, len, MemRAM);
+ else
+ map(base, len, MemReserved);
+ }
+
+ return 0;
+ }
+
void
meminit(void)
{
- Map *mp, *xmp;
+ int i;
+ Map *mp;
+ Confmem *cm;
ulong pa, *pte;
- ulong maxmem;
+ ulong maxmem, lost;
char *p;
if(p = getconf("*maxmem"))
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:463,493 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:732,764
mmuflushtlb(PADDR(m->pdb));
umbscan();
- ramscan(maxmem);
+ lowraminit();
+ if(e820scan() < 0)
+ ramscan(maxmem);
/*
- * Set the conf entries describing two banks of allocatable memory.
- * Grab the first and largest entries in rmapram as left by ramscan().
- *
- * It would be nice to have more than 2 memory banks describable in conf.
+ * Set the conf entries describing banks of allocatable memory.
*/
- mp = rmapram.map;
- conf.base0 = mp->addr;
- conf.npage0 = mp->size/BY2PG;
- mp++;
- for(xmp = 0; mp->size; mp++){
- if(xmp == 0 || mp->size > xmp->size)
- xmp = mp;
+ for(i=0; i<nelem(mapram) && i<nelem(conf.mem); i++){
+ mp = &rmapram.map[i];
+ cm = &conf.mem[i];
+ cm->base = mp->addr;
+ cm->npage = mp->size/BY2PG;
}
+
+ lost = 0;
+ for(; i<nelem(mapram); i++)
+ lost += rmapram.map[i].size;
+ if(lost)
+ print("meminit - lost %lud bytes\n", lost);
- if(xmp){
- conf.base1 = xmp->addr;
- conf.npage1 = xmp->size/BY2PG;
- }
if(MEMDEBUG)
memdebug();
}
+ /*
+ * Allocate memory from the upper memory blocks.
+ */
ulong
umbmalloc(ulong addr, int size, int align)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:536,576 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:807,828
mapfree(&rmapumbrw, PADDR(addr), size);
}
+ /*
+ * Give out otherwise-unused physical address space
+ * for use in configuring devices. Note that unlike upamalloc
+ * before it, upaalloc does not map the physical address
+ * into virtual memory. Call vmap to do that.
+ */
ulong
- upamalloc(ulong pa, int size, int align)
+ upaalloc(int size, int align)
{
- ulong a, ae;
+ ulong a;
- if(a = mapalloc(&xrmapupa, pa, size, align))
- return a;
-
- if((a = mapalloc(&rmapupa, pa, size, align)) == 0){
- memdebug();
- return 0;
+ a = mapalloc(&rmapupa, 0, size, align);
+ if(a == 0){
+ print("out of physical address space allocating %d\n", size);
+ mapprint(&rmapupa);
}
-
- /*
- * Upamalloc is a request to map a range of physical addresses.
- * Therefore, if pa is 0 mapalloc will choose the base address.
- * Note, however, mmukmap is always asked to give a 1-to-1 mapping
- * of va to pa.
- ae = mmukmap(a, a, size);
- * ...but for the moment go back to the old scheme for VLB cards.
- */
- ae = mmukmap(a, 0, size);
-
- /*
- * Should check here that it was all delivered
- * and put it back and barf if not.
- */
- USED(ae);
-
- /*
- * Be very careful this returns a PHYSICAL address
- * mapped 1-to-1 with the virtual address.
- * If a < KZERO it's probably not a good idea to
- * try KADDR(a)...
- */
return a;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/memory.c:577,582 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/memory.c:829,858
void
upafree(ulong pa, int size)
{
- mapfree(&xrmapupa, pa, size);
+ mapfree(&rmapupa, pa, size);
+ }
+
+ void
+ upareserve(ulong pa, int size)
+ {
+ ulong a;
+
+ a = mapalloc(&rmapupa, pa, size, 0);
+ if(a != pa){
+ /*
+ * This can happen when we're using the E820
+ * map, which might have already reserved some
+ * of the regions claimed by the pci devices.
+ */
+ // print("upareserve: cannot reserve pa=%#.8lux size=%d\n", pa, size);
+ if(a != 0)
+ mapfree(&rmapupa, a, size);
+ }
+ }
+
+ void
+ memorysummary(void)
+ {
+ memdebug();
}
[rsc] --rw-rw-r-- M 451989 glenda sys 19739 Nov 6 20:17 sys/src/9/pc/mmu.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:1,3 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:1,37
+ /*
+ * Memory mappings. Life was easier when 2G of memory was enough.
+ *
+ * The kernel memory starts at KZERO, with the text loaded at KZERO+1M
+ * (9load sits under 1M during the load). The memory from KZERO to the
+ * top of memory is mapped 1-1 with physical memory, starting at physical
+ * address 0. All kernel memory and data structures (i.e., the entries stored
+ * into conf.mem) must sit in this physical range: if KZERO is at 0xF0000000,
+ * then the kernel can only have 256MB of memory for itself.
+ *
+ * The 256M below KZERO comprises three parts. The lowest 4M is the
+ * virtual page table, a virtual address representation of the current
+ * page table tree. The second 4M is used for temporary per-process
+ * mappings managed by kmap and kunmap. The remaining 248M is used
+ * for global (shared by all procs and all processors) device memory
+ * mappings and managed by vmap and vunmap. The total amount (256M)
+ * could probably be reduced somewhat if desired. The largest device
+ * mapping is that of the video card, and even though modern video cards
+ * have embarrassing amounts of memory, the video drivers only use one
+ * frame buffer worth (at most 16M). Each is described in more detail below.
+ *
+ * The VPT is a 4M frame constructed by inserting the pdb into itself.
+ * This short-circuits one level of the page tables, with the result that
+ * the contents of second-level page tables can be accessed at VPT.
+ * We use the VPT to edit the page tables (see mmu) after inserting them
+ * into the page directory. It is a convenient mechanism for mapping what
+ * might be otherwise-inaccessible pages. The idea was borrowed from
+ * the Exokernel.
+ *
+ * The VPT doesn't solve all our problems, because we still need to
+ * prepare page directories before we can install them. For that, we
+ * use tmpmap/tmpunmap, which map a single page at TMPADDR.
+ */
+
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:5,12 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:39,50
#include "fns.h"
#include "io.h"
+ /*
+ * Simple segment descriptors with no translation.
+ */
#define DATASEGM(p) { 0xFFFF, SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(p)|SEGDATA|SEGW }
#define EXECSEGM(p) { 0xFFFF, SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(p)|SEGEXEC|SEGR }
+ #define EXEC16SEGM(p) { 0xFFFF, SEGG|(0xF<<16)|SEGP|SEGPL(p)|SEGEXEC|SEGR }
#define TSSSEGM(b,p) { ((b)<<16)|sizeof(Tss),\
((b)&0xFF000000)|(((b)>>16)&0xFF)|SEGTSS|SEGPL(p)|SEGP }
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:18,80 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:56,76
[UDSEG] DATASEGM(3), /* user data/stack */
[UESEG] EXECSEGM(3), /* user code */
[TSSSEG] TSSSEGM(0,0), /* tss segment */
+ [KESEG16] EXEC16SEGM(0), /* kernel code 16-bit */
};
- static void
- taskswitch(ulong pdb, ulong stack)
- {
- Tss *tss;
+ static int didmmuinit;
+ static void taskswitch(ulong, ulong);
+ static void memglobal(void);
- tss = m->tss;
- tss->ss0 = KDSEL;
- tss->esp0 = stack;
- tss->ss1 = KDSEL;
- tss->esp1 = stack;
- tss->ss2 = KDSEL;
- tss->esp2 = stack;
- tss->cr3 = pdb;
- putcr3(pdb);
- }
+ #define vpt ((ulong*)VPT)
+ #define VPTX(va) (((ulong)(va))>>12)
+ #define vpd (vpt+VPTX(VPT))
- /*
- * On processors that support it, we set the PTEGLOBAL bit in
- * page table and page directory entries that map kernel memory.
- * Doing this tells the processor not to bother flushing them
- * from the TLB when doing the TLB flush associated with a
- * context switch (write to CR3). Since kernel memory mappings
- * are never removed, this is safe. (If we ever remove kernel memory
- * mappings, we can do a full flush by turning off the PGE bit in CR4,
- * writing to CR3, and then turning the PGE bit back on.)
- *
- * See also mmukmap below.
- *
- * Processor support for the PTEGLOBAL bit is enabled in devarch.c.
- */
- static void
- memglobal(void)
+ void
+ mmuinit0(void)
{
- int i, j;
- ulong *pde, *pte;
-
- /* only need to do this once, on bootstrap processor */
- if(m->machno != 0)
- return;
-
- if(!m->havepge)
- return;
-
- pde = m->pdb;
- for(i=512; i<1024; i++){ /* 512: start at entry for virtual 0x80000000 */
- if(pde[i] & PTEVALID){
- pde[i] |= PTEGLOBAL;
- if(!(pde[i] & PTESIZE)){
- pte = KADDR(pde[i]&~(BY2PG-1));
- for(j=0; j<1024; j++)
- if(pte[j] & PTEVALID)
- pte[j] |= PTEGLOBAL;
- }
- }
- }
+ memmove(m->gdt, gdt, sizeof gdt);
}
void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:83,90 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:79,92
ulong x, *p;
ushort ptr[3];
- memglobal();
+ didmmuinit = 1;
+ if(0) print("vpt=%#.8ux vpd=%#.8lux kmap=%#.8ux\n",
+ VPT, (ulong)vpd, KMAP);
+
+ memglobal();
+ m->pdb[PDX(VPT)] = PADDR(m->pdb)|PTEWRITE|PTEVALID;
+
m->tss = malloc(sizeof(Tss));
memset(m->tss, 0, sizeof(Tss));
m->tss->iomap = 0xDFFF<<16;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:98,104 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:100,105
* than Intels in this regard). Under VMware it pays off
* a factor of about 10 to 100.
*/
-
memmove(m->gdt, gdt, sizeof gdt);
x = (ulong)m->tss;
m->gdt[TSSSEG].d0 = (x<<16)|sizeof(Tss);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:128,133 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:129,180
ltr(TSSSEL);
}
+ /*
+ * On processors that support it, we set the PTEGLOBAL bit in
+ * page table and page directory entries that map kernel memory.
+ * Doing this tells the processor not to bother flushing them
+ * from the TLB when doing the TLB flush associated with a
+ * context switch (write to CR3). Since kernel memory mappings
+ * are never removed, this is safe. (If we ever remove kernel memory
+ * mappings, we can do a full flush by turning off the PGE bit in CR4,
+ * writing to CR3, and then turning the PGE bit back on.)
+ *
+ * See also mmukmap below.
+ *
+ * Processor support for the PTEGLOBAL bit is enabled in devarch.c.
+ */
+ static void
+ memglobal(void)
+ {
+ int i, j;
+ ulong *pde, *pte;
+
+ /* only need to do this once, on bootstrap processor */
+ if(m->machno != 0)
+ return;
+
+ if(!m->havepge)
+ return;
+
+ pde = m->pdb;
+ for(i=PDX(KZERO); i<1024; i++){
+ if(pde[i] & PTEVALID){
+ pde[i] |= PTEGLOBAL;
+ if(!(pde[i] & PTESIZE)){
+ pte = KADDR(pde[i]&~(BY2PG-1));
+ for(j=0; j<1024; j++)
+ if(pte[j] & PTEVALID)
+ pte[j] |= PTEGLOBAL;
+ }
+ }
+ }
+ }
+
+ /*
+ * Flush all the user-space and device-mapping mmu info
+ * for this process, because something has been deleted.
+ * It will be paged back in on demand.
+ */
void
flushmmu(void)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:139,163 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:186,293
splx(s);
}
+ /*
+ * Flush a single page mapping from the tlb.
+ */
+ void
+ flushpg(ulong va)
+ {
+ if(X86FAMILY(m->cpuidax) >= 4)
+ invlpg(va);
+ else
+ putcr3(m->tss->cr3);
+ }
+
+ /*
+ * Allocate a new page for a page directory.
+ * We keep a small cache of pre-initialized
+ * page directories in each mach.
+ */
+ static Page*
+ mmupdballoc(void)
+ {
+ int s;
+ Page *page;
+ ulong *pdb;
+
+ s = splhi();
+ if(m->pdbpool == 0){
+ spllo();
+ page = newpage(0, 0, 0);
+ page->va = (ulong)vpd;
+ splhi();
+ pdb = tmpmap(page);
+ memmove(pdb, m->pdb, BY2PG);
+ pdb[PDX(VPT)] = page->pa|PTEWRITE|PTEVALID; /* set up VPT */
+ tmpunmap(pdb);
+ }else{
+ page = m->pdbpool;
+ m->pdbpool = page->next;
+ m->pdbcnt--;
+ }
+ splx(s);
+ return page;
+ }
+
static void
+ mmupdbfree(Proc *proc, Page *p)
+ {
+ if(islo())
+ panic("mmupdbfree: islo");
+ if(m->pdbcnt >= 10){
+ p->next = proc->mmufree;
+ proc->mmufree = p;
+ }else{
+ p->next = m->pdbpool;
+ m->pdbpool = p;
+ }
+ }
+
+ /*
+ * A user-space memory segment has been deleted, or the
+ * process is exiting. Clear all the pde entries for user-space
+ * memory mappings and device mappings. Any entries that
+ * are needed will be paged back in as necessary.
+ */
+ static void
mmuptefree(Proc* proc)
{
+ int s;
ulong *pdb;
Page **last, *page;
- if(proc->mmupdb && proc->mmuused){
- pdb = (ulong*)proc->mmupdb->va;
- last = &proc->mmuused;
- for(page = *last; page; page = page->next){
- pdb[page->daddr] = 0;
- last = &page->next;
- }
- *last = proc->mmufree;
- proc->mmufree = proc->mmuused;
- proc->mmuused = 0;
+ if(proc->mmupdb == nil || proc->mmuused == nil)
+ return;
+ s = splhi();
+ pdb = tmpmap(proc->mmupdb);
+ last = &proc->mmuused;
+ for(page = *last; page; page = page->next){
+ pdb[page->daddr] = 0;
+ last = &page->next;
}
+ tmpunmap(pdb);
+ splx(s);
+ *last = proc->mmufree;
+ proc->mmufree = proc->mmuused;
+ proc->mmuused = 0;
}
+ static void
+ taskswitch(ulong pdb, ulong stack)
+ {
+ Tss *tss;
+
+ tss = m->tss;
+ tss->ss0 = KDSEL;
+ tss->esp0 = stack;
+ tss->ss1 = KDSEL;
+ tss->esp1 = stack;
+ tss->ss2 = KDSEL;
+ tss->esp2 = stack;
+ tss->cr3 = pdb;
+ putcr3(pdb);
+ }
+
void
mmuswitch(Proc* proc)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:169,215 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:299,335
}
if(proc->mmupdb){
- pdb = (ulong*)proc->mmupdb->va;
+ pdb = tmpmap(proc->mmupdb);
pdb[PDX(MACHADDR)] = m->pdb[PDX(MACHADDR)];
+ tmpunmap(pdb);
taskswitch(proc->mmupdb->pa, (ulong)(proc->kstack+KSTACK));
- }
- else
+ }else
taskswitch(PADDR(m->pdb), (ulong)(proc->kstack+KSTACK));
}
+ /*
+ * Release any pages allocated for a page directory base or page-tables
+ * for this process:
+ * switch to the prototype pdb for this processor (m->pdb);
+ * call mmuptefree() to place all pages used for page-tables (proc->mmuused)
+ * onto the process' free list (proc->mmufree). This has the side-effect of
+ * cleaning any user entries in the pdb (proc->mmupdb);
+ * if there's a pdb put it in the cache of pre-initialised pdb's
+ * for this processor (m->pdbpool) or on the process' free list;
+ * finally, place any pages freed back into the free pool (palloc).
+ * This routine is only called from sched() with palloc locked.
+ */
void
mmurelease(Proc* proc)
{
Page *page, *next;
- /*
- * Release any pages allocated for a page directory base or page-tables
- * for this process:
- * switch to the prototype pdb for this processor (m->pdb);
- * call mmuptefree() to place all pages used for page-tables (proc->mmuused)
- * onto the process' free list (proc->mmufree). This has the side-effect of
- * cleaning any user entries in the pdb (proc->mmupdb);
- * if there's a pdb put it in the cache of pre-initialised pdb's
- * for this processor (m->pdbpool) or on the process' free list;
- * finally, place any pages freed back into the free pool (palloc).
- * This routine is only called from sched() with palloc locked.
- */
taskswitch(PADDR(m->pdb), (ulong)m + BY2PG);
- mmuptefree(proc);
-
if(proc->mmupdb){
- if(m->pdbcnt > 10){
- proc->mmupdb->next = proc->mmufree;
- proc->mmufree = proc->mmupdb;
- }
- else{
- proc->mmupdb->next = m->pdbpool;
- m->pdbpool = proc->mmupdb;
- m->pdbcnt++;
- }
+ mmuptefree(proc);
+ mmupdbfree(proc, proc->mmupdb);
proc->mmupdb = 0;
}
-
for(page = proc->mmufree; page; page = next){
next = page->next;
if(--page->ref)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:221,323 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:341,430
proc->mmufree = 0;
}
- static Page*
- mmupdballoc(void)
+ /*
+ * Allocate and install pdb for the current process.
+ */
+ static void
+ upallocpdb(void)
{
int s;
+ ulong *pdb;
Page *page;
-
+
+ page = mmupdballoc();
s = splhi();
- if(m->pdbpool == 0){
- spllo();
- page = newpage(0, 0, 0);
- page->va = VA(kmap(page));
- memmove((void*)page->va, m->pdb, BY2PG);
- }
- else{
- page = m->pdbpool;
- m->pdbpool = page->next;
- m->pdbcnt--;
- }
+ pdb = tmpmap(page);
+ pdb[PDX(MACHADDR)] = m->pdb[PDX(MACHADDR)];
+ tmpunmap(pdb);
+ up->mmupdb = page;
+ mmuflushtlb(up->mmupdb->pa);
splx(s);
- return page;
}
-
- void
- checkmmu(ulong va, ulong pa)
- {
- ulong *pdb, *pte;
- int pdbx;
- if(up->mmupdb == 0)
- return;
-
- pdb = (ulong*)up->mmupdb->va;
- pdbx = PDX(va);
- if(PPN(pdb[pdbx]) == 0){
- /* okay to be empty - will fault and get filled */
- return;
- }
-
- pte = KADDR(PPN(pdb[pdbx]));
- if(pte[PTX(va)] == 0)
- return;
- if((pte[PTX(va)]&~4095) != pa)
- print("%ld %s: va=0x%08lux pa=0x%08lux pte=0x%08lux\n",
- up->pid, up->text,
- va, pa, pte[PTX(va)]);
- }
-
+ /*
+ * Update the mmu in response to a user fault. pa may have PTEWRITE set.
+ */
void
putmmu(ulong va, ulong pa, Page*)
{
- int pdbx;
+ int old;
Page *page;
- ulong *pdb, *pte;
- int s;
- if(up->mmupdb == 0)
- up->mmupdb = mmupdballoc();
- pdb = (ulong*)up->mmupdb->va;
- pdbx = PDX(va);
+ if(up->mmupdb == nil)
+ upallocpdb();
- if(PPN(pdb[pdbx]) == 0){
- if(up->mmufree == 0){
- page = newpage(1, 0, 0);
- page->va = VA(kmap(page));
- }
- else {
+ if(!(vpd[PDX(va)]&PTEVALID)){
+ if(up->mmufree == 0)
+ page = newpage(0, 0, 0);
+ else{
page = up->mmufree;
up->mmufree = page->next;
- memset((void*)page->va, 0, BY2PG);
}
- pdb[pdbx] = PPN(page->pa)|PTEUSER|PTEWRITE|PTEVALID;
- page->daddr = pdbx;
+ vpd[PDX(va)] = PPN(page->pa)|PTEUSER|PTEWRITE|PTEVALID;
+ /* page is now mapped into the VPT - clear it */
+ memset((void*)(VPT+PDX(va)*BY2PG), 0, BY2PG);
+ page->daddr = PDX(va);
page->next = up->mmuused;
up->mmuused = page;
}
+ old = vpt[VPTX(va)];
+ vpt[VPTX(va)] = pa|PTEUSER|PTEVALID;
+ if(old&PTEVALID)
+ flushpg(va);
+ }
- pte = KADDR(PPN(pdb[pdbx]));
- pte[PTX(va)] = pa|PTEUSER;
-
- s = splhi();
- pdb[PDX(MACHADDR)] = m->pdb[PDX(MACHADDR)];
- mmuflushtlb(up->mmupdb->pa);
- splx(s);
+ /*
+ * Double-check the user MMU.
+ * Error checking only.
+ */
+ void
+ checkmmu(ulong va, ulong pa)
+ {
+ if(up->mmupdb == 0)
+ return;
+ if(!(vpd[PDX(va)]&PTEVALID) || !(vpt[VPTX(va)]&PTEVALID))
+ return;
+ if(PPN(vpt[VPTX(va)]) != pa)
+ print("%ld %s: va=0x%08lux pa=0x%08lux pte=0x%08lux\n",
+ up->pid, up->text,
+ va, pa, vpt[VPTX(va)]);
}
+ /*
+ * Walk the page-table pointed to by pdb and return a pointer
+ * to the entry for virtual address va at the requested level.
+ * If the entry is invalid and create isn't requested then bail
+ * out early. Otherwise, for the 2nd level walk, allocate a new
+ * page-table page and register it in the 1st level. This is used
+ * only to edit kernel mappings, which use pages from kernel memory,
+ * so it's okay to use KADDR to look at the tables.
+ */
ulong*
mmuwalk(ulong* pdb, ulong va, int level, int create)
{
- ulong pa, *table;
+ ulong *table;
+ void *map;
- /*
- * Walk the page-table pointed to by pdb and return a pointer
- * to the entry for virtual address va at the requested level.
- * If the entry is invalid and create isn't requested then bail
- * out early. Otherwise, for the 2nd level walk, allocate a new
- * page-table page and register it in the 1st level.
- */
table = &pdb[PDX(va)];
if(!(*table & PTEVALID) && create == 0)
return 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mmu.c:334,496 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mmu.c:441,870
if(*table & PTESIZE)
panic("mmuwalk2: va %luX entry %luX\n", va, *table);
if(!(*table & PTEVALID)){
- pa = PADDR(xspanalloc(BY2PG, BY2PG, 0));
- *table = pa|PTEWRITE|PTEVALID;
+ /*
+ * Have to call low-level allocator from
+ * memory.c if we haven't set up the xalloc
+ * tables yet.
+ */
+ if(didmmuinit)
+ map = xspanalloc(BY2PG, BY2PG, 0);
+ else
+ map = rampage();
+ if(map == nil)
+ panic("mmuwalk xspanalloc failed");
+ *table = PADDR(map)|PTEWRITE|PTEVALID;
}
table = KADDR(PPN(*table));
-
return &table[PTX(va)];
}
}
- static Lock mmukmaplock;
+ /*
+ * Device mappings are shared by all procs and processors and
+ * live in the virtual range VMAP to VMAP+VMAPSIZE. The master
+ * copy of the mappings is stored in mach0->pdb, and they are
+ * paged in from there as necessary by vmapsync during faults.
+ */
- int
- mmukmapsync(ulong va)
- {
- Mach *mach0;
- ulong entry, *pte;
+ static Lock vmaplock;
- mach0 = MACHP(0);
+ static int findhole(ulong *a, int n, int count);
+ static ulong vmapalloc(ulong size);
+ static void pdbunmap(ulong*, ulong, int);
- ilock(&mmukmaplock);
+ /*
+ * Add a device mapping to the vmap range.
+ */
+ void*
+ vmap(ulong pa, int size)
+ {
+ int osize;
+ ulong o, va;
+
+ /*
+ * might be asking for less than a page.
+ */
+ osize = size;
+ o = pa & (BY2PG-1);
+ pa -= o;
+ size += o;
- if((pte = mmuwalk(mach0->pdb, va, 1, 0)) == nil){
- iunlock(&mmukmaplock);
- return 0;
+ size = ROUND(size, BY2PG);
+ if(pa == 0){
+ print("vmap pa=0 pc=%#.8lux\n", getcallerpc(&pa));
+ return nil;
}
- if(!(*pte & PTESIZE) && mmuwalk(mach0->pdb, va, 2, 0) == nil){
- iunlock(&mmukmaplock);
+ ilock(&vmaplock);
+ if((va = vmapalloc(size)) == 0
+ || pdbmap(MACHP(0)->pdb, pa|PTEUNCACHED|PTEWRITE, va, size) < 0){
+ iunlock(&vmaplock);
return 0;
}
- entry = *pte;
+ iunlock(&vmaplock);
+ /* avoid trap on local processor
+ for(i=0; i<size; i+=4*MB)
+ vmapsync(va+i);
+ */
+ USED(osize);
+ // print(" vmap %#.8lux %d => %#.8lux\n", pa+o, osize, va+o);
+ return (void*)(va + o);
+ }
- if(!(m->pdb[PDX(va)] & PTEVALID))
- m->pdb[PDX(va)] = entry;
+ static int
+ findhole(ulong *a, int n, int count)
+ {
+ int have, i;
+
+ have = 0;
+ for(i=0; i<n; i++){
+ if(a[i] == 0)
+ have++;
+ else
+ have = 0;
+ if(have >= count)
+ return i+1 - have;
+ }
+ return -1;
+ }
- if(up && up->mmupdb){
- ((ulong*)up->mmupdb->va)[PDX(va)] = entry;
- mmuflushtlb(up->mmupdb->pa);
+ /*
+ * Look for free space in the vmap.
+ */
+ static ulong
+ vmapalloc(ulong size)
+ {
+ int i, n, o;
+ ulong *vpdb;
+ int vpdbsize;
+
+ vpdb = &MACHP(0)->pdb[PDX(VMAP)];
+ vpdbsize = VMAPSIZE/(4*MB);
+
+ if(size >= 4*MB){
+ n = (size+4*MB-1) / (4*MB);
+ if((o = findhole(vpdb, vpdbsize, n)) != -1)
+ return VMAP + o*4*MB;
+ return VMAP + o;
}
- else
- mmuflushtlb(PADDR(m->pdb));
+ n = (size+BY2PG-1) / BY2PG;
+ for(i=0; i<vpdbsize; i++)
+ if((vpdb[i]&PTEVALID) && !(vpdb[i]&PTESIZE))
+ if((o = findhole(KADDR(PPN(vpdb[i])), WD2PG, n)) != -1)
+ return VMAP + i*4*MB + o*BY2PG;
+ if((o = findhole(vpdb, vpdbsize, 1)) != -1)
+ return VMAP + o*4*MB;
+
+ /*
+ * could span page directory entries, but not worth the trouble.
+ * not going to be very much contention.
+ */
+ return 0;
+ }
- iunlock(&mmukmaplock);
+ /*
+ * Remove a device mapping from the vmap range.
+ * Since pdbunmap does not remove page tables, just entries,
+ * the call need not be interlocked with vmap.
+ */
+ void
+ vunmap(void *v, int size)
+ {
+ int i;
+ ulong va, o;
+ Mach *nm;
+ Proc *p;
+
+ /*
+ * might not be aligned
+ */
+ va = (ulong)v;
+ o = va&(BY2PG-1);
+ va -= o;
+ size += o;
+ size = ROUND(size, BY2PG);
+
+ if(size < 0 || va < VMAP || va+size > VMAP+VMAPSIZE)
+ panic("vunmap va=%#.8lux size=%#x pc=%#.8lux\n",
+ va, size, getcallerpc(&va));
- return 1;
+ pdbunmap(MACHP(0)->pdb, va, size);
+
+ /*
+ * Flush mapping from all the tlbs and copied pdbs.
+ * This can be (and is) slow, since it is called only rarely.
+ */
+ for(i=0; i<conf.nproc; i++){
+ p = proctab(i);
+ if(p->state == Dead)
+ continue;
+ if(p != up)
+ p->newtlb = 1;
+ }
+ for(i=0; i<conf.nmach; i++){
+ nm = MACHP(i);
+ if(nm != m)
+ nm->flushmmu = 1;
+ }
+ flushmmu();
+ for(i=0; i<conf.nmach; i++){
+ nm = MACHP(i);
+ if(nm != m)
+ while((active.machs&(1<<nm->machno)) && nm->flushmmu)
+ ;
+ }
}
- ulong
- mmukmap(ulong pa, ulong va, int size)
+ /*
+ * Add kernel mappings for pa -> va for a section of size bytes.
+ */
+ int
+ pdbmap(ulong *pdb, ulong pa, ulong va, int size)
{
- Mach *mach0;
- ulong ova, pae, *table, pgsz, *pte, x;
- int pse, sync;
+ int pse;
+ ulong pae, pgsz, *pte, *table;
+ ulong flag;
+
+ flag = pa&0xFFF;
+ pa &= ~0xFFF;
- mach0 = MACHP(0);
- if((mach0->cpuiddx & 0x08) && (getcr4() & 0x10))
+ if((MACHP(0)->cpuiddx & 0x08) && (getcr4() & 0x10))
pse = 1;
else
pse = 0;
- sync = 0;
- pa = PPN(pa);
- if(va == 0)
- va = (ulong)KADDR(pa);
- else
- va = PPN(va);
- ova = va;
-
pae = pa + size;
- ilock(&mmukmaplock);
while(pa < pae){
- table = &mach0->pdb[PDX(va)];
- /*
- * Possibly already mapped.
- */
- if(*table & PTEVALID){
- if(*table & PTESIZE){
- /*
- * Big page. Does it fit within?
- * If it does, adjust pgsz so the correct end can be
- * returned and get out.
- * If not, adjust pgsz up to the next 4MB boundary
- * and continue.
- */
- x = PPN(*table);
- if(x != pa)
- panic("mmukmap1: pa %luX entry %luX\n",
- pa, *table);
- x += 4*MB;
- if(pae <= x){
- pa = pae;
- break;
- }
- pgsz = x - pa;
- pa += pgsz;
- va += pgsz;
+ table = &pdb[PDX(va)];
+ if((*table&PTEVALID) && (*table&PTESIZE))
+ panic("vmap: va=%#.8lux pa=%#.8lux pde=%#.8lux",
+ va, pa, *table);
- continue;
- }
- else{
- /*
- * Little page. Walk to the entry.
- * If the entry is valid, set pgsz and continue.
- * If not, make it so, set pgsz, sync and continue.
- */
- pte = mmuwalk(mach0->pdb, va, 2, 0);
- if(pte && *pte & PTEVALID){
- x = PPN(*pte);
- if(x != pa)
- panic("mmukmap2: pa %luX entry %luX\n",
- pa, *pte);
- pgsz = BY2PG;
- pa += pgsz;
- va += pgsz;
- sync++;
-
- continue;
- }
- }
- }
-
/*
- * Not mapped. Check if it can be mapped using a big page -
- * starts on a 4MB boundary, size >= 4MB and processor can do it.
- * If not a big page, walk the walk, talk the talk.
- * Sync is set.
- *
- * If we're creating a kernel mapping, we know that it will never
- * expire and thus we can set the PTEGLOBAL bit to make the entry
- * persist in the TLB across flushes. If we do add support later for
- * unmapping kernel addresses, see devarch.c for instructions on
- * how to do a full TLB flush.
+ * Check if it can be mapped using a 4MB page:
+ * va, pa aligned and size >= 4MB and processor can do it.
*/
- if(pse && (pa % (4*MB)) == 0 && (pae >= pa+4*MB)){
- *table = pa|PTESIZE|PTEWRITE|PTEUNCACHED|PTEVALID;
- if((va&KZERO) && m->havepge)
- *table |= PTEGLOBAL;
+ if(pse && pa%(4*MB) == 0 && va%(4*MB) == 0 && (pae >= pa+4*MB)){
+ *table = pa|PTESIZE|flag|PTEVALID;
pgsz = 4*MB;
- }
- else{
- pte = mmuwalk(mach0->pdb, va, 2, 1);
- *pte = pa|PTEWRITE|PTEUNCACHED|PTEVALID;
- if((va&KZERO) && m->havepge)
- *pte |= PTEGLOBAL;
+ }else{
+ pte = mmuwalk(pdb, va, 2, 1);
+ if(*pte&PTEVALID)
+ panic("vmap: va=%#.8lux pa=%#.8lux pte=%#.8lux",
+ va, pa, *pte);
+ *pte = pa|flag|PTEVALID;
pgsz = BY2PG;
}
pa += pgsz;
va += pgsz;
- sync++;
}
- iunlock(&mmukmaplock);
+ return 0;
+ }
+ /*
+ * Remove mappings. Must already exist, for sanity.
+ * Only used for kernel mappings, so okay to use KADDR.
+ */
+ static void
+ pdbunmap(ulong *pdb, ulong va, int size)
+ {
+ ulong vae;
+ ulong *table;
+
+ vae = va+size;
+ while(va < vae){
+ table = &pdb[PDX(va)];
+ if(!(*table & PTEVALID)){
+ panic("vunmap: not mapped");
+ /*
+ va = (va+4*MB-1) & ~(4*MB-1);
+ continue;
+ */
+ }
+ if(*table & PTESIZE){
+ *table = 0;
+ va = (va+4*MB-1) & ~(4*MB-1);
+ continue;
+ }
+ table = KADDR(PPN(*table));
+ if(!(table[PTX(va)] & PTEVALID))
+ panic("vunmap: not mapped");
+ table[PTX(va)] = 0;
+ va += BY2PG;
+ }
+ }
+
+ /*
+ * Handle a fault by bringing vmap up to date.
+ * Only copy pdb entries and they never go away,
+ * so no locking needed.
+ */
+ int
+ vmapsync(ulong va)
+ {
+ ulong entry, *table;
+
+ if(va < VMAP || va >= VMAP+VMAPSIZE)
+ return 0;
+
+ entry = MACHP(0)->pdb[PDX(va)];
+ if(!(entry&PTEVALID))
+ return 0;
+ if(!(entry&PTESIZE)){
+ /* make sure entry will help the fault */
+ table = KADDR(PPN(entry));
+ if(!(table[PTX(va)]&PTEVALID))
+ return 0;
+ }
+ vpd[PDX(va)] = entry;
/*
- * If something was added
- * then need to sync up.
+ * TLB doesn't cache negative results, so no flush needed.
*/
- if(sync)
- mmukmapsync(ova);
+ return 1;
+ }
- return pa;
+
+ /*
+ * KMap is used to map individual pages into virtual memory.
+ * It is rare to have more than a few KMaps at a time (in the
+ * absence of interrupts, only two at a time are ever used,
+ * but interrupts can stack). The mappings are local to a process,
+ * so we can use the same range of virtual address space for
+ * all processes without any coordination.
+ */
+ #define kpt (vpt+VPTX(KMAP))
+ #define NKPT (KMAPSIZE/BY2PG)
+
+ KMap*
+ kmap(Page *page)
+ {
+ int i, o, s;
+ Page *pdb;
+
+ if(up == nil)
+ panic("kmap: up=0 pc=%#.8lux", getcallerpc(&page));
+ if(up->mmupdb == nil)
+ upallocpdb();
+ if(!(vpd[PDX(KMAP)]&PTEVALID)){
+ /* allocate page directory */
+ if(KMAPSIZE > BY2XPG)
+ panic("bad kmapsize");
+ s = spllo();
+ pdb = newpage(0, 0, 0);
+ splx(s);
+ vpd[PDX(KMAP)] = pdb->pa|PTEWRITE|PTEVALID;
+ memset(kpt, 0, BY2PG);
+
+ /* might as well finish the job */
+ kpt[0] = page->pa|PTEWRITE|PTEVALID;
+ up->lastkmap = 0;
+ return (KMap*)KMAP;
+ }
+ o = up->lastkmap+1;
+ for(i=0; i<NKPT; i++){
+ if(kpt[(i+o)%NKPT] == 0){
+ o = (i+o)%NKPT;
+ kpt[o] = page->pa|PTEWRITE|PTEVALID;
+ up->lastkmap = o;
+ return (KMap*)(KMAP+o*BY2PG);
+ }
+ }
+ panic("out of kmap");
+ return nil;
+ }
+
+ void
+ kunmap(KMap *k)
+ {
+ ulong va;
+
+ va = (ulong)k;
+ if(up->mmupdb == nil || !(vpd[PDX(KMAP)]&PTEVALID))
+ panic("kunmap: no kmaps");
+ if(va < KMAP || va >= KMAP+KMAPSIZE)
+ panic("kunmap: bad address %#.8lux pc=%#.8lux", va, getcallerpc(&k));
+ if(!(vpt[VPTX(va)]&PTEVALID))
+ panic("kunmap: not mapped %#.8lux pc=%#.8lux", va, getcallerpc(&k));
+ vpt[VPTX(va)] = 0;
+ flushpg(va);
+ }
+
+
+ /*
+ * Temporary one-page mapping used to edit page directories.
+ *
+ * The fasttmp #define controls whether the code optimizes
+ * the case where the page is already mapped in the physical
+ * memory window.
+ */
+ #define fasttmp 1
+
+ void*
+ tmpmap(Page *p)
+ {
+ ulong i;
+ ulong *entry;
+
+ if(islo())
+ panic("tmpaddr: islo");
+
+ if(fasttmp && p->pa < -KZERO)
+ return KADDR(p->pa);
+
+ /*
+ * PDX(TMPADDR) == PDX(MACHADDR), so this
+ * entry is private to the processor and shared
+ * between up->mmupdb (if any) and m->pdb.
+ */
+ entry = &vpt[VPTX(TMPADDR)];
+ if(!(*entry&PTEVALID)){
+ for(i=KZERO; i<=CPU0MACH; i+=BY2PG)
+ print("%.8lux: *%.8lux=%.8lux (vpt=%.8lux index=%.8lux)\n", i, &vpt[VPTX(i)], vpt[VPTX(i)], vpt, VPTX(i));
+ panic("tmpmap: no entry");
+ }
+ if(PPN(*entry) != PPN(TMPADDR-KZERO))
+ panic("tmpmap: already mapped entry=%#.8lux", *entry);
+ *entry = p->pa|PTEWRITE|PTEVALID;
+ flushpg(TMPADDR);
+ return (void*)TMPADDR;
+ }
+
+ void
+ tmpunmap(void *v)
+ {
+ ulong *entry;
+
+ if(islo())
+ panic("tmpaddr: islo");
+ if(fasttmp && (ulong)v >= KZERO && v != (void*)TMPADDR)
+ return;
+ if(v != (void*)TMPADDR)
+ panic("tmpunmap: bad address");
+ entry = &vpt[VPTX(TMPADDR)];
+ if(!(*entry&PTEVALID) || PPN(*entry) == PPN(PADDR(TMPADDR)))
+ panic("tmpmap: not mapped entry=%#.8lux", *entry);
+ *entry = PPN(TMPADDR-KZERO)|PTEWRITE|PTEVALID;
+ flushpg(TMPADDR);
+ }
+
+ /*
+ * These could go back to being macros once the kernel is debugged,
+ * but the extra checking is nice to have.
+ */
+ void*
+ kaddr(ulong pa)
+ {
+ if(pa > (ulong)-KZERO)
+ panic("kaddr: pa=%#.8lux", pa);
+ return (void*)(pa+KZERO);
+ }
+
+ ulong
+ paddr(void *v)
+ {
+ ulong va;
+
+ va = (ulong)v;
+ if(va < KZERO)
+ panic("paddr: va=%#.8lux", va);
+ return va-KZERO;
}
[rsc] --rw-rw-r-- M 451989 glenda sys 17157 Nov 6 20:17 sys/src/9/pc/mp.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mp.c:137,142 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mp.c:137,143
mkioapic(PCMPioapic* p)
{
Apic *apic;
+ void *va;
if(!(p->flags & PcmpEN) || p->apicno > MaxAPICNO)
return 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mp.c:144,156 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mp.c:145,157
/*
* Map the I/O APIC.
*/
- if(mmukmap(p->addr, 0, 1024) == 0)
+ if((va = vmap(p->addr, 1024)) == 0)
return 0;
apic = &mpapic[p->apicno];
apic->type = PcmpIOAPIC;
apic->apicno = p->apicno;
- apic->addr = KADDR(p->addr);
+ apic->addr = va;
apic->flags = p->flags;
return apic;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mp.c:440,445 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mp.c:441,449
*p++ = PADDR(APBOOTSTRAP);
*p++ = PADDR(APBOOTSTRAP)>>8;
i = (PADDR(APBOOTSTRAP) & ~0xFFFF)/16;
+ /* code assumes i==0 */
+ if(i != 0)
+ print("mp: bad APBOOTSTRAP\n");
*p++ = i;
*p = i>>8;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mp.c:465,470 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mp.c:469,475
PCMP *pcmp;
uchar *e, *p;
Apic *apic, *bpapic;
+ void *va;
i8259init();
syncclock();
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mp.c:476,482 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mp.c:481,487
/*
* Map the local APIC.
*/
- if(mmukmap(pcmp->lapicbase, 0, 1024) == 0)
+ if((va = vmap(pcmp->lapicbase, 1024)) == nil)
return;
bpapic = nil;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mp.c:508,514 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mp.c:513,519
* guarantee that the bootstrap processor appears
* first in the table before the others.
*/
- apic->addr = KADDR(pcmp->lapicbase);
+ apic->addr = va;
if(apic->flags & PcmpBP)
bpapic = apic;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mp.c:766,772 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mp.c:771,777
if(vno != -1)
return vno;
}
-
+ print("mpintrenable: out of choices %d %d\n", mpeisabus, mpisabus);
return -1;
}
[rsc] --rw-rw-r-- M 451989 glenda sys 6638 Nov 6 10:21 sys/src/9/pc/mp.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mp.h:217,222 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mp.h:217,224
extern int lapicisr(int);
extern int lapiceoi(int);
extern void lapicicrw(int, int);
+ extern void lapicintron(void);
+ extern void lapicintroff(void);
extern void mpinit(void);
extern void mpshutdown(void);
[rsc] --rw-rw-r-- M 451989 glenda sys 1427 Nov 6 10:21 sys/src/9/pc/pc
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pc:38,43 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pc:38,44
link
devpccard
devi82365
+ realmode
ether2000 ether8390
ether2114x pci
ether589 etherelnk3
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pc:93,98 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pc:94,100
vgat2r4 +cur
vgatvp3020 =cur
vgatvp3026 =cur
+ vgavesa
vgavmware +cur
ip
[rsc] --rw-rw-r-- M 451989 glenda sys 714 Nov 6 10:21 sys/src/9/pc/pcauth
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcauth:37,42 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcauth:37,43
loopbackmedium
misc
+ realmode
sdata pci sdscsi
uarti8250
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcauth:43,49 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcauth:44,50
uartpci
vgamach64xx +cur
- vgas3 +cur vgasavage
+ vgas3 +cur vgasavage
ip
il
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcauth:65,68 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcauth:66,71
bootpcauth.out boot
/386/bin/ip/ipconfig
/386/bin/auth/factotum
+ /386/bin/fossil/fossil
+ /386/bin/venti/venti
/386/bin/disk/kfs
[rsc] --rw-rw-r-- M 451989 glenda sys 866 Nov 6 10:21 sys/src/9/pc/pccpu
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pccpu:28,33 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pccpu:28,34
usb
link
+ realmode
ether2000 ether8390
ether2114x pci
ether79c970 pci
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pccpu:53,58 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pccpu:54,60
sdata pci sdscsi
sd53c8xx pci sdscsi
+ sdmv50xx pci sdscsi
ip
[rsc] --rw-rw-r-- M 451989 glenda sys 1446 Nov 6 12:59 sys/src/9/pc/pcdisk
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcdisk:60,65 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcdisk:60,66
usbuhci
misc
+ realmode
archmp mp apic
sdata pci sdscsi
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcdisk:89,94 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcdisk:90,96
vgat2r4 +cur
vgatvp3020 =cur
vgatvp3026 =cur
+ vgavesa
vgavmware +cur
ip
[rsc] --rw-rw-r-- M 451989 presotto sys 1504 Nov 6 12:59 sys/src/9/pc/pcf
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcf:62,67 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcf:62,68
usbuhci
misc
+ realmode
archmp mp apic
sdata pci sdscsi
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcf:91,96 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcf:92,98
vgat2r4 +cur
vgatvp3020 =cur
vgatvp3026 =cur
+ vgavesa
vgavmware +cur
ip
[rsc] --rw-rw-r-- M 451989 glenda sys 26817 Nov 6 10:21 sys/src/9/pc/pci.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pci.c:759,764 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pci.c:759,766
}
}
+ static void pcireservemem(void);
+
static void
pcicfginit(void)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pci.c:898,907 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pci.c:900,926
pcirouting();
out:
+ pcireservemem();
unlock(&pcicfginitlock);
if(getconf("*pcihinv"))
pcihinv(nil);
+ }
+
+ static void
+ pcireservemem(void)
+ {
+ int i;
+ Pcidev *p;
+
+ /*
+ * mark all the physical address space claimed by pci devices
+ * as in use, so that upaalloc doesn't give it out.
+ */
+ for(p=pciroot; p; p=p->list)
+ for(i=0; i<nelem(p->mem); i++)
+ if(p->mem[i].bar && (p->mem[i].bar&1) == 0)
+ upareserve(p->mem[i].bar&~0x0F, p->mem[i].size);
}
static int
[rsc] --rw-rw-r-- M 451989 glenda sys 13460 Nov 6 10:21 sys/src/9/pc/screen.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:38,48 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:38,51
},
};
+ int didswcursorinit;
+
int
screensize(int x, int y, int z, ulong chan)
{
VGAscr *scr;
+ lock(&vgascreenlock);
memimageinit();
scr = &vgascreen[0];
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:50,56 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:53,59
* BUG: need to check if any xalloc'ed memory needs to
* be given back if aperture is set.
*/
- if(scr->aperture == 0){
+ if(scr->paddr == 0){
int width = (x*z)/BI2WD;
gscreendata.bdata = xalloc(width*BY2WD*y);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:58,76 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:61,83
error("screensize: vga soft memory");
/* memset(gscreendata.bdata, 0x72, width*BY2WD*y); /* not really black */
scr->useflush = 1;
- scr->aperture = VGAMEM();
+ scr->paddr = VGAMEM();
+ scr->vaddr = KADDR(scr->paddr);
scr->apsize = 1<<16;
}
else
- gscreendata.bdata = KADDR(scr->aperture);
+ gscreendata.bdata = scr->vaddr;
if(gscreen)
freememimage(gscreen);
+ scr->gscreen = nil;
gscreen = allocmemimaged(Rect(0,0,x,y), chan, &gscreendata);
vgaimageinit(chan);
- if(gscreen == nil)
+ if(gscreen == nil){
+ unlock(&vgascreenlock);
return -1;
+ }
if(scr->dev && scr->dev->flush)
scr->useflush = 1;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:81,87 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:88,97
scr->gscreen = gscreen;
physgscreenr = gscreen->r;
+ unlock(&vgascreenlock);
+ if(didswcursorinit)
+ swcursorinit();
drawcmap();
return 0;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:90,121 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:100,130
screenaperture(int size, int align)
{
VGAscr *scr;
- ulong aperture;
scr = &vgascreen[0];
- if(size == 0){
- if(scr->aperture && scr->isupamem)
- upafree(scr->aperture, scr->apsize);
- scr->aperture = 0;
- scr->isupamem = 0;
+ if(scr->paddr) /* set up during enable */
return 0;
- }
- if(scr->dev && scr->dev->linear){
- aperture = scr->dev->linear(scr, &size, &align);
- if(aperture == 0)
- return 1;
- }else{
- aperture = upamalloc(0, size, align);
- if(aperture == 0)
- return 1;
- if(scr->aperture && scr->isupamem)
- upafree(scr->aperture, scr->apsize);
- scr->isupamem = 1;
+ if(size == 0)
+ return 0;
+
+ if(scr->dev && scr->dev->linear){
+ scr->dev->linear(scr, size, align);
+ return 0;
}
- scr->aperture = aperture;
+ /*
+ * Need to allocate some physical address space.
+ * The driver will tell the card to use it.
+ */
+ size = PGROUND(size);
+ scr->paddr = upaalloc(size, align);
+ if(scr->paddr == 0)
+ return -1;
+ scr->vaddr = vmap(scr->paddr, size);
+ if(scr->vaddr == nil)
+ return -1;
scr->apsize = size;
return 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:179,185 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:188,194
off = r.min.y*scr->gscreen->width*BY2WD+(r.min.x*scr->gscreen->depth)/8;
page = off/scr->apsize;
off %= scr->apsize;
- disp = KADDR(scr->aperture);
+ disp = scr->vaddr;
sdisp = disp+off;
edisp = disp+scr->apsize;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:339,355 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:348,376
hwdraw(Memdrawparam *par)
{
VGAscr *scr;
- Memimage *dst, *src;
+ Memimage *dst, *src, *mask;
int m;
if(hwaccel == 0)
return 0;
- dst = par->dst;
scr = &vgascreen[0];
- if(dst == nil || dst->data == nil)
+ if((dst=par->dst) == nil || dst->data == nil)
return 0;
+ if((src=par->src) == nil || src->data == nil)
+ return 0;
+ if((mask=par->mask) == nil || mask->data == nil)
+ return 0;
+ if(scr->cur == &swcursor){
+ if(dst->data->bdata == gscreendata.bdata)
+ swcursoravoid(par->r);
+ if(src->data->bdata == gscreendata.bdata)
+ swcursoravoid(par->sr);
+ if(mask->data->bdata == gscreendata.bdata)
+ swcursoravoid(par->mr);
+ }
+
if(dst->data->bdata != gscreendata.bdata)
return 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:374,380 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:395,400
* the source is not replicated, memmove suffices.
*/
m = Simplemask|Fullmask;
- src = par->src;
if(scr->scroll
&& src->data->bdata==dst->data->bdata
&& !(src->flags&Falpha)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.c:398,400 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.c:418,711
vgablank(scr, blank);
}
}
+
+ void
+ vgalinearpciid(VGAscr *scr, int vid, int did)
+ {
+ Pcidev *p;
+
+ p = nil;
+ while((p = pcimatch(p, vid, 0)) != nil){
+ if(p->ccrb != 3) /* video card */
+ continue;
+ if(did != 0 && p->did != did)
+ continue;
+ break;
+ }
+ if(p == nil)
+ error("pci video card not found");
+
+ scr->pci = p;
+ vgalinearpci(scr);
+ }
+
+ void
+ vgalinearpci(VGAscr *scr)
+ {
+ ulong paddr;
+ int i, size, best;
+ Pcidev *p;
+
+ p = scr->pci;
+ if(p == nil)
+ return;
+
+ /*
+ * Scan for largest memory region on card.
+ * Some S3 cards (e.g. Savage) have enormous
+ * mmio regions (but even larger frame buffers).
+ */
+ best = -1;
+ for(i=0; i<nelem(p->mem); i++){
+ if(p->mem[i].bar&1) /* not memory */
+ continue;
+ if(p->mem[i].size < 640*480) /* not big enough */
+ continue;
+ if(best==-1 || p->mem[i].size > p->mem[best].size)
+ best = i;
+ }
+ if(best >= 0){
+ paddr = p->mem[best].bar & ~0x0F;
+ size = p->mem[best].size;
+ vgalinearaddr(scr, paddr, size);
+ return;
+ }
+ error("no video memory found on pci card");
+ }
+
+ void
+ vgalinearaddr(VGAscr *scr, ulong paddr, int size)
+ {
+ int x, nsize;
+ ulong npaddr;
+
+ /*
+ * new approach. instead of trying to resize this
+ * later, let's assume that we can just allocate the
+ * entire window to start with.
+ */
+
+ if(scr->paddr == paddr && size <= scr->apsize)
+ return;
+
+ if(scr->paddr){
+ /*
+ * could call vunmap and vmap,
+ * but worried about dangling pointers in devdraw
+ */
+ error("cannot grow vga frame buffer");
+ }
+
+ /* round to page boundary, just in case */
+ x = paddr&(BY2PG-1);
+ npaddr = paddr-x;
+ nsize = PGROUND(size+x);
+
+ scr->vaddr = vmap(npaddr, nsize);
+ if(scr->vaddr == 0)
+ error("cannot allocate vga frame buffer");
+ scr->vaddr = (char*)scr->vaddr+x;
+ scr->paddr = paddr;
+ scr->apsize = nsize;
+ }
+
+
+ /*
+ * Software cursor.
+ */
+ int swvisible; /* is the cursor visible? */
+ int swenabled; /* is the cursor supposed to be on the screen? */
+ Memimage* swback; /* screen under cursor */
+ Memimage* swimg; /* cursor image */
+ Memimage* swmask; /* cursor mask */
+ Memimage* swimg1;
+ Memimage* swmask1;
+
+ Point swoffset;
+ Rectangle swrect; /* screen rectangle in swback */
+ Point swpt; /* desired cursor location */
+ Point swvispt; /* actual cursor location */
+ int swvers; /* incremented each time cursor image changes */
+ int swvisvers; /* the version on the screen */
+
+ /*
+ * called with drawlock locked for us, most of the time.
+ * kernel prints at inopportune times might mean we don't
+ * hold the lock, but memimagedraw is now reentrant so
+ * that should be okay: worst case we get cursor droppings.
+ */
+ void
+ swcursorhide(void)
+ {
+ if(swvisible == 0)
+ return;
+ if(swback == nil)
+ return;
+ swvisible = 0;
+ memimagedraw(gscreen, swrect, swback, ZP, memopaque, ZP, S);
+ }
+
+ void
+ swcursoravoid(Rectangle r)
+ {
+ if(swvisible && rectXrect(r, swrect))
+ swcursorhide();
+ }
+
+ void
+ swcursordraw(void)
+ {
+ if(swvisible)
+ return;
+ if(swenabled == 0)
+ return;
+ if(swback == nil || swimg1 == nil || swmask1 == nil)
+ return;
+ assert(!canqlock(&drawlock));
+ swvispt = swpt;
+ swvisvers = swvers;
+ swrect = rectaddpt(Rect(0,0,16,16), swvispt);
+ memimagedraw(swback, swback->r, gscreen, swpt, memopaque, ZP, S);
+ memimagedraw(gscreen, swrect, swimg1, ZP, swmask1, ZP, SoverD);
+ swvisible = 1;
+ }
+
+ /*
+ * Need to lock drawlock for ourselves.
+ */
+ void
+ swenable(VGAscr*)
+ {
+ swenabled = 1;
+ if(canqlock(&drawlock)){
+ swcursordraw();
+ qunlock(&drawlock);
+ }
+ }
+
+ void
+ swdisable(VGAscr*)
+ {
+ swenabled = 0;
+ if(canqlock(&drawlock)){
+ swcursorhide();
+ qunlock(&drawlock);
+ }
+ }
+
+ void
+ swload(VGAscr*, Cursor *curs)
+ {
+ uchar *ip, *mp;
+ int i, j, set, clr;
+
+ if(!swimg || !swmask || !swimg1 || !swmask1)
+ return;
+ /*
+ * Build cursor image and mask.
+ * Image is just the usual cursor image
+ * but mask is a transparent alpha mask.
+ *
+ * The 16x16x8 memimages do not have
+ * padding at the end of their scan lines.
+ */
+ ip = byteaddr(swimg, ZP);
+ mp = byteaddr(swmask, ZP);
+ for(i=0; i<32; i++){
+ set = curs->set[i];
+ clr = curs->clr[i];
+ for(j=0x80; j; j>>=1){
+ *ip++ = set&j ? 0x00 : 0xFF;
+ *mp++ = (clr|set)&j ? 0xFF : 0x00;
+ }
+ }
+ swoffset = curs->offset;
+ swvers++;
+ memimagedraw(swimg1, swimg1->r, swimg, ZP, memopaque, ZP, S);
+ memimagedraw(swmask1, swmask1->r, swmask, ZP, memopaque, ZP, S);
+ }
+
+ int
+ swmove(VGAscr*, Point p)
+ {
+ swpt = addpt(p, swoffset);
+ return 0;
+ }
+
+ void
+ swcursorclock(void)
+ {
+ int x;
+
+ if(!swenabled)
+ return;
+ if(swvisible && eqpt(swpt, swvispt) && swvers==swvisvers)
+ return;
+
+ x = splhi();
+ if(swenabled)
+ if(!swvisible || !eqpt(swpt, swvispt) || swvers!=swvisvers)
+ if(canqlock(&drawlock)){
+ swcursorhide();
+ swcursordraw();
+ qunlock(&drawlock);
+ }
+ splx(x);
+ }
+
+ void
+ swcursorinit(void)
+ {
+ static int init, warned;
+ VGAscr *scr;
+
+ didswcursorinit = 1;
+ if(!init){
+ init = 1;
+ addclock0link(swcursorclock, 50);
+ }
+ scr = &vgascreen[0];
+ if(scr==nil || scr->gscreen==nil)
+ return;
+
+ if(scr->dev == nil || scr->dev->linear == nil){
+ if(!warned){
+ print("cannot use software cursor on non-linear vga screen\n");
+ warned = 1;
+ }
+ return;
+ }
+
+ if(swback){
+ freememimage(swback);
+ freememimage(swmask);
+ freememimage(swmask1);
+ freememimage(swimg);
+ freememimage(swimg1);
+ }
+
+ swback = allocmemimage(Rect(0,0,32,32), gscreen->chan);
+ swmask = allocmemimage(Rect(0,0,16,16), GREY8);
+ swmask1 = allocmemimage(Rect(0,0,16,16), GREY1);
+ swimg = allocmemimage(Rect(0,0,16,16), GREY8);
+ swimg1 = allocmemimage(Rect(0,0,16,16), GREY1);
+ if(swback==nil || swmask==nil || swmask1==nil || swimg==nil || swimg1 == nil){
+ print("software cursor: allocmemimage: %r");
+ return;
+ }
+
+ memfillcolor(swmask, DOpaque);
+ memfillcolor(swmask1, DOpaque);
+ memfillcolor(swimg, DBlack);
+ memfillcolor(swimg1, DBlack);
+ }
+
+ VGAcur swcursor =
+ {
+ "soft",
+ swenable,
+ swdisable,
+ swload,
+ swmove,
+ };
+
[rsc] --rw-rw-r-- M 451989 glenda sys 4156 Nov 6 10:21 sys/src/9/pc/screen.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.h:67,73 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.h:67,73
void (*enable)(VGAscr*);
void (*disable)(VGAscr*);
void (*page)(VGAscr*, int);
- ulong (*linear)(VGAscr*, int*, int*);
+ void (*linear)(VGAscr*, int, int);
void (*drawinit)(VGAscr*);
int (*fill)(VGAscr*, Rectangle, ulong);
void (*ovlctl)(VGAscr*, Chan*, void*, int);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.h:91,96 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.h:91,97
struct VGAscr {
Lock devlock;
VGAdev* dev;
+ Pcidev* pci;
VGAcur* cur;
ulong storage;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.h:98,113 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.h:99,114
int useflush;
- ulong aperture; /* physical address */
- int isupamem;
- int apsize;
+ ulong paddr; /* frame buffer */
+ void* vaddr;
+ int apsize;
ulong io; /* device specific registers */
-
+ ulong *mmio;
+
ulong colormap[Pcolours][3];
int palettedepth;
- ulong *mmio;
Memimage* gscreen;
Memdata* gscreendata;
Memsubfont* memdefont;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.h:128,133 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.h:129,135
/* mouse.c */
extern void mousectl(Cmdbuf*);
+ extern void mouseresize(void);
/* screen.c */
extern int hwaccel; /* use hw acceleration; default on */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/screen.h:144,161 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/screen.h:146,179
extern Rectangle physgscreenr; /* actual monitor size */
extern void blankscreen(int);
+ extern VGAcur swcursor;
+ extern void swcursorinit(void);
+ extern void swcursorhide(void);
+ extern void swcursoravoid(Rectangle);
+ extern void swcursorunhide(void);
+
/* devdraw.c */
extern void deletescreenimage(void);
+ extern void resetscreenimage(void);
extern int drawhasclients(void);
extern ulong blanktime;
extern void setscreenimageclipr(Rectangle);
extern void drawflush(void);
extern int drawidletime(void);
+ extern QLock drawlock;
/* vga.c */
extern void vgascreenwin(VGAscr*);
extern void vgaimageinit(ulong);
- extern ulong vgapcilinear(VGAscr*, int*, int*, int, int);
+ extern void vgalinearpciid(VGAscr*, int, int);
+ extern void vgalinearpci(VGAscr*);
+ extern void vgalinearaddr(VGAscr*, ulong, int);
extern void drawblankscreen(int);
extern void vgablank(VGAscr*, int);
+
+ extern Lock vgascreenlock;
+
+
+
+
[rsc] --rw-rw-r-- M 451989 glenda sys 55206 Nov 6 10:22 sys/src/9/pc/sd53c8xx.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:52,59 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:52,60
#else
- #define KPRINT if(0) print
- #define IPRINT if(0) print
+ static int idebug = 1;
+ #define KPRINT if(0) iprint
+ #define IPRINT if(idebug) iprint
#define DEBUG(n) (0)
#define IFLUSH()
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:304,310 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:305,310
struct {
Lock;
uchar head[4]; /* head of free list (NCR byte order) */
- Dsa *tail;
Dsa *freechain;
} dsalist;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:383,388 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:383,417
#include "sd53c8xx.i"
+ /*
+ * We used to use a linked list of Dsas with nil as the terminator,
+ * but occasionally the 896 card seems not to notice that the 0
+ * is really a 0, and then it tries to reference the Dsa at address 0.
+ * To address this, we use a sentinel dsa that links back to itself
+ * and has state A_STATE_END. If the card takes an iteration or
+ * two to notice that the state says A_STATE_END, that's no big
+ * deal. Clearly this isn't the right approach, but I'm just
+ * stumped. Even with this, we occasionally get prints about
+ * "WSR set", usually with about the same frequency that the
+ * card used to walk past 0.
+ */
+ static Dsa *dsaend;
+
+ static Dsa*
+ dsaallocnew(Controller *c)
+ {
+ Dsa *d;
+
+ /* c->dsalist must be ilocked */
+ d = xalloc(sizeof *d);
+ lesetl(d->next, legetl(c->dsalist.head));
+ lesetl(&d->stateb, A_STATE_FREE);
+ coherence();
+ lesetl(c->dsalist.head, DMASEG(d));
+ coherence();
+ return d;
+ }
+
static Dsa *
dsaalloc(Controller *c, int target, int lun)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:389,414 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:418,433
Dsa *d;
ilock(&c->dsalist);
- if ((d = c->dsalist.freechain) == 0) {
- d = xalloc(sizeof(*d));
- if (DEBUG(1)) {
- KPRINT(PRINTPREFIX "%d/%d: allocated new dsa %lux\n", target, lun, (ulong)d);
- }
- lesetl(d->next, 0);
- lesetl(&d->stateb, A_STATE_ALLOCATED);
- if (legetl(c->dsalist.head) == 0)
- lesetl(c->dsalist.head, DMASEG(d)); /* ATOMIC?!? */
- else
- lesetl(c->dsalist.tail->next, DMASEG(d)); /* ATOMIC?!? */
- c->dsalist.tail = d;
+ if ((d = c->dsalist.freechain) != 0) {
+ if (DEBUG(1))
+ IPRINT(PRINTPREFIX "%d/%d: reused dsa %lux\n", target, lun, (ulong)d);
+ } else {
+ d = dsaallocnew(c);
+ if (DEBUG(1))
+ IPRINT(PRINTPREFIX "%d/%d: allocated dsa %lux\n", target, lun, (ulong)d);
}
- else {
- if (DEBUG(1)) {
- KPRINT(PRINTPREFIX "%d/%d: reused dsa %lux\n", target, lun, (ulong)d);
- }
- c->dsalist.freechain = d->freechain;
- lesetl(&d->stateb, A_STATE_ALLOCATED);
- }
+ c->dsalist.freechain = d->freechain;
+ lesetl(&d->stateb, A_STATE_ALLOCATED);
iunlock(&c->dsalist);
d->target = target;
d->lun = lun;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:425,435 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:444,493
iunlock(&c->dsalist);
}
+ static void
+ dsadump(Controller *c)
+ {
+ Dsa *d;
+ u32int *a;
+
+ iprint("dsa controller list: c=%p head=%.8lux\n", c, legetl(c->dsalist.head));
+ for(d=KPTR(legetl(c->dsalist.head)); d != dsaend; d=KPTR(legetl(d->next))){
+ if(d == (void*)-1){
+ iprint("\t dsa %p\n", d);
+ break;
+ }
+ a = (u32int*)d;
+ iprint("\tdsa %p %.8ux %.8ux %.8ux %.8ux %.8ux %.8ux\n", a, a[0], a[1], a[2], a[3], a[4], a[5]);
+ }
+
+ /*
+ a = KPTR(c->scriptpa+E_dsa_addr);
+ iprint("dsa_addr: %.8ux %.8ux %.8ux %.8ux %.8ux\n",
+ a[0], a[1], a[2], a[3], a[4]);
+ a = KPTR(c->scriptpa+E_issue_addr);
+ iprint("issue_addr: %.8ux %.8ux %.8ux %.8ux %.8ux\n",
+ a[0], a[1], a[2], a[3], a[4]);
+
+ a = KPTR(c->scriptpa+E_issue_test_begin);
+ e = KPTR(c->scriptpa+E_issue_test_end);
+ iprint("issue_test code (at offset %.8ux):\n", E_issue_test_begin);
+
+ i = 0;
+ for(; a<e; a++){
+ iprint(" %.8ux", *a);
+ if(++i%8 == 0)
+ iprint("\n");
+ }
+ if(i%8)
+ iprint("\n");
+ */
+ }
+
static Dsa *
dsafind(Controller *c, uchar target, uchar lun, uchar state)
{
Dsa *d;
- for (d = KPTR(legetl(c->dsalist.head)); d; d = KPTR(legetl(d->next))) {
+ for (d = KPTR(legetl(c->dsalist.head)); d != dsaend; d = KPTR(legetl(d->next))) {
if (d->target != 0xff && d->target != target)
continue;
if (lun != 0xff && d->lun != lun)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:764,769 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:822,828
c->running = 1;
p = c->scriptpa + entry;
lesetl(c->n->dsp, p);
+ coherence();
if (c->ssm)
c->n->dcntl |= 0x4; /* start DMA in SSI mode */
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:775,780 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:834,840
panic(PRINTPREFIX "ncrcontinue called while running");
/* set the start DMA bit to continue execution */
c->running = 1;
+ coherence();
c->n->dcntl |= 0x4;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1126,1131 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1186,1192
int wakeme = 0;
int cont = -1;
Dsa *dsa;
+ ulong dsapa;
Controller *c = a;
Ncr *n = c->n;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1143,1149 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1204,1210
}
n->istat = Intf;
/* search for structures in A_STATE_DONE */
- for (d = KPTR(legetl(c->dsalist.head)); d; d = KPTR(legetl(d->next))) {
+ for (d = KPTR(legetl(c->dsalist.head)); d != dsaend; d = KPTR(legetl(d->next))) {
if (d->stateb == A_STATE_DONE) {
d->p9status = d->status;
if (DEBUG(1)) {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1168,1174 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1229,1253
sist = (n->sist1<<8)|n->sist0; /* BUG? can two-byte read be inconsistent? */
dstat = n->dstat;
- dsa = (Dsa *)DMASEG_TO_KADDR(legetl(n->dsa));
+ dsapa = legetl(n->dsa);
+
+ /*
+ * Can't compute dsa until we know that dsapa is valid.
+ */
+ if(dsapa < -KZERO)
+ dsa = (Dsa*)DMASEG_TO_KADDR(dsapa);
+ else{
+ dsa = nil;
+ /*
+ * happens at startup on some cards but we
+ * don't actually deref dsa because none of the
+ * flags we are about are set.
+ * still, print in case that changes and we're
+ * about to dereference nil.
+ */
+ iprint("sd53c8xxinterrupt: dsa=%.8lux istat=%ux sist=%ux dstat=%ux\n", dsapa, istat, sist, dstat);
+ }
+
c->running = 0;
if (istat & Sip) {
if (DEBUG(1)) {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1315,1320 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1394,1400
}
dsa->p9status = SDtimeout;
dsa->stateb = A_STATE_DONE;
+ coherence();
softreset(c);
cont = E_issue_check;
wakeme = 1;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1336,1343 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1416,1422
IPRINT("dstat = %.2x\n", dstat);
}
/*else*/ if (dstat & Ssi) {
- ulong *p = DMASEG_TO_KADDR(legetl(n->dsp));
- ulong w = (uchar *)p - (uchar *)c->script;
+ ulong w = legetl(n->dsp) - c->scriptpa;
IPRINT("[%lux]", w);
USED(w);
cont = -2; /* restart */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1375,1380 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1454,1468
dumpncrregs(c, 1);
wakeme = 1;
break;
+ case A_SIR_NOTIFY_LOAD_STATE:
+ IPRINT(PRINTPREFIX ": load_state dsa=%p\n", dsa);
+ if (dsa == (void*)KZERO || dsa == (void*)-1) {
+ dsadump(c);
+ dumpncrregs(c, 1);
+ panic("bad dsa in load_state");
+ }
+ cont = -2;
+ break;
case A_SIR_NOTIFY_MSG_IN:
IPRINT(PRINTPREFIX "%d/%d: msg_in %d\n",
dsa->target, dsa->lun, n->sfbr);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1431,1437 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1519,1525
cont = -2;
break;
case A_SIR_NOTIFY_ISSUE:
- IPRINT(PRINTPREFIX "%d/%d: issue:", dsa->target, dsa->lun);
+ IPRINT(PRINTPREFIX "%d/%d: issue dsa=%p end=%p:", dsa->target, dsa->lun, dsa, dsaend);
dsadump:
IPRINT(" tgt=%d", dsa->target);
IPRINT(" time=%ld", TK2MS(m->ticks));
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1447,1453 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1535,1541
cont = -2;
break;
case A_SIR_NOTIFY_DUMP_NEXT_CODE: {
- ulong *dsp = DMASEG_TO_KADDR(legetl(n->dsp));
+ ulong *dsp = c->script + (legetl(n->dsp)-c->scriptpa)/4;
int x;
IPRINT(PRINTPREFIX "code at %lux", dsp - c->script);
for (x = 0; x < 6; x++) {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1475,1483 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1563,1571
cont = -2;
break;
case A_error_reselected: /* dsa isn't valid here */
- print(PRINTPREFIX "reselection error\n");
+ iprint(PRINTPREFIX "reselection error\n");
dumpncrregs(c, 1);
- for (dsa = KPTR(legetl(c->dsalist.head)); dsa; dsa = KPTR(legetl(dsa->next))) {
+ for (dsa = KPTR(legetl(c->dsalist.head)); dsa != dsaend; dsa = KPTR(legetl(dsa->next))) {
IPRINT(PRINTPREFIX "dsa target %d lun %d state %d\n", dsa->target, dsa->lun, dsa->stateb);
}
break;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1489,1503 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1577,1616
}
}
/*else*/ if (dstat & Iid) {
- ulong addr = legetl(n->dsp);
- ulong dbc = (n->dbc[2]<<16)|(n->dbc[1]<<8)|n->dbc[0];
+ int i, target, lun;
+ ulong addr, dbc, *v;
+
+ addr = legetl(n->dsp);
+ if(dsa){
+ target = dsa->target;
+ lun = dsa->lun;
+ }else{
+ target = -1;
+ lun = -1;
+ }
+ dbc = (n->dbc[2]<<16)|(n->dbc[1]<<8)|n->dbc[0];
+
+ // if(dsa == nil)
+ idebug++;
IPRINT(PRINTPREFIX "%d/%d: Iid pa=%.8lux sa=%.8lux dbc=%lux\n",
- dsa->target, dsa->lun,
+ target, lun,
addr, addr - c->scriptpa, dbc);
- addr = (ulong)DMASEG_TO_KADDR(addr);
- IPRINT("%.8lux %.8lux %.8lux\n",
- *(ulong *)(addr - 12), *(ulong *)(addr - 8), *(ulong *)(addr - 4));
+ addr = (ulong)c->script + addr - c->scriptpa;
+ addr -= 64;
+ addr &= ~63;
+ v = (ulong*)addr;
+ for(i=0; i<8; i++){
+ IPRINT("%.8lux: %.8lux %.8lux %.8lux %.8lux\n",
+ addr, v[0], v[1], v[2], v[3]);
+ addr += 4*4;
+ v += 4;
+ }
USED(addr, dbc);
+ if(dsa == nil){
+ dsadump(c);
+ dumpncrregs(c, 1);
+ panic("bad dsa");
+ }
dsa->p9status = SDeio;
wakeme = 1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1634,1639 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1747,1753
if((target = r->unit->subno) == 0x07)
return r->status = SDtimeout; /* assign */
+
c = r->unit->dev->ctlr;
check = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1702,1708 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1816,1822
setmovedata(&d->msg_out_buf, DMASEG(d->msg_out), bc);
setmovedata(&d->cmd_buf, DMASEG(r->cmd), r->clen);
- calcblockdma(d, DMASEG(r->data), r->dlen);
+ calcblockdma(d, r->data ? DMASEG(r->data) : 0, r->dlen);
if (DEBUG(0)) {
KPRINT(PRINTPREFIX "%d/%d: exec: ", target, r->lun);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1722,1735 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1836,1850
d->p9status = SDnostatus;
d->parityerror = 0;
-
+ coherence();
d->stateb = A_STATE_ISSUE; /* start operation */
+ coherence();
ilock(c);
if (c->ssm)
- c->n->dcntl |= 0x10; /* SSI */
+ c->n->dcntl |= 0x10; /* single step */
if (c->running) {
- c->n->istat |= Sigp;
+ c->n->istat = Sigp;
}
else {
start(c, E_issue_check);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1802,1807 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1917,1923
* so the Dsa can be re-used.
*/
lesetl(&d->stateb, A_STATE_ALLOCATED);
+ coherence();
goto docheck;
}
qunlock(&c->q[target]);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1825,1836 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1941,1954
return r->status = status;
}
+ #define vpt ((ulong*)VPT)
+ #define VPTX(va) (((ulong)(va))>>12)
static void
cribbios(Controller *c)
{
c->bios.scntl3 = c->n->scntl3;
c->bios.stest2 = c->n->stest2;
- KPRINT(PRINTPREFIX "bios scntl3(%.2x) stest2(%.2x)\n", c->bios.scntl3, c->bios.stest2);
+ print(PRINTPREFIX "bios scntl3(%.2x) stest2(%.2x)\n", c->bios.scntl3, c->bios.stest2);
}
static int
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1879,1886 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:1997,2002
{ SYM_1011_DID, 0xff, "SYM53C1010", Burst128, 16, 64, Prefetch|LocalRAM|BigFifo|Wide|Ultra|Ultra2 },
};
- #define offsetof(s, t) ((ulong)&((s *)0)->t)
-
static int
xfunc(Controller *c, enum na_external x, unsigned long *v)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1968,1973 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:2084,2090
Controller *ctlr;
SDev *sdev, *head, *tail;
ulong regpa, *script, scriptpa;
+ void *regva, *scriptva;
if(cp = getconf("*maxsd53c8xx"))
nctlr = strtoul(cp, 0, 0);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:1995,2017 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:2112,2138
continue;
ba++;
}
- regpa = upamalloc(regpa & ~0x0F, p->mem[1].size, 0);
if(regpa == 0)
+ print("regpa 0\n");
+ regpa &= ~0xF;
+ regva = vmap(regpa, p->mem[1].size);
+ if(regva == 0)
continue;
script = nil;
scriptpa = 0;
+ scriptva = nil;
scriptma = nil;
if((v->feature & LocalRAM) && sizeof(na_script) <= 4096){
scriptpa = p->mem[ba].bar;
if((scriptpa & 0x04) && p->mem[ba+1].bar){
- upafree(regpa, p->mem[1].size);
+ vunmap(regva, p->mem[1].size);
continue;
}
- scriptpa = upamalloc(scriptpa & ~0x0F,
- p->mem[ba].size, 0);
- if(scriptpa)
- script = KADDR(scriptpa);
+ scriptpa &= ~0x0F;
+ scriptva = vmap(scriptpa, p->mem[ba].size);
+ if(scriptva)
+ script = scriptva;
}
if(scriptpa == 0){
/*
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:2020,2026 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:2141,2147
*/
scriptma = malloc(sizeof(na_script));
if(scriptma == nil){
- upafree(regpa, p->mem[1].size);
+ vunmap(regva, p->mem[1].size);
continue;
}
scriptpa = DMASEG(scriptma);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:2037,2049 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:2158,2180
free(sdev);
if(scriptma)
free(scriptma);
- else
- upafree(scriptpa, p->mem[ba].size);
- upafree(regpa, p->mem[1].size);
+ else if(scriptva)
+ vunmap(scriptva, p->mem[ba].size);
+ if(regva)
+ vunmap(regva, p->mem[1].size);
continue;
}
- ctlr->n = KADDR(regpa);
+ if(dsaend == nil)
+ dsaend = xalloc(sizeof *dsaend);
+ lesetl(&dsaend->stateb, A_STATE_END);
+ // lesetl(dsaend->next, DMASEG(dsaend));
+ coherence();
+ lesetl(ctlr->dsalist.head, DMASEG(dsaend));
+ coherence();
+ ctlr->dsalist.freechain = 0;
+
+ ctlr->n = regva;
ctlr->v = v;
ctlr->script = script;
memmove(ctlr->script, na_script, sizeof(na_script));
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:2062,2080 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:2193,2209
}
swabl(ctlr->script, ctlr->script, sizeof(na_script));
- ctlr->dsalist.freechain = 0;
- lesetl(ctlr->dsalist.head, 0);
-
ctlr->pcidev = p;
sdev->ifc = &sd53c8xxifc;
sdev->ctlr = ctlr;
+ sdev->idno = '0';
if(!(v->feature & Wide))
sdev->nunit = 8;
else
sdev->nunit = MAXTARGET;
ctlr->sdev = sdev;
-
+
if(head != nil)
tail->next = sdev;
else
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:2087,2098 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:2216,2221
return head;
}
- static SDev*
- sd53c8xxid(SDev* sdev)
- {
- return scsiid(sdev, &sd53c8xxifc);
- }
-
static int
sd53c8xxenable(SDev* sdev)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:2104,2116 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:2227,2239
pcidev = ctlr->pcidev;
pcisetbme(pcidev);
- snprint(name, sizeof(name), "%s (%s)", sdev->name, sdev->ifc->name);
- intrenable(pcidev->intl, sd53c8xxinterrupt, ctlr, pcidev->tbdf, name);
ilock(ctlr);
synctabinit(ctlr);
cribbios(ctlr);
reset(ctlr);
+ snprint(name, sizeof(name), "%s (%s)", sdev->name, sdev->ifc->name);
+ intrenable(pcidev->intl, sd53c8xxinterrupt, ctlr, pcidev->tbdf, name);
iunlock(ctlr);
return 1;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.c:2121,2127 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.c:2244,2249
sd53c8xxpnp, /* pnp */
nil, /* legacy */
- sd53c8xxid, /* id */
sd53c8xxenable, /* enable */
nil, /* disable */
[rsc] --rw-rw-r-- M 451989 glenda sys 12657 Nov 6 10:22 sys/src/9/pc/sd53c8xx.n
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:54,59 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:54,60
SIR_NOTIFY_WSR = 115
SIR_NOTIFY_LOAD_SYNC = 116
SIR_NOTIFY_RESELECTED_ON_SELECT = 117
+ SIR_NOTIFY_LOAD_STATE = 118
STATE_FREE = 0
STATE_ALLOCATED = 1
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:60,65 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:61,67
STATE_ISSUE = 2
STATE_DISCONNECTED = 3
STATE_DONE = 4
+ STATE_END = 5
RESULT_OK = 0
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:76,82 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:78,84
BSIZE = 512
//BSIZE=4096
- idle:
+ // idle:
jump wait_for_reselection
start:
call load_sync
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:84,90 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:86,92
// int SIR_NOTIFY_ISSUE
clear target
select atn from scsi_id_buf, reselected_on_select // do I need to clear ATN here?
- jump start1, when msg_in
+ jump start1, when msg_in // why is this here?
start1:
// move 14 to ctest0
move from msg_out_buf, when msg_out
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:320,334 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:322,327
move memory 4, dsa_head, dsa
find_dsa_loop:
// move 7 to ctest0
- move dsa0 to sfbr
- jump find_dsa_1, if not 0
- move dsa1 to sfbr
- jump find_dsa_1, if not 0
- move dsa2 to sfbr
- jump find_dsa_1, if not 0
- move dsa3 to sfbr
- int error_reselected, if 0 // couldn't match dsa (panic)
- find_dsa_1:
// move 8 to ctest0
// load state from DSA into dsa_copy
call load_state
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:335,340 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:328,334
move memory 4, state, scratcha // get dsastate in scratcha
move scratcha0 to sfbr // and state variable in sfbr
jump find_dsa_next, if not STATE_DISCONNECTED // wrong state
+ int error_reselected, if STATE_END
move ssid & ssid_mask to sfbr // get target ID
move memory 1, targ, find_dsa_smc1 // forge target comparison instruction
find_dsa_smc1:
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:350,355 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:344,350
// id_out terminated early
// most likely the message wasn't recognised
// clear ATN and accept the message in
+ // called from sd53c8xx.c directly
id_out_mismatch_recover:
clear atn
jump msg_in_phase, when msg_in
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:374,379 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:369,375
jump status_phase, if status
jump msg_in_phase, if msg_in
int error_unexpected_phase
+
post_data_to_decisions:
jump status_phase, when status
jump msg_in_phase, if msg_in
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:398,403 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:394,423
dsa_save_len = dsa_save_end - dsa_copy
load_state:
+ // int SIR_NOTIFY_LOAD_STATE
+ jump load_state_okay
+
+ move dsa0 to sfbr
+ jump load_state_okay, if not 0
+ move dsa1 to sfbr
+ jump load_state_okay, if not 0
+ move dsa2 to sfbr
+ jump load_state_okay, if not 0
+ move dsa3 to sfbr
+ jump load_state_okay, if not 0
+ // dsa is 0
+ move memory 4, dsa, dmaaddr
+ move memory 4, dsa, targ
+ move memory 4, dsa, lun
+ move memory 4, dsa, sync
+ move memory 4, dsa, next
+ move memory 4, dsa, scratcha
+ move STATE_END to sfbr
+ move sfbr to scratcha0
+ move memory 4, scratcha, state
+ return
+
+ load_state_okay:
// load state from DSA into dsa_copy
// move 9 to ctest0
move memory 4, dsa, load_state_smc0 + 4
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:419,443 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:439,454
// move 1 to ctest0
move memory 4, dsa_head, dsa
issue_check_loop:
- // move 2 to ctest0
- move dsa0 to sfbr
- jump issue_check_1, if not 0
- move dsa1 to sfbr
- jump issue_check_1, if not 0
- move dsa2 to sfbr
- jump issue_check_1, if not 0
- move dsa3 to sfbr
- jump wait_for_reselection, if 0 // nothing to do
- issue_check_1:
- // move 3 to ctest0
call load_state
move memory 4, state, scratcha // get dsastate in scratcha
move scratcha0 to sfbr // and state variable in sfbr
jump start, if STATE_ISSUE // right state
- issue_check_next:
- // move 4 to ctest0
+ jump wait_for_reselection, if STATE_END
+ // move 4 to ctest0
move memory 4, next, dsa // find next
jump issue_check_loop
+
+
load_sync:
move memory 4, sync, scratcha // load the sync stuff
move scratcha0 to sfbr // assuming load_state has been called
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sd53c8xx.n:444,448 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sd53c8xx.n:455,459
move sfbr to scntl3
move scratcha1 to sfbr
move sfbr to sxfer
- // int SIR_NOTIFY_LOAD_SYNC
+ // int SIR_NOTIFY_LOAD_SYNC
return
[rsc] --rw-rw-r-- M 451989 glenda sys 52168 Nov 6 10:22 sys/src/9/pc/sdata.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:9,14 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:9,17
#include "../port/sd.h"
+ #define HOWMANY(x, y) (((x)+((y)-1))/(y))
+ #define ROUNDUP(x, y) (HOWMANY((x), (y))*(y))
+
extern SDifc sdataifc;
enum {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:254,267 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:257,271
typedef struct Ctlr Ctlr;
typedef struct Drive Drive;
- typedef struct Prd {
+ typedef struct Prd { /* Physical Region Descriptor */
ulong pa; /* Physical Base Address */
int count;
} Prd;
enum {
- PRDmaxio = 32*1024, /* must be power of 2 <= 64*1024 */
- Nprd = SDmaxio/PRDmaxio+2,
+ BMspan = 64*1024, /* must be power of 2 <= 64*1024 */
+
+ Nprd = SDmaxio/BMspan+2,
};
typedef struct Ctlr {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:270,275 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:274,281
int irq;
int tbdf;
int bmiba; /* bus master interface base address */
+ int maxio; /* sector count transfer maximum */
+ int span; /* don't span this boundary with dma */
Pcidev* pcidev;
void (*ienable)(Ctlr*);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:734,740 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:740,747
SDev *sdev;
Drive *drive;
int dev, error, rhi, rlo;
-
+ static int nonlegacy = 'C';
+
if(ioalloc(cmdport, 8, 0, "atacmd") < 0) {
print("ataprobe: Cannot allocate %X\n", cmdport);
return nil;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:877,883 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:884,903
ctlr->irq = irq;
ctlr->tbdf = BUSUNKNOWN;
ctlr->command = Cedd; /* debugging */
-
+
+ switch(cmdport){
+ default:
+ sdev->idno = nonlegacy;
+ break;
+ case 0x1F0:
+ sdev->idno = 'C';
+ nonlegacy = 'E';
+ break;
+ case 0x170:
+ sdev->idno = 'D';
+ nonlegacy = 'E';
+ break;
+ }
sdev->ifc = &sdataifc;
sdev->ctlr = ctlr;
sdev->nunit = 2;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:921,932 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:941,966
static SDev*
ataprobew(DevConf *cf)
{
+ char *p;
+ ISAConf isa;
+
if (cf->nports != 2)
error(Ebadarg);
+ memset(&isa, 0, sizeof isa);
+ isa.port = cf->ports[0].port;
+ isa.irq = cf->intnum;
+ if((p=strchr(cf->type, '/')) == nil || pcmspecial(p+1, &isa) < 0)
+ error("cannot find controller");
+
return ataprobe(cf->ports[0].port, cf->ports[1].port, cf->intnum);
}
+ /*
+ * These are duplicated with sdsetsense, etc., in devsd.c, but
+ * those assume that the disk is not SCSI while in fact here
+ * ata drives are not SCSI but ATAPI ones kind of are.
+ */
static int
atasetsense(Drive* drive, int status, int key, int asc, int ascq)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:938,943 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:972,1004
}
static int
+ atamodesense(Drive* drive, uchar* cmd)
+ {
+ int len;
+
+ /*
+ * Fake a vendor-specific request with page code 0,
+ * return the drive info.
+ */
+ if((cmd[2] & 0x3F) != 0 && (cmd[2] & 0x3F) != 0x3F)
+ return atasetsense(drive, SDcheck, 0x05, 0x24, 0);
+ len = (cmd[7]<<8)|cmd[8];
+ if(len == 0)
+ return SDok;
+ if(len < 8+sizeof(drive->info))
+ return atasetsense(drive, SDcheck, 0x05, 0x1A, 0);
+ if(drive->data == nil || drive->dlen < len)
+ return atasetsense(drive, SDcheck, 0x05, 0x20, 1);
+ memset(drive->data, 0, 8);
+ drive->data[0] = sizeof(drive->info)>>8;
+ drive->data[1] = sizeof(drive->info);
+ memmove(drive->data+8, drive->info, sizeof(drive->info));
+ drive->data += 8+sizeof(drive->info);
+
+ return SDok;
+ }
+
+ static int
atastandby(Drive* drive, int period)
{
Ctlr* ctlr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:959,965 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1020,1026
while(waserror())
;
- tsleep(ctlr, atadone, ctlr, 30*1000);
+ tsleep(ctlr, atadone, ctlr, 60*1000);
poperror();
done = ctlr->done;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:970,1002 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1031,1036
return SDok;
}
- static int
- atamodesense(Drive* drive, uchar* cmd)
- {
- int len;
-
- /*
- * Fake a vendor-specific request with page code 0,
- * return the drive info.
- */
- if((cmd[2] & 0x3F) != 0 && (cmd[2] & 0x3F) != 0x3F)
- return atasetsense(drive, SDcheck, 0x05, 0x24, 0);
- len = (cmd[7]<<8)|cmd[8];
- if(len == 0)
- return SDok;
- if(len < 8+sizeof(drive->info))
- return atasetsense(drive, SDcheck, 0x05, 0x1A, 0);
- if(drive->data == nil || drive->dlen < len)
- return atasetsense(drive, SDcheck, 0x05, 0x20, 1);
- memset(drive->data, 0, 8);
- drive->data[0] = sizeof(drive->info)>>8;
- drive->data[1] = sizeof(drive->info);
- memmove(drive->data+8, drive->info, sizeof(drive->info));
- drive->data += 8+sizeof(drive->info);
-
- return SDok;
- }
-
static void
atanop(Drive* drive, int subcommand)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1055,1072 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1089,1106
Prd *prd;
ulong pa;
Ctlr *ctlr;
- int bmiba, bmisx, count;
+ int bmiba, bmisx, count, i, span;
+ ctlr = drive->ctlr;
pa = PCIWADDR(drive->data);
if(pa & 0x03)
return -1;
- ctlr = drive->ctlr;
- prd = ctlr->prdt;
/*
* Sometimes drives identify themselves as being DMA capable
* although they are not on a busmastering controller.
*/
+ prd = ctlr->prdt;
if(prd == nil){
drive->dmactl = 0;
print("disabling dma: not on a busmastering controller\n");
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1073,1083 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1107,1120
return -1;
}
- for(;;){
+ for(i = 0; len && i < Nprd; i++){
prd->pa = pa;
- count = PRDmaxio - (pa & (PRDmaxio-1));
+ span = ROUNDUP(pa, ctlr->span);
+ if(span == pa)
+ span += ctlr->span;
+ count = span - pa;
if(count >= len){
- prd->count = PrdEOT|(len & (PRDmaxio-1));
+ prd->count = PrdEOT|len;
break;
}
prd->count = count;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1085,1090 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1122,1129
pa += count;
prd++;
}
+ if(i == Nprd)
+ (prd-1)->count |= PrdEOT;
bmiba = ctlr->bmiba;
outl(bmiba+Bmidtpx, PCIWADDR(ctlr->prdt));
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1271,1277 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1310,1316
break;
ilock(ctlr);
atadmainterrupt(drive, 0);
- if(!drive->error && timeo > 10){
+ if(!drive->error && timeo > 20){
ataabort(drive, 0);
atadmastop(ctlr);
drive->dmactl = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1389,1395 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1428,1435
case Cws:
case Cwsm:
microdelay(1);
- as = ataready(cmdport, ctlport, 0, Bsy, Drq|Err, 1000);
+ /* 10*1000 for flash ide drives - maybe detect them? */
+ as = ataready(cmdport, ctlport, 0, Bsy, Drq|Err, 10*1000);
if(as < 0 || (as & Err)){
iunlock(ctlr);
return -1;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1430,1437 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1470,1477
{
uchar *p;
Ctlr *ctlr;
- int count, max;
vlong lba, len;
+ int count, maxio;
/*
* Map SCSI commands into ATA commands for discs.
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1522,1528 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1562,1568
*p++ = len>>16;
*p++ = len>>8;
*p = len;
- drive->data += 8;
+ drive->data += 12;
return SDok;
case 0x28: /* read */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1541,1550 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1581,1595
if(drive->dlen < count*drive->secsize)
count = drive->dlen/drive->secsize;
qlock(ctlr);
+ if(ctlr->maxio)
+ maxio = ctlr->maxio;
+ else if(drive->flags & Lba48)
+ maxio = 65536;
+ else
+ maxio = 256;
while(count){
- max = (drive->flags&Lba48) ? 65536 : 256;
- if(count > max)
- drive->count = max;
+ if(count > maxio)
+ drive->count = maxio;
else
drive->count = count;
if(atageniostart(drive, lba)){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1557,1563 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1602,1608
while(waserror())
;
- tsleep(ctlr, atadone, ctlr, 30*1000);
+ tsleep(ctlr, atadone, ctlr, 60*1000);
poperror();
if(!ctlr->done){
/*
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1797,1804 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1842,1849
{
Ctlr *ctlr;
Pcidev *p;
- int channel, ispc87415, pi, r;
SDev *legacy[2], *sdev, *head, *tail;
+ int channel, ispc87415, maxio, pi, r, span;
legacy[0] = legacy[1] = head = tail = nil;
if(sdev = ataprobe(0x1F0, 0x3F4, IrqATA0)){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1839,1844 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1884,1891
continue;
pi = p->ccrp;
ispc87415 = 0;
+ maxio = 0;
+ span = BMspan;
switch((p->did<<16)|p->vid){
default:
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1868,1875 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1915,1925
case (0x4D69<<16)|0x105A: /* Promise Ultra/133 TX2 */
case (0x3373<<16)|0x105A: /* Promise 20378 RAID */
case (0x3149<<16)|0x1106: /* VIA VT8237 SATA/RAID */
- case (0x3112<<16)|0x1095: /* SiL 3112 SATA (DMA busted?) */
- case (0x3114<<16)|0x1095: /* SiL 3114 SATA/RAID */
+ case (0x3112<<16)|0x1095: /* SiI 3112 SATA/RAID */
+ maxio = 15;
+ span = 8*1024;
+ /*FALLTHROUGH*/
+ case (0x3114<<16)|0x1095: /* SiI 3114 SATA/RAID */
pi = 0x85;
break;
case (0x0004<<16)|0x1103: /* HighPoint HPT366 */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1932,1937 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:1982,1988
r &= ~0x2000;
pcicfgw32(sb, 0x64, r);
}
+ span = 32*1024;
break;
case (0x5513<<16)|0x1039: /* SiS 962 */
case (0x0646<<16)|0x1095: /* CMD 646 */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:1979,1984 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:2030,2037
ctlr = sdev->ctlr;
ctlr->pcidev = p;
+ ctlr->maxio = maxio;
+ ctlr->span = span;
if(!(pi & 0x80))
continue;
ctlr->bmiba = (p->mem[4].bar & ~0x01) + channel*8;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:2030,2075 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:2083,2088
return ataprobe(port, port+0x204, irq);
}
- static SDev*
- ataid(SDev* sdev)
- {
- int i;
- Ctlr *ctlr;
- char name[32];
-
- /*
- * Legacy controllers are always 'C' and 'D' and if
- * they exist and have drives will be first in the list.
- * If there are no active legacy controllers, native
- * controllers start at 'C'.
- */
- if(sdev == nil)
- return nil;
- ctlr = sdev->ctlr;
- if(ctlr->cmdport == 0x1F0 || ctlr->cmdport == 0x170)
- i = 2;
- else
- i = 0;
- while(sdev){
- if(sdev->ifc == &sdataifc){
- ctlr = sdev->ctlr;
- if(ctlr->cmdport == 0x1F0)
- sdev->idno = 'C';
- else if(ctlr->cmdport == 0x170)
- sdev->idno = 'D';
- else{
- sdev->idno = 'C'+i;
- i++;
- }
- snprint(name, sizeof(name), "sd%c", sdev->idno);
- kstrdup(&sdev->name, name);
- }
- sdev = sdev->next;
- }
-
- return nil;
- }
-
static int
ataenable(SDev* sdev)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdata.c:2230,2236 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdata.c:2243,2248
atapnp, /* pnp */
atalegacy, /* legacy */
- ataid, /* id */
ataenable, /* enable */
atadisable, /* disable */
[rsc] --rw-rw-r-- M 451989 glenda sys 27737 Nov 6 10:23 sys/src/9/pc/sdmylex.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdmylex.c:1012,1017 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdmylex.c:1012,1018
goto buggery;
sdev->ifc = &sdmylexifc;
sdev->ctlr = ctlr;
+ sdev->idno = '0';
ctlr->sdev = sdev;
if(!ctlr->wide)
sdev->nunit = 8;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdmylex.c:1089,1100 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdmylex.c:1090,1095
return head;
}
- static SDev*
- mylexid(SDev* sdev)
- {
- return scsiid(sdev, &sdmylexifc);
- }
-
static int
mylex24enable(Ctlr* ctlr)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdmylex.c:1232,1238 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdmylex.c:1227,1232
mylexpnp, /* pnp */
nil, /* legacy */
- mylexid, /* id */
mylexenable, /* enable */
nil, /* disable */
[rsc] --rw-rw-r-- M 451989 glenda sys 21180 Nov 6 14:44 sys/src/9/pc/trap.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:9,14 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:9,16
#include "../port/error.h"
#include <trace.h>
+ static int trapinited;
+
void noted(Ureg*, ulong);
static void debugbpt(Ureg*, void*);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:175,182 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:177,189
outb(0x61, x);
}
+ /*
+ * Minimal trap setup. Just enough so that we can panic
+ * on traps (bugs) during kernel initialization.
+ * Called very early - malloc is not yet available.
+ */
void
- trapinit(void)
+ trapinit0(void)
{
int d1, v;
ulong vaddr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:204,210 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:211,221
idt[v].d1 = d1;
vaddr += 6;
}
+ }
+ void
+ trapinit(void)
+ {
/*
* Special traps.
* Syscall() is called directly without going through trap().
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:216,221 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:227,233
nmienable();
addarchfile("irqalloc", 0444, irqallocread, nil);
+ trapinited = 1;
}
static char* excname[32] = {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:306,311 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:318,330
Vctl *ctl, *v;
Mach *mach;
+ if(!trapinited){
+ /* fault386 can give a better error message */
+ if(ureg->trap == VectorPF)
+ fault386(ureg, nil);
+ panic("trap %lud: not ready", ureg->trap);
+ }
+
m->perf.intrts = perfticks();
user = (ureg->cs & 0xFFFF) == UESEL;
if(user){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:507,513 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:526,532
iprint("dumpstack\n");
x = 0;
- x += print("ktrace /kernel/path %.8lux %.8lux\n", ureg->pc, ureg->sp);
+ x += print("ktrace /kernel/path %.8lux %.8lux <<EOF\n", ureg->pc, ureg->sp);
i = 0;
if(up
&& (ulong)&l >= (ulong)up->kstack
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:522,528 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:541,547
for(l=(ulong)&l; l<estack; l+=4){
v = *(ulong*)l;
- if((KTZERO < v && v < (ulong)&etext) || estack-l<256){
+ if((KTZERO < v && v < (ulong)&etext) || estack-l<32){
/*
* we could Pick off general CALL (((uchar*)v)[-5] == 0xE8)
* and CALL indirect through AX (((uchar*)v)[-2] == 0xFF && ((uchar*)v)[-2] == 0xD0),
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:538,543 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:557,563
}
if(i)
print("\n");
+ print("EOF\n");
}
void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:571,578 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:591,596
print("unexpected trap %lud; ignoring\n", ureg->trap);
}
- extern void checkpages(void);
-
static void
fault386(Ureg* ureg, void*)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:581,592 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:599,618
char buf[ERRMAX];
addr = getcr2();
- user = (ureg->cs & 0xFFFF) == UESEL;
- if(!user && mmukmapsync(addr))
- return;
read = !(ureg->ecode & 2);
+
+ user = (ureg->cs & 0xFFFF) == UESEL;
+ if(!user){
+ if(vmapsync(addr))
+ return;
+ if(addr >= USTKTOP)
+ panic("kernel fault: bad address pc=0x%.8lux addr=0x%.8lux", ureg->pc, addr);
+ if(up == nil)
+ panic("kernel fault: no user process pc=0x%.8lux addr=0x%.8lux", ureg->pc, addr);
+ }
if(up == nil)
- panic("fault but up is zero; pc 0x%8.8lux addr 0x%8.8lux\n", ureg->pc, addr);
+ panic("user fault: up=0 pc=0x%.8lux addr=0x%.8lux", ureg->pc, addr);
+
insyscall = up->insyscall;
up->insyscall = 1;
n = fault(addr, read);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:597,603 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:623,629
}
checkpages();
sprint(buf, "sys: trap: fault %s addr=0x%lux",
- read? "read" : "write", addr);
+ read ? "read" : "write", addr);
postnote(up, 1, buf, NDebug);
}
up->insyscall = insyscall;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/trap.c:887,892 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/trap.c:913,921
{
ulong *sp;
Ureg *ureg;
+
+ up->fpstate = FPinit;
+ fpoff();
sp = (ulong*)(USTKTOP - ssize);
*--sp = nargs;
[rsc] --rw-rw-r-- M 451989 glenda sys 4030 Nov 6 10:23 sys/src/9/pc/vgai81x.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgai81x.c:49,142 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgai81x.c:49,92
return nil;
}
- static ulong
- i81xlinear(VGAscr* scr, int* size, int* align)
- {
- Pcidev *p;
- int oapsize, wasupamem;
- ulong aperture, oaperture, fbuf, fbend, *rp;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- aperture = 0;
- p = i81xpcimatch();
- if(p != nil) {
- aperture = p->mem[0].bar & ~0x0F;
- *size = p->mem[0].size;
- if(*size > Fbsize)
- *size = Fbsize;
- }
-
- if(wasupamem){
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)){
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- /* allocate space for frame buffer, populate page table */
- if(oapsize == 0) {
- fbuf = PADDR(xspanalloc(*size, BY2PG, 0));
- fbend = PGROUND(fbuf+*size);
- rp = KADDR(scr->io+0x10000);
- while(fbuf < fbend) {
- *rp++ = fbuf | (1<<0);
- fbuf += BY2PG;
- }
- }
- return aperture;
- }
-
static void
i81xenable(VGAscr* scr)
{
Pcidev *p;
- int align, size;
+ int size;
Mach *mach0;
- ulong aperture, pgtbl, *rp, cursor, *pte;
-
- /*
- * Only once, can't be disabled for now.
- * scr->io holds the physical address of
- * the MMIO registers.
- */
- if(scr->io)
+ ulong *pgtbl, *rp, cursor, *pte, fbuf, fbend;
+
+ if(scr->mmio)
return;
p = i81xpcimatch();
if(p == nil)
return;
- scr->io = upamalloc(p->mem[1].bar & ~0x0F, p->mem[1].size, 0);
- if(scr->io == 0)
+ scr->mmio = vmap(p->mem[1].bar & ~0x0F, p->mem[1].size);
+ if(scr->mmio == 0)
return;
+ addvgaseg("i81xmmio", p->mem[1].bar&~0x0F, p->mem[1].size);
/* allocate page table */
- pgtbl = PADDR(xspanalloc(64*1024, BY2PG, 0));
- rp = KADDR(scr->io+0x2020);
- *rp = pgtbl | 1;
+ pgtbl = xspanalloc(64*1024, BY2PG, 0);
+ scr->mmio[0x2020/4] = PADDR(pgtbl) | 1;
- addvgaseg("i81xmmio", (ulong)scr->io, p->mem[0].size);
-
size = p->mem[0].size;
- align = 0;
- aperture = i81xlinear(scr, &size, &align);
- if(aperture){
- scr->aperture = aperture;
- scr->apsize = size;
- addvgaseg("i81xscreen", aperture, size);
+ if(size > 0)
+ size = Fbsize;
+ vgalinearaddr(scr, p->mem[0].bar&~0xF, size);
+ addvgaseg("i81xscreen", p->mem[0].bar&~0xF, size);
+
+ /*
+ * allocate backing store for frame buffer
+ * and populate device page tables.
+ */
+ fbuf = PADDR(xspanalloc(size, BY2PG, 0));
+ fbend = PGROUND(fbuf+size);
+ rp = scr->mmio+0x10000/4;
+ while(fbuf < fbend) {
+ *rp++ = fbuf | 1;
+ fbuf += BY2PG;
}
/*
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgai81x.c:147,155 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgai81x.c:97,105
mach0 = MACHP(0);
pte = mmuwalk(mach0->pdb, cursor, 2, 0);
if(pte == nil)
- panic("i81x cursor");
+ panic("i81x cursor mmuwalk");
*pte |= PTEUNCACHED;
- scr->storage = PADDR(cursor);
+ scr->storage = cursor;
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgai81x.c:157,165 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgai81x.c:107,115
{
CursorI81x *hwcurs;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- hwcurs = KADDR(scr->io+hwCur);
+ hwcurs = (void*)((uchar*)scr->mmio+hwCur);
hwcurs->ctl = (1<<4);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgai81x.c:170,178 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgai81x.c:120,128
uchar *p;
CursorI81x *hwcurs;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- hwcurs = KADDR(scr->io+hwCur);
+ hwcurs = (void*)((uchar*)scr->mmio+hwCur);
/*
* Disable the cursor then load the new image in
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgai81x.c:181,187 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgai81x.c:131,137
* transparent.
*/
hwcurs->ctl = (1<<4);
- p = KADDR(scr->storage);
+ p = (uchar*)scr->storage;
for(y = 0; y < 16; y += 2) {
*p++ = ~(curs->clr[2*y]|curs->set[2*y]);
*p++ = ~(curs->clr[2*y+1]|curs->set[2*y+1]);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgai81x.c:213,221 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgai81x.c:163,171
ulong pos;
CursorI81x *hwcurs;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 1;
- hwcurs = KADDR(scr->io+hwCur);
+ hwcurs = (void*)((uchar*)scr->mmio+hwCur);
x = p.x+scr->offset.x;
y = p.y+scr->offset.y;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgai81x.c:242,256 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgai81x.c:192,206
CursorI81x *hwcurs;
i81xenable(scr);
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- hwcurs = KADDR(scr->io+hwCur);
+ hwcurs = (void*)((uchar*)scr->mmio+hwCur);
/*
* Initialise the 32x32 cursor to be transparent in 2bpp mode.
*/
- hwcurs->base = scr->storage;
- p = KADDR(scr->storage);
+ hwcurs->base = PADDR(scr->storage);
+ p = (uchar*)scr->storage;
for(i = 0; i < 32/2; i++) {
memset(p, 0xff, 8);
memset(p+8, 0, 8);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgai81x.c:269,275 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgai81x.c:219,225
i81xenable,
nil,
nil,
- i81xlinear,
+ nil,
};
VGAcur vgai81xcur = {
[rsc] --rw-rw-r-- M 451989 rsc sys 2369 Nov 6 10:23 sys/src/9/pc/vgavesa.c
[rsc] --rw-rw-r-- M 451989 presotto sys 7505 Nov 6 10:17 sys/src/9/pc/devlml.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devlml.c:127,132 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devlml.c:127,133
{
Physseg segbuf;
ulong regpa;
+ void *regva;
ISAConf isa;
char name[32];
Pcidev *pcidev;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/devlml.c:157,168 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/devlml.c:158,170
print("zr36067 found at 0x%.8lux", pcidev->mem[0].bar & ~0x0F);
- regpa = upamalloc(pcidev->mem[0].bar & ~0x0F, pcidev->mem[0].size, 0);
- if (regpa == 0) {
+ regpa = pcidev->mem[0].bar & ~0x0F;
+ regva = vmap(regpa, pcidev->mem[0].size, 0);
+ if (regva == 0) {
print("lml: failed to map registers\n");
return;
}
- lml->pciBaseAddr = (ulong)KADDR(regpa);
+ lml->pciBaseAddr = (ulong)regva;
print(", mapped at 0x%.8lux\n", lml->pciBaseAddr);
memset(&segbuf, 0, sizeof(segbuf));
[rsc] --rw-rw-r-- M 451989 jmk sys 22723 Nov 6 10:19 sys/src/9/pc/ether8169.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8169.c:357,363 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8169.c:357,364
ctlr->mii = nil;
return -1;
}
- print("oui %X phyno %d\n", phy->oui, phy->phyno);
+ USED(phy);
+ // print("oui %X phyno %d\n", phy->oui, phy->phyno);
miiane(ctlr->mii, ~0, ~0, ~0);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8169.c:451,458 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8169.c:452,459
l += snprint(p+l, READSTR-l, "punlc: %ud\n", ctlr->punlc);
l += snprint(p+l, READSTR-l, "fovw: %ud\n", ctlr->fovw);
- l += snprint(p+l, READSTR-l, "tcr: %8.8uX\n", ctlr->tcr);
- l += snprint(p+l, READSTR-l, "rcr: %8.8uX\n", ctlr->rcr);
+ l += snprint(p+l, READSTR-l, "tcr: %#8.8ux\n", ctlr->tcr);
+ l += snprint(p+l, READSTR-l, "rcr: %#8.8ux\n", ctlr->rcr);
if(ctlr->mii != nil && ctlr->mii->curphy != nil){
l += snprint(p+l, READSTR, "phy: ");
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8169.c:460,466 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8169.c:461,467
if(i && ((i & 0x07) == 0))
l += snprint(p+l, READSTR-l, "\n ");
r = miimir(ctlr->mii, i);
- l += snprint(p+l, READSTR-l, " %4.4uX", r);
+ l += snprint(p+l, READSTR-l, " %4.4ux", r);
}
snprint(p+l, READSTR-l, "\n");
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8169.c:811,817 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8169.c:812,818
else{
/*
* Error stuff here.
- print("control %8.8uX\n", control);
+ print("control %#8.8ux\n", control);
*/
}
d->control &= Eor;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8169.c:865,871 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8169.c:866,872
* Some of the reserved bits get set sometimes...
*/
if(isr & (Serr|Timeout|Tdu|Fovw|Punlc|Rdu|Ter|Tok|Rer|Rok))
- panic("rtl8169interrupt: imr %4.4uX isr %4.4uX\n",
+ panic("rtl8169interrupt: imr %#4.4ux isr %#4.4ux\n",
csr16r(ctlr, Imr), isr);
}
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ether8169.c:892,898 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ether8169.c:893,899
continue;
if(ioalloc(port, p->mem[0].size, 0, "rtl8169") < 0){
- print("rtl8169: port 0x%uX in use\n", port);
+ print("rtl8169: port %#ux in use\n", port);
continue;
}
[rsc] --rw-rw-r-- M 451989 jmk sys 29128 Nov 6 10:19 sys/src/9/pc/etherdp83820.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherdp83820.c:1114,1120 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherdp83820.c:1114,1120
static void
dp83820pci(void)
{
- int port;
+ void *mem;
Pcidev *p;
Ctlr *ctlr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherdp83820.c:1130,1147 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherdp83820.c:1130,1147
break;
}
- port = upamalloc(p->mem[1].bar & ~0x0F, p->mem[1].size, 0);
- if(port == 0){
+ mem = vmap(p->mem[1].bar & ~0x0F, p->mem[1].size);
+ if(mem == 0){
print("DP83820: can't map %8.8luX\n", p->mem[1].bar);
continue;
}
ctlr = malloc(sizeof(Ctlr));
- ctlr->port = port;
+ ctlr->port = p->mem[1].bar & ~0x0F;
ctlr->pcidev = p;
ctlr->id = (p->did<<16)|p->vid;
- ctlr->nic = KADDR(ctlr->port);
+ ctlr->nic = mem;
if(dp83820reset(ctlr)){
free(ctlr);
continue;
[rsc] --rw-rw-r-- M 451989 presotto sys 28748 Nov 6 10:19 sys/src/9/pc/etherga620.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherga620.c:758,764 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherga620.c:758,764
* memory it is accessed via the Local Memory Window; with a send
* ring size of 128 the window covers the whole ring and then need
* only be set once:
- * ctlr->sr = KADDR(ctlr->port+Lmw);
+ * ctlr->sr = (uchar*)ctlr->nic+Lmw;
* ga620lmw(ctlr, Sr, nil, sizeof(Sbd)*Nsr);
* ctlr->gib->srcb.addr.lo = Sr;
* There is nowhere in the Sbd to hold the Block* associated
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherga620.c:1114,1120 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherga620.c:1114,1120
static void
ga620pci(void)
{
- int port;
+ void *mem;
Pcidev *p;
Ctlr *ctlr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/etherga620.c:1135,1152 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/etherga620.c:1135,1152
break;
}
- port = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
- if(port == 0){
+ mem = vmap(p->mem[0].bar & ~0x0F, p->mem[0].size);
+ if(mem == 0){
print("ga620: can't map %8.8luX\n", p->mem[0].bar);
continue;
}
ctlr = malloc(sizeof(Ctlr));
- ctlr->port = port;
+ ctlr->port = p->mem[0].bar & ~0x0F;
ctlr->pcidev = p;
ctlr->id = (p->did<<16)|p->vid;
- ctlr->nic = KADDR(ctlr->port);
+ ctlr->nic = mem;
if(ga620reset(ctlr)){
free(ctlr);
continue;
[rsc] --rw-rw-r-- M 451989 jmk sys 22572 Nov 6 10:19 sys/src/9/pc/ethervt6102.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/ethervt6102.c:925,931 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/ethervt6102.c:925,931
ctlr->mii = nil;
return -1;
}
- print("oui %X phyno %d\n", phy->oui, phy->phyno);
+ // print("oui %X phyno %d\n", phy->oui, phy->phyno);
//miiane(ctlr->mii, ~0, ~0, ~0);
[rsc] --rw-rw-r-- M 451989 glenda sys 1418 Nov 6 10:21 sys/src/9/pc/pccd
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pccd:61,66 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pccd:61,67
usbuhci
misc
+ realmode
archmp mp apic
sdata pci sdscsi
[rsc] --rw-rw-r-- M 451989 presotto sys 1486 Nov 6 12:59 sys/src/9/pc/pccpuf
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pccpuf:58,63 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pccpuf:58,64
usbuhci
misc
+ realmode
archmp mp apic
uarti8250
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pccpuf:86,91 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pccpuf:87,93
vgat2r4 +cur
vgatvp3020 =cur
vgatvp3026 =cur
+ vgavesa
vgavmware +cur
[rsc] --rw-rw-r-- M 451989 rsc sys 1473 Nov 6 12:59 sys/src/9/pc/pcflop
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcflop:62,67 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcflop:62,68
# usbuhci
misc
+ realmode
# archmp mp apic
sdata pci sdscsi
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/pcflop:91,96 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/pcflop:92,98
vgat2r4 +cur
vgatvp3020 =cur
vgatvp3026 =cur
+ vgavesa
vgavmware +cur
ip
[rsc] --rw-rw-r-- M 451989 rsc sys 25780 Nov 6 10:23 sys/src/9/pc/sdmv50xx.c
[rsc] --rw-rw-r-- M 451989 glenda sys 5148 Nov 6 10:23 sys/src/9/pc/vga.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga.c:18,24 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga.c:19,25
static Rectangle window;
static int *xp;
static int xbuf[256];
- static Lock vgascreenlock;
+ Lock vgascreenlock;
int drawdebug;
void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga.c:136,142 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga.c:137,143
static void
vgascreenputs(char* s, int n)
{
- int i;
+ int i, gotdraw;
Rune r;
char buf[4];
VGAscr *scr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga.c:155,160 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga.c:156,167
else
lock(&vgascreenlock);
+ /*
+ * Be nice to hold this, but not going to deadlock
+ * waiting for it. Just try and see.
+ */
+ gotdraw = canqlock(&drawlock);
+
flushr = Rect(10000, 10000, -10000, -10000);
while(n > 0){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga.c:172,177 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga.c:179,186
}
flushmemscreen(flushr);
+ if(gotdraw)
+ qunlock(&drawlock);
unlock(&vgascreenlock);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga.c:241,247 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga.c:250,256
Point p;
scr = &vgascreen[0];
- if(scr->aperture == 0 || screenputs != vgascreenputs)
+ if(scr->vaddr == nil || screenputs != vgascreenputs)
return;
p = memsubfontwidth(scr->memdefont, s);
w = p.x;
[rsc] --rw-rw-r-- M 451989 glenda sys 3833 Nov 6 10:23 sys/src/9/pc/vga3dfx.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:28,93 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:28,40
hwCur = 0x5C,
};
- static ulong
- tdfxlinear(VGAscr* scr, int* size, int* align)
- {
- Pcidev *p;
- int oapsize, wasupamem;
- ulong aperture, oaperture;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- aperture = 0;
- if(p = pcimatch(nil, 0x121A, 0)){
- switch(p->did){
- case 0x0003: /* Banshee */
- case 0x0005: /* Avenger (a.k.a. Voodoo3) */
- case 0x0009: /* Voodoo5 */
- aperture = p->mem[1].bar & ~0x0F;
- *size = p->mem[1].size;
- break;
- default:
- break;
- }
- }
-
- if(wasupamem){
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)){
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
- }
-
static void
tdfxenable(VGAscr* scr)
{
Pcidev *p;
- ulong aperture;
- int align, i, *mmio, size;
+ int i, *mmio;
- /*
- * Only once, can't be disabled for now.
- * scr->io holds the physical address of
- * the MMIO registers.
- */
- if(scr->io)
+ if(scr->mmio)
return;
if(p = pcimatch(nil, 0x121A, 0)){
switch(p->did){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:100,120 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:47,63
}
else
return;
- scr->io = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
- if(scr->io == 0)
+
+ scr->mmio = vmap(p->mem[0].bar&~0x0F, p->mem[0].size);
+ if(scr->mmio == nil)
return;
+ scr->pci = p;
+
+ addvgaseg("3dfxmmio", p->mem[0].bar&~0x0F, p->mem[0].size);
+ vgalinearpci(scr);
+ if(scr->apsize)
+ addvgaseg("3dfxscreen", scr->paddr, scr->apsize);
- addvgaseg("3dfxmmio", (ulong)scr->io, p->mem[0].size);
-
- size = p->mem[1].size;
- align = 0;
- aperture = tdfxlinear(scr, &size, &align);
- if(aperture){
- scr->aperture = aperture;
- scr->apsize = size;
- addvgaseg("3dfxscreen", aperture, size);
- }
-
/*
* Find a place for the cursor data in display memory.
* If SDRAM then there's 16MB memory else it's SGRAM
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:123,129 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:66,72
* 8 of them.
* Use the last 1KB of the framebuffer.
*/
- mmio = KADDR(scr->io + dramInit0);
+ mmio = (void*)((uchar*)scr->mmio+dramInit0);
if(*(mmio+1) & 0x40000000)
i = 16*1024*1024;
else{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:144,152 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:87,95
{
Cursor3dfx *cursor3dfx;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursor3dfx = KADDR(scr->io+hwCur);
+ cursor3dfx = (void*)((uchar*)scr->mmio+hwCur);
cursor3dfx->vidProcCfg &= ~0x08000000;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:157,165 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:100,108
uchar *p;
Cursor3dfx *cursor3dfx;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursor3dfx = KADDR(scr->io+hwCur);
+ cursor3dfx = (void*)((uchar*)scr->mmio+hwCur);
/*
* Disable the cursor then load the new image in
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:177,183 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:120,126
* transparent.
*/
cursor3dfx->vidProcCfg &= ~0x08000000;
- p = KADDR(scr->aperture + scr->storage);
+ p = (uchar*)scr->vaddr + scr->storage;
for(y = 0; y < 16; y++){
*p++ = curs->clr[2*y]|curs->set[2*y];
*p++ = curs->clr[2*y+1]|curs->set[2*y+1];
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:201,209 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:144,152
{
Cursor3dfx *cursor3dfx;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 1;
- cursor3dfx = KADDR(scr->io+hwCur);
+ cursor3dfx = (void*)((uchar*)scr->mmio+hwCur);
cursor3dfx->hwCurLoc = ((p.y+scr->offset.y)<<16)|(p.x+scr->offset.x);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:216,224 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:159,167
Cursor3dfx *cursor3dfx;
tdfxenable(scr);
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursor3dfx = KADDR(scr->io+hwCur);
+ cursor3dfx = (void*)((uchar*)scr->mmio+hwCur);
/*
* Cursor colours.
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:230,236 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:173,179
* Initialise the 64x64 cursor to be transparent (X11 mode).
*/
cursor3dfx->hwCurPatAddr = scr->storage;
- memset(KADDR(scr->aperture + scr->storage), 0, 64*16);
+ memset((uchar*)scr->vaddr + scr->storage, 0, 64*16);
/*
* Load, locate and enable the 64x64 cursor in X11 mode.
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vga3dfx.c:246,252 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vga3dfx.c:189,195
tdfxenable,
nil,
nil,
- tdfxlinear,
+ nil,
};
VGAcur vga3dfxcur = {
[rsc] --rw-rw-r-- M 451989 glenda sys 3422 Nov 6 10:23 sys/src/9/pc/vgaark2000pv.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaark2000pv.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaark2000pv.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaark2000pv.c:90,96 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaark2000pv.c:91,97
*/
seq10 = vgaxi(Seqx, 0x10);
opage = 0;
- p = KADDR(scr->aperture);
+ p = scr->vaddr;
if(!(seq10 & 0x10)){
lock(&scr->devlock);
opage = ark2000pvpageset(scr, scr->storage>>16);
[rsc] --rw-rw-r-- M 451989 glenda sys 5057 Nov 6 10:23 sys/src/9/pc/vgabt485.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgabt485.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgabt485.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
[rsc] --rw-rw-r-- M 451989 glenda sys 4550 Nov 6 10:23 sys/src/9/pc/vgaclgd542x.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd542x.c:41,76 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd542x.c:41,50
unlock(&scr->devlock);
}
- static ulong
- clgd542xlinear(VGAscr* scr, int* size, int* align)
+ static void
+ clgd542xlinear(VGAscr* scr, int, int)
{
- ulong aperture, oaperture;
- int oapsize, wasupamem;
- Pcidev *p;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
- if(wasupamem)
- upafree(oaperture, oapsize);
- scr->isupamem = 0;
-
- if(p = pcimatch(nil, 0x1013, 0)){
- aperture = p->mem[0].bar & ~0x0F;
- *size = p->mem[0].size;
- }
- else
- aperture = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0))
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
+ vgalinearpciid(scr, 0x1013, 0);
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd542x.c:171,177 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd542x.c:145,151
*/
seq07 = vgaxi(Seqx, 0x07);
opage = 0;
- p = KADDR(scr->aperture);
+ p = scr->vaddr;
if(!(seq07 & 0xF0)){
lock(&scr->devlock);
opage = clgd542xpageset(scr, scr->storage>>16);
[rsc] --rw-rw-r-- M 451989 glenda sys 3716 Nov 6 10:23 sys/src/9/pc/vgaclgd546x.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd546x.c:26,118 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd546x.c:26,60
CursorMMIO = 0xE0,
};
- static ulong
- clgd546xlinear(VGAscr* scr, int* size, int* align)
+ static void
+ clgd546xlinear(VGAscr* scr, int, int)
{
- ulong aperture, oaperture;
- int oapsize, wasupamem;
- Pcidev *p;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- aperture = 0;
- if(p = pcimatch(nil, 0x1013, 0)){
- switch(p->did){
- case 0xD0:
- case 0xD4:
- case 0xD6:
- aperture = p->mem[0].bar & ~0x0F;
- *size = p->mem[0].size;
- break;
- default:
- break;
- }
- }
-
- if(wasupamem){
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)){
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
+ vgalinearpci(scr);
}
+
static void
clgd546xenable(VGAscr* scr)
{
Pcidev *p;
- int size, align;
- ulong aperture;
- /*
- * Only once, can't be disabled for now.
- * scr->io holds the virtual address of
- * the MMIO registers.
- */
- if(scr->io)
+ if(scr->mmio)
return;
- if(p = pcimatch(nil, 0x1013, 0)){
- switch(p->did){
- case 0xD0:
- case 0xD4:
- case 0xD6:
- break;
- default:
- return;
- }
- }
- else
+ if((p = pcimatch(nil, 0x1013, 0)) == nil)
return;
- scr->io = upamalloc(p->mem[1].bar & ~0x0F, p->mem[1].size, 0);
- if(scr->io == 0)
+ switch(p->did){
+ case 0xD0:
+ case 0xD4:
+ case 0xD6:
+ break;
+ default:
return;
- addvgaseg("clgd546xmmio", scr->io, p->mem[1].size);
-
- scr->io = (ulong)KADDR(scr->io);
-
- size = p->mem[0].size;
- align = 0;
- aperture = clgd546xlinear(scr, &size, &align);
- if(aperture) {
- scr->aperture = aperture;
- scr->apsize = size;
- addvgaseg("clgd546xscreen", aperture, size);
}
+
+ scr->pci = p;
+ scr->mmio = vmap(p->mem[1].bar&~0x0F, p->mem[1].size);
+ if(scr->mmio == 0)
+ return;
+ addvgaseg("clgd546xmmio", p->mem[1].bar&~0x0F, p->mem[1].size);
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd546x.c:120,128 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd546x.c:62,70
{
Cursor546x *cursor546x;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursor546x = (Cursor546x*)(scr->io+CursorMMIO);
+ cursor546x = (Cursor546x*)((uchar*)scr->mmio+CursorMMIO);
cursor546x->enable = 0;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd546x.c:133,141 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd546x.c:75,83
uchar *p;
Cursor546x *cursor546x;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursor546x = (Cursor546x*)(scr->io+CursorMMIO);
+ cursor546x = (Cursor546x*)((uchar*)scr->mmio+CursorMMIO);
/*
* Disable the cursor then change only the bits
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd546x.c:142,148 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd546x.c:84,90
* that need it.
*/
cursor546x->enable = 0;
- p = (uchar*)(scr->aperture + scr->storage);
+ p = (uchar*)scr->vaddr + scr->storage;
for(y = 0; y < 16; y++){
c = curs->set[2*y];
m = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd546x.c:189,197 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd546x.c:131,139
int x, xo, y, yo;
Cursor546x *cursor546x;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 1;
- cursor546x = (Cursor546x*)(scr->io+CursorMMIO);
+ cursor546x = (Cursor546x*)((uchar*)scr->mmio+CursorMMIO);
if((x = p.x+scr->offset.x) < 0){
xo = -x;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd546x.c:220,234 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd546x.c:162,176
Cursor546x *cursor546x;
clgd546xenable(scr);
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursor546x = (Cursor546x*)(scr->io+CursorMMIO);
+ cursor546x = (Cursor546x*)((uchar*)scr->mmio+CursorMMIO);
/*
* Cursor colours.
* Can't call setcolor here as cursor is already locked.
*/
- p = (uchar*)(scr->io+PaletteState);
+ p = (uchar*)scr->mmio+PaletteState;
*p |= 0x08;
vgao(PaddrW, 0x00);
vgao(Pdata, Pwhite);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaclgd546x.c:248,254 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaclgd546x.c:190,196
*/
scr->storage = ((vgaxi(Seqx, 0x14) & 0x07)+1)*1024*1022;
cursor546x->addr = (scr->storage>>10)<<2;
- memset((uchar*)(scr->aperture + scr->storage), 0, 2*64*16);
+ memset((uchar*)scr->vaddr + scr->storage, 0, 2*64*16);
/*
* Load, locate and enable the 64x64 cursor.
[rsc] --rw-rw-r-- M 451989 glenda sys 2249 Nov 6 10:23 sys/src/9/pc/vgact65545.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgact65545.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgact65545.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgact65545.c:52,58 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgact65545.c:53,59
uint and, clr, set, xor;
int i, x, y;
- mem = KADDR(scr->aperture);
+ mem = scr->vaddr;
mem += scr->storage + index*1024;
for(y = yo; y < 16; y++){
[rsc] --rw-rw-r-- M 451989 glenda sys 3707 Nov 6 10:23 sys/src/9/pc/vgacyber938x.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgacyber938x.c:38,87 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgacyber938x.c:38,65
unlock(&scr->devlock);
}
- static ulong
- cyber938xlinear(VGAscr* scr, int* size, int* align)
+ static void
+ cyber938xlinear(VGAscr* scr, int, int)
{
- ulong aperture, oaperture;
- int oapsize, wasupamem;
- int osize;
Pcidev *p;
- osize = *size;
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
- if(wasupamem)
- upafree(oaperture, oapsize);
- scr->isupamem = 0;
- scr->mmio = 0;
+ if(scr->vaddr)
+ return;
+
+ vgalinearpciid(scr, 0x1023, 0);
+ p = scr->pci;
- if(p = pcimatch(nil, 0x1023, 0)){
- aperture = p->mem[0].bar & ~0x0F;
- *size = p->mem[0].size;
- /*
- * Heuristic to detect the MMIO space. We're flying blind
- * here, with only the XFree86 source to guide us.
- */
- if(p->mem[1].size == 0x20000)
- scr->mmio = (ulong*)(p->mem[1].bar & ~0x0F);
- }
- else
- aperture = 0;
+ /*
+ * Heuristic to detect the MMIO space. We're flying blind
+ * here, with only the XFree86 source to guide us.
+ */
+ if(p->mem[1].size == 0x20000)
+ scr->mmio = vmap(p->mem[1].bar & ~0x0F, p->mem[1].size);
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0))
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 1;
-
- if(aperture)
- addvgaseg("cyber938xscreen", aperture, osize);
+ if(scr->apsize)
+ addvgaseg("cyber938xscreen", scr->paddr, scr->apsize);
if(scr->mmio)
- addvgaseg("cyber938xmmio", (ulong)scr->mmio, 0x20000);
-
- return aperture;
+ addvgaseg("cyber938xmmio", p->mem[1].bar&~0x0F, 0x20000);
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgacyber938x.c:99,105 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgacyber938x.c:77,83
cyber938xcurdisable(scr);
opage = 0;
- p = KADDR(scr->aperture);
+ p = scr->vaddr;
islinear = vgaxi(Crtx, 0x21) & 0x20;
if(!islinear){
lock(&scr->devlock);
[rsc] --rw-rw-r-- M 451989 glenda sys 5111 Nov 6 10:23 sys/src/9/pc/vgaet4000.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaet4000.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaet4000.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgaet4000.c:139,145 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgaet4000.c:140,146
et4000disable(scr);
setet4000page(scr->storage>>16);
- mem = (uchar*)KADDR(scr->aperture) + (scr->storage & 0xFFFF);
+ mem = (uchar*)scr->vaddr + (scr->storage & 0xFFFF);
/*
* Initialise the 64x64 cursor RAM array. There are 2 planes,
[rsc] --rw-rw-r-- M 451989 glenda sys 4098 Nov 6 10:23 sys/src/9/pc/vgahiqvideo.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgahiqvideo.c:34,85 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgahiqvideo.c:34,42
outb(port+1, data);
}
- static ulong
- hiqvideolinear(VGAscr* scr, int* size, int* align)
+ static void
+ hiqvideolinear(VGAscr*, int, int)
{
- ulong aperture, oaperture;
- int oapsize, wasupamem;
- Pcidev *p;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- aperture = 0;
- if(p = pcimatch(nil, 0x102C, 0)){
- switch(p->did){
- case 0x00C0: /* 69000 HiQVideo */
- case 0x00E0: /* 65550 HiQV32 */
- case 0x00E4: /* 65554 HiQV32 */
- case 0x00E5: /* 65555 HiQV32 */
- aperture = p->mem[0].bar & ~0x0F;
- *size = p->mem[0].size;
- break;
- default:
- break;
- }
- }
-
- if(wasupamem){
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)){
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgahiqvideo.c:86,98 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgahiqvideo.c:43,54
hiqvideoenable(VGAscr* scr)
{
Pcidev *p;
- int align, size, vmsize;
- ulong aperture;
+ int vmsize;
/*
* Only once, can't be disabled for now.
*/
- if(scr->io)
+ if(scr->mmio)
return;
if(p = pcimatch(nil, 0x102C, 0)){
switch(p->did){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgahiqvideo.c:119,141 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgahiqvideo.c:75,95
else
return;
- size = p->mem[0].size;
- align = 0;
- aperture = hiqvideolinear(scr, &size, &align);
- if(aperture) {
- scr->aperture = aperture;
- scr->apsize = size;
- addvgaseg("hiqvideoscreen", aperture, size);
+ scr->pci = p;
+ vgalinearpci(scr);
+
+ if(scr->paddr) {
+ addvgaseg("hiqvideoscreen", scr->paddr, scr->apsize);
}
/*
* Find a place for the cursor data in display memory.
* Must be on a 4096-byte boundary.
- * scr->io holds the physical address of the cursor
+ * scr->mmio holds the virtual address of the cursor
* storage area in the framebuffer region.
*/
scr->storage = vmsize-4096;
- scr->io = scr->aperture+scr->storage;
+ scr->mmio = (ulong*)((uchar*)scr->vaddr+scr->storage);
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgahiqvideo.c:155,163 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgahiqvideo.c:109,117
*/
hiqvideocurdisable(scr);
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- p = KADDR(scr->io);
+ p = (uchar*)scr->mmio;
for(y = 0; y < 16; y += 2){
*p++ = ~(curs->clr[2*y]|curs->set[2*y]);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgahiqvideo.c:197,203 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgahiqvideo.c:151,157
{
int x, y;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 1;
if((x = p.x+scr->offset.x) < 0)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgahiqvideo.c:219,225 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgahiqvideo.c:173,179
uchar xr80;
hiqvideoenable(scr);
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
/*
[rsc] --rw-rw-r-- M 451989 glenda sys 28257 Nov 6 10:23 sys/src/9/pc/vgamach64xx.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamach64xx.c:168,180 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamach64xx.c:168,178
{
Pcidev *p;
- /*
- * Only once, can't be disabled for now.
- */
if(scr->io)
return;
if(p = mach64xxpci()){
scr->id = p->did;
+ scr->pci = p;
/*
* The CT doesn't always have the I/O base address
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamach64xx.c:189,241 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamach64xx.c:187,201
}
}
- static ulong
- mach64xxlinear(VGAscr* scr, int* size, int* align)
+ static void
+ mach64xxlinear(VGAscr* scr, int size, int)
{
- ulong aperture, osize, oaperture;
- int i, oapsize, wasupamem;
- Pcidev *p;
-
- osize = *size;
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- if(p = mach64xxpci()){
- for(i=0; i<nelem(p->mem); i++){
- if(p->mem[i].size >= *size
- && ((p->mem[i].bar & ~0x0F) & (*align-1)) == 0)
- break;
- }
- if(i >= nelem(p->mem)){
- print("vgamach64xx: aperture not found\n");
- return 0;
- }
- aperture = p->mem[i].bar & ~0x0F;
- *size = p->mem[i].size;
- }
- else
- aperture = 0;
-
- if(wasupamem)
- upafree(oaperture, oapsize);
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0))
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 1;
-
- scr->mmio = KADDR(aperture+osize-0x400);
- if(oaperture && oaperture != aperture)
- print("warning (BUG): redefinition of aperture does not change mach64mmio segment\n");
- addvgaseg("mach64mmio", aperture+osize-BY2PG, BY2PG);
- addvgaseg("mach64screen", aperture, osize);
-
- return aperture;
+ vgalinearpci(scr);
+ if(scr->paddr == 0)
+ return;
+ scr->mmio = (ulong*)((uchar*)scr->vaddr+size-1024);
+ addvgaseg("mach64mmio", scr->paddr+size-BY2PG, BY2PG);
+ addvgaseg("mach64screen", scr->paddr, scr->apsize);
}
enum {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamach64xx.c:474,480 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamach64xx.c:434,440
r = ior32(scr, GenTestCntl);
iow32(scr, GenTestCntl, r & ~0x80);
- p = KADDR(scr->aperture);
+ p = scr->vaddr;
p += scr->storage;
/*
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamach64xx.c:792,798 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamach64xx.c:752,758
}
/* Get the base freq from the BIOS */
- bios = KADDR(0xC000);
+ bios = kaddr(0xC000);
table = *(ushort *)(bios + 0x48);
table = *(ushort *)(bios + table + 0x10);
switch (*(ushort *)(bios + table + 0x08)) {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamach64xx.c:1120,1126 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamach64xx.c:1080,1086
mach64revb? "yes": "no",
mach64refclock);
pprint("%s: storage @%.8luX, aperture @%8.ulX, ovl buf @%.8ulX\n",
- scr->dev->name, scr->storage, scr->aperture,
+ scr->dev->name, scr->storage, scr->paddr,
mach64overlay);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamach64xx.c:1215,1221 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamach64xx.c:1175,1181
_offs = (ulong)(offs % ovl_fib);
nb = (_offs + len > ovl_fib)? ovl_fib - _offs: len;
- memmove((uchar *)KADDR(scr->aperture + mach64overlay + _offs),
+ memmove((uchar *)scr->vaddr + mach64overlay + _offs,
src, nb);
offs += nb;
src += nb;
[rsc] --rw-rw-r-- M 451989 glenda sys 4637 Nov 6 10:23 sys/src/9/pc/vgamga2164w.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga2164w.c:42,100 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga2164w.c:42,53
return p;
}
- static ulong
- mga2164wlinear(VGAscr* scr, int* size, int* align)
- {
- ulong aperture, oaperture;
- int oapsize, wasupamem;
- Pcidev *p;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- if(p = mgapcimatch()){
- aperture = p->mem[p->did==MGA2064? 1 : 0].bar & ~0x0F;
- *size = (p->did==MGA2064? 8 :16)*1024*1024;
- }
- else
- aperture = 0;
-
- if(wasupamem) {
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)) {
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
- }
-
static void
mga2164wenable(VGAscr* scr)
{
Pcidev *p;
- int size, align, immio;
- ulong aperture;
- /*
- * Only once, can't be disabled for now.
- * scr->io holds the virtual address of
- * the MMIO registers.
- */
- if(scr->io)
+ if(scr->mmio)
return;
p = mgapcimatch();
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga2164w.c:101,123 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga2164w.c:54,72
if(p == nil)
return;
- immio = p->did==MGA2064? 0 : 1;
- scr->io = upamalloc(p->mem[immio].bar & ~0x0F, p->mem[immio].size, 0);
- if(scr->io == 0)
- return;
- addvgaseg("mga2164wmmio", scr->io, p->mem[immio].size);
-
- scr->io = (ulong)KADDR(scr->io);
-
- /* need to map frame buffer here too, so vga can find memory size */
- size = (p->did==MGA2064? 8 :16)*1024*1024;
- align = 0;
- aperture = mga2164wlinear(scr, &size, &align);
- if(aperture) {
- scr->aperture = aperture;
- scr->apsize = size;
- addvgaseg("mga2164wscreen", aperture, size);
+ if(p->did == MGA2064){
+ scr->mmio = vmap(p->mem[0].bar&~0x0F, p->mem[0].size);
+ if(scr->mmio == nil)
+ return;
+ vgalinearaddr(scr, p->mem[1].bar&~0x0F, 8*MB);
+ }else{
+ scr->mmio = vmap(p->mem[1].bar&~0x0F, p->mem[1].size);
+ if(scr->mmio == nil)
+ return;
+ vgalinearaddr(scr, p->mem[0].bar&~0x0F, 16*MB);
}
+ if(scr->paddr)
+ addvgaseg("mga2164wscreen", scr->paddr, scr->apsize);
}
enum {
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga2164w.c:142,150 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga2164w.c:91,99
{
uchar *tvp3026;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- tvp3026 = KADDR(scr->io+0x3C00);
+ tvp3026 = (uchar*)scr->mmio+0x3C00;
/*
* Make sure cursor is off
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga2164w.c:161,169 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga2164w.c:110,118
int x, y;
uchar *tvp3026;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- tvp3026 = KADDR(scr->io+0x3C00);
+ tvp3026 = (uchar*)scr->mmio+0x3C00;
/*
* Make sure cursor is off by initialising the cursor
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga2164w.c:223,231 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga2164w.c:172,180
int x, y;
uchar *tvp3026;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 1;
- tvp3026 = KADDR(scr->io+0x3C00);
+ tvp3026 = (uchar*)scr->mmio+0x3C00;
x = p.x+scr->offset.x;
y = p.y+scr->offset.y;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga2164w.c:244,252 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga2164w.c:193,201
int i;
uchar *tvp3026;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- tvp3026 = KADDR(scr->io+0x3C00);
+ tvp3026 = (uchar*)scr->mmio+0x3C00;
tvp3026disable(scr);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga2164w.c:276,282 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga2164w.c:225,231
mga2164wenable, /* enable */
0, /* disable */
0, /* page */
- mga2164wlinear, /* linear */
+ 0, /* linear */
};
VGAcur vgamga2164wcur = {
[rsc] --rw-rw-r-- M 451989 glenda sys 10201 Nov 6 10:23 sys/src/9/pc/vgamga4xx.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:23,31 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:23,28
MGA4xx = 0x0525,
MGA200 = 0x0521,
- Kilo = 1024,
- Meg = 1024*1024,
-
FCOL = 0x1c24,
FXRIGHT = 0x1cac,
FXLEFT = 0x1ca8,
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:91,149 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:88,104
return p;
}
- static ulong
- mga4xxlinear(VGAscr* scr, int* size, int* align)
- {
- ulong aperture, oaperture;
- int oapsize, wasupamem;
- Pcidev * p;
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- if(p = mgapcimatch()){
- aperture = p->mem[0].bar & ~0x0F;
- if(p->did == MGA4xx)
- *size = 32*Meg;
- else
- *size = 8*Meg;
- }
- else
- aperture = 0;
-
- if(wasupamem) {
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)) {
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
- }
-
static void
mgawrite8(VGAscr* scr, int index, uchar val)
{
- ((uchar*)scr->io)[index] = val;
+ ((uchar*)scr->mmio)[index] = val;
}
static uchar
mgaread8(VGAscr* scr, int index)
{
- return ((uchar*)scr->io)[index];
+ return ((uchar*)scr->mmio)[index];
}
static uchar
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:163,181 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:118,130
mga4xxenable(VGAscr* scr)
{
Pcidev * pci;
- int size, align;
- ulong aperture;
+ int size;
int i, n, k;
uchar * p;
uchar x[16];
uchar crtcext3;
- /*
- * Only once, can't be disabled for now.
- * scr->io holds the virtual address of
- * the MMIO registers.
- */
- if(scr->io)
+ if(scr->mmio)
return;
pci = mgapcimatch();
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:182,222 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:131,170
if(pci == nil)
return;
- scr->io = upamalloc(pci->mem[1].bar & ~0x0F, 16*1024, 0);
- if(scr->io == 0)
+ scr->mmio = vmap(pci->mem[1].bar&~0x0F, 16*1024);
+ if(scr->mmio == nil)
return;
+
+ addvgaseg("mga4xxmmio", pci->mem[1].bar&~0x0F, pci->mem[1].size);
- addvgaseg("mga4xxmmio", scr->io, pci->mem[1].size);
-
- scr->io = (ulong)KADDR(scr->io);
-
/* need to map frame buffer here too, so vga can find memory size */
- size = 8*Meg;
- align = 0;
- aperture = mga4xxlinear(scr, &size, &align);
- if(aperture) {
- scr->aperture = aperture;
- addvgaseg("mga4xxscreen", aperture, size);
+ if(pci->did == MGA4xx)
+ size = 32*MB;
+ else
+ size = 8*MB;
+ vgalinearaddr(scr, pci->mem[0].bar&~0x0F, size);
- /* Find out how much memory is here, some multiple of 2 Meg */
+ if(scr->paddr){
+ /* Find out how much memory is here, some multiple of 2 MB */
+
/* First Set MGA Mode ... */
crtcext3 = crtcextset(scr, 3, 0x80, 0x00);
- p = (uchar*)aperture;
- n = (size / Meg) / 2;
+ p = scr->vaddr;
+ n = (size / MB) / 2;
for (i = 0; i < n; i++) {
- k = (2*i+1)*Meg;
+ k = (2*i+1)*MB;
p[k] = 0;
p[k] = i+1;
- *((uchar*)(scr->io + CACHEFLUSH)) = 0;
+ *((uchar*)scr->mmio + CACHEFLUSH) = 0;
x[i] = p[k];
}
for(i = 1; i < n; i++)
if(x[i] != i+1)
break;
- scr->apsize = 2*i*Meg;
-
+ scr->apsize = 2*i*MB; /* sketchy */
+ addvgaseg("mga4xxscreen", scr->paddr, scr->apsize);
crtcextset(scr, 3, crtcext3, 0xff);
}
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:240,249 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:188,197
{
uchar * dac4xx;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- dac4xx = KADDR(scr->io+0x3C00);
+ dac4xx = (uchar*)scr->mmio+0x3C00;
*(dac4xx+Index) = Icctl;
*(dac4xx+Data) = 0x00;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:256,269 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:204,217
uchar * p;
uchar * dac4xx;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- dac4xx = KADDR(scr->io+0x3C00);
+ dac4xx = (uchar*)scr->mmio+0x3C00;
dac4xxdisable(scr);
- p = KADDR(scr->storage);
+ p = scr->vaddr;
for(y = 0; y < 64; y++){
*p++ = 0; *p++ = 0; *p++ = 0;
*p++ = 0; *p++ = 0; *p++ = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:296,305 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:244,253
int x, y;
uchar * dac4xx;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 1;
- dac4xx = KADDR(scr->io + 0x3C00);
+ dac4xx = (uchar*)scr->mmio + 0x3C00;
x = p.x + scr->offset.x;
y = p.y + scr->offset.y;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:319,327 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:267,275
uchar * dac4xx;
ulong storage;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- dac4xx = KADDR(scr->io+0x3C00);
+ dac4xx = (uchar*)scr->mmio+0x3C00;
dac4xxdisable(scr);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:332,338 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:280,286
*(dac4xx+Index) = Icuradrh;
*(dac4xx+Data) = 0xff & (storage >> 18);
- scr->storage = (ulong) KADDR((ulong)scr->aperture + (ulong)storage);
+ scr->storage = (ulong)scr->vaddr + storage;
/* Show X11-Like Cursor */
*(dac4xx+Index) = Icctl;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:380,388 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:328,336
/* blank = 0 -> turn screen on */
/* blank = 1 -> turn screen off */
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- mga = KADDR(scr->io);
+ mga = (uchar*)scr->mmio;
if (blank == 0) {
seq1 = 0x00;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:432,440 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:380,388
uchar * mga;
/* Constant Shaded Trapezoids / Rectangle Fills */
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 0;
- mga = KADDR(scr->io);
+ mga = (uchar*)scr->mmio;
mgawrite32(mga, DWGCTL, 0);
mgawrite32(mga, FCOL, color);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:460,469 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:408,417
int ydir;
/* Two-operand Bitblts */
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 0;
- mga = KADDR(scr->io);
+ mga = (uchar*)scr->mmio;
pitch = Dx(scr->gscreen->r);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:556,564 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:504,512
if (p == nil)
return ;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- mga = KADDR(scr->io);
+ mga = (uchar*)scr->mmio;
mgawrite32(mga, SRCORG, 0);
mgawrite32(mga, DSTORG, 0);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgamga4xx.c:590,596 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgamga4xx.c:538,544
mga4xxenable, /* enable */
0, /* disable */
0, /* page */
- mga4xxlinear, /* linear */
+ 0, /* linear */
mga4xxdrawinit,
};
[rsc] --rw-rw-r-- M 451989 glenda sys 10143 Nov 6 10:23 sys/src/9/pc/vganeomagic.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:22,93 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:22,41
int addr;
};
- static ulong
- neomagiclinear(VGAscr* scr, int* size, int* align)
- {
- ulong aperture, oaperture;
- int oapsize, wasupamem;
- Pcidev *p;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- aperture = 0;
- if(p = pcimatch(nil, 0x10C8, 0)){
- switch(p->did){
- case 0x0003: /* MagicGraph 128ZV */
- case 0x0083: /* MagicGraph 128ZV+ */
- case 0x0004: /* MagicGraph 128XD */
- case 0x0005: /* MagicMedia 256AV */
- case 0x0006: /* MagicMedia 256ZX */
- aperture = p->mem[0].bar & ~0x0F;
- *size = p->mem[0].size;
- break;
- default:
- break;
- }
- }
-
- if(wasupamem){
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- //print("neomagiclinear1 %lux %d\n", aperture, *size);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)){
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
- }
-
static void
neomagicenable(VGAscr* scr)
{
Pcidev *p;
- int align, curoff, size, vmsize;
- ulong aperture;
+ int curoff, vmsize;
ulong ioaddr;
ulong iosize;
/*
- * Only once, can't be disabled for now.
- * scr->io holds the physical address of the cursor registers
+ * scr->mmio holds the virtual address of the cursor registers
* in the MMIO space. This may need to change for older chips
* which have the MMIO space offset in the framebuffer region.
*/
- if(scr->io)
+ if(scr->mmio)
return;
if(p = pcimatch(nil, 0x10C8, 0)){
switch(p->did){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:127,137 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:75,86
}
else
return;
- scr->io = upamalloc(ioaddr, iosize, 0);
- if(scr->io == 0)
+ scr->pci = p;
+
+ scr->mmio = vmap(ioaddr, iosize);
+ if(scr->mmio == nil)
return;
- addvgaseg("neomagicmmio", scr->io, iosize);
- scr->mmio = KADDR(scr->io);
+ addvgaseg("neomagicmmio", ioaddr, iosize);
/*
* Find a place for the cursor data in display memory.
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:139,154 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:88,97
* last 2KB of the framebuffer.
*/
scr->storage = vmsize-2*1024;
- scr->io += curoff;
-
- size = p->mem[0].size;
- align = 0;
- aperture = neomagiclinear(scr, &size, &align);
- if(aperture) {
- scr->aperture = aperture;
- scr->apsize = size;
- addvgaseg("neomagicscreen", aperture, size);
- }
+ scr->mmio = (ulong*)((uchar*)scr->mmio + curoff);
+ vgalinearpci(scr);
+ if(scr->paddr)
+ addvgaseg("neomagicscreen", scr->paddr, scr->apsize);
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:156,164 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:99,107
{
CursorNM *cursornm;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursornm = KADDR(scr->io);
+ cursornm = (void*)scr->mmio;
cursornm->enable = 0;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:169,175 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:112,118
uint p0, p1;
int x, y;
- p = KADDR(scr->aperture);
+ p = (uchar*)scr->mmio;
p += scr->storage + index*1024;
for(y = yo; y < 16; y++){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:211,219 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:154,162
{
CursorNM *cursornm;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursornm = KADDR(scr->io);
+ cursornm = (void*)scr->mmio;
cursornm->enable = 0;
memmove(&scr->Cursor, curs, sizeof(Cursor));
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:227,235 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:170,178
CursorNM *cursornm;
int addr, index, x, xo, y, yo;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 1;
- cursornm = KADDR(scr->io);
+ cursornm = (void*)scr->mmio;
index = 0;
if((x = p.x+scr->offset.x) < 0){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:266,274 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:209,217
CursorNM *cursornm;
neomagicenable(scr);
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
- cursornm = KADDR(scr->io);
+ cursornm = (void*)scr->mmio;
cursornm->enable = 0;
/*
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:426,432 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:369,375
| NEO_BC0_SRC_IS_FG
| NEO_BC3_SKIP_MAPPING
| GXcopy;
- mmio[DstStartOff] = scr->aperture
+ mmio[DstStartOff] = scr->paddr
+ r.min.y*scr->gscreen->width*BY2WD
+ r.min.x*scr->gscreen->depth/BI2BY;
mmio[XYExt] = (Dy(r) << 16) | (Dx(r) & 0xffff);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:452,460 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:395,403
| NEO_BC3_FIFO_EN
| NEO_BC3_SKIP_MAPPING
| GXcopy;
- mmio[SrcStartOff] = scr->aperture
+ mmio[SrcStartOff] = scr->paddr
+ sr.min.y*pitch + sr.min.x*pixel;
- mmio[DstStartOff] = scr->aperture
+ mmio[DstStartOff] = scr->paddr
+ r.min.y*pitch + r.min.x*pixel;
} else {
/* start from lower-right */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:465,473 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:408,416
| NEO_BC3_FIFO_EN
| NEO_BC3_SKIP_MAPPING
| GXcopy;
- mmio[SrcStartOff] = scr->aperture
+ mmio[SrcStartOff] = scr->paddr
+ (sr.max.y-1)*pitch + (sr.max.x-1)*pixel;
- mmio[DstStartOff] = scr->aperture
+ mmio[DstStartOff] = scr->paddr
+ (r.max.y-1)*pitch + (r.max.x-1)*pixel;
}
mmio[XYExt] = (Dy(r) << 16) | (Dx(r) & 0xffff);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganeomagic.c:549,555 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganeomagic.c:492,498
neomagicenable,
nil,
nil,
- neomagiclinear,
+ nil,
neomagicdrawinit,
};
[rsc] --rw-rw-r-- M 451989 glenda sys 11783 Nov 6 10:23 sys/src/9/pc/vganvidia.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:77,84 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:77,82
int dmamax;
} nv;
-
- /* Nvidia is good about backwards compatibility -- any did >= 0x20 is fine */
static Pcidev*
nvidiapci(void)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:92,134 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:90,98
return nil;
}
- static ulong
- nvidialinear(VGAscr* scr, int* size, int* align)
+ static void
+ nvidialinear(VGAscr*, int, int)
{
- Pcidev *p;
- int oapsize, wasupamem;
- ulong aperture, oaperture;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- aperture = 0;
- if(p = nvidiapci()){
- aperture = p->mem[1].bar & ~0x0F;
- *size = p->mem[1].size;
- }
-
- if(wasupamem){
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)){
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:135,174 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:99,129
nvidiaenable(VGAscr* scr)
{
Pcidev *p;
- ulong aperture, *q;
- int align, size, tmp;
+ ulong *q;
+ int tmp;
- /*
- * Only once, can't be disabled for now.
- * scr->io holds the physical address of
- * the MMIO registers.
- */
- if(scr->io)
+ if(scr->mmio)
return;
p = nvidiapci();
if(p == nil)
return;
scr->id = p->did;
+ scr->pci = p;
- scr->io = upamalloc(p->mem[0].bar & ~0x0F, p->mem[0].size, 0);
- if(scr->io == 0)
+ scr->mmio = vmap(p->mem[0].bar & ~0x0F, p->mem[0].size);
+ if(scr->mmio == nil)
return;
- addvgaseg("nvidiammio", scr->io, p->mem[0].size);
+ addvgaseg("nvidiammio", p->mem[0].bar&~0x0F, p->mem[0].size);
- size = p->mem[1].size;
- align = 0;
- aperture = nvidialinear(scr, &size, &align);
- if(aperture){
- scr->aperture = aperture;
- scr->apsize = size;
- addvgaseg("nvidiascreen", aperture, size);
- }
+ vgalinearpci(scr);
+ if(scr->apsize)
+ addvgaseg("nvidiascreen", scr->paddr, scr->apsize);
/* find video memory size */
switch (scr->id & 0x0ff0) {
case 0x0020:
case 0x00A0:
- q = KADDR(scr->io + Pfb);
+ q = (void*)((uchar*)scr->mmio + Pfb);
tmp = *q;
if (tmp & 0x0100) {
scr->storage = ((tmp >> 12) & 0x0F) * 1024 + 1024 * 2;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:191,197 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:146,152
scr->storage = (((tmp >> 4) & 127) + 1) * 1024 * 1024;
break;
default:
- q = KADDR(scr->io + Pfb + 0x020C);
+ q = (void*)((uchar*)scr->mmio + Pfb + 0x020C);
tmp = (*q >> 20) & 0xFF;
if (tmp == 0)
tmp = 16;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:203,209 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:158,164
static void
nvidiacurdisable(VGAscr* scr)
{
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
vgaxo(Crtx, 0x31, vgaxi(Crtx, 0x31) & ~0x01);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:218,224 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:173,179
ushort c,s;
ulong tmp;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
vgaxo(Crtx, 0x31, vgaxi(Crtx, 0x31) & ~0x01);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:226,235 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:181,190
switch (scr->id & 0x0ff0) {
case 0x0020:
case 0x00A0:
- p = KADDR(scr->io + Pramin + 0x1E00 * 4);
+ p = (void*)((uchar*)scr->mmio + Pramin + 0x1E00 * 4);
break;
default:
- p = KADDR(scr->aperture + scr->storage - 96*1024);
+ p = (void*)((uchar*)scr->vaddr + scr->storage - 96*1024);
break;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:268,277 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:223,232
{
ulong* cursorpos;
- if(scr->io == 0)
+ if(scr->mmio == 0)
return 1;
- cursorpos = KADDR(scr->io + hwCurPos);
+ cursorpos = (void*)((uchar*)scr->mmio + hwCurPos);
*cursorpos = ((p.y+scr->offset.y)<<16)|((p.x+scr->offset.x) & 0xFFFF);
return 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:281,287 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:236,242
nvidiacurenable(VGAscr* scr)
{
nvidiaenable(scr);
- if(scr->io == 0)
+ if(scr->mmio == 0)
return;
vgaxo(Crtx, 0x1F, 0x57);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:299,307 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:254,262
ulong *fifo;
outb(0x3D0,0);
- p=KADDR(scr->aperture);
+ p = scr->vaddr;
scratch = *p;
- fifo = KADDR(scr->io + Fifo);
+ fifo = (void*)((uchar*)scr->mmio + Fifo);
fifo[0x10] = (data << 2);
USED(scratch);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:311,317 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:266,272
{
ulong *fifo;
- fifo = KADDR(scr->io + Fifo);
+ fifo = (void*)((uchar*)scr->mmio + Fifo);
return (fifo[0x0011] >> 2);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:375,381 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:330,336
ulong* pgraph;
int x;
- pgraph = KADDR(scr->io + Pgraph);
+ pgraph = (void*)((uchar*)scr->mmio + Pgraph);
x = 0;
while((readget(scr) != nv.dmaput) && x++ < 1000000)
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:388,394 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:343,349
;
if(x >= 1000000)
- iprint("idle stat %lud scrio %.8lux scr %p pc %luX\n", *pgraph, scr->io, scr, getcallerpc(&scr));
+ iprint("idle stat %lud scrio %.8lux scr %p pc %luX\n", *pgraph, scr->mmio, scr, getcallerpc(&scr));
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vganvidia.c:399,405 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vganvidia.c:354,360
pitch = scr->gscreen->width*BY2WD;
- nv.dmabase = KADDR(scr->aperture + scr->storage - 128*1024);
+ nv.dmabase = (void*)((uchar*)scr->vaddr + scr->storage - 128*1024);
for(i=0; i<SKIPS; i++)
nv.dmabase[i] = 0x00000000;
[rsc] --rw-rw-r-- M 451989 glenda sys 4251 Nov 6 10:23 sys/src/9/pc/vgargb524.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgargb524.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgargb524.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
[rsc] --rw-rw-r-- M 451989 glenda sys 10994 Nov 6 10:23 sys/src/9/pc/vgas3.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgas3.c:88,188 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgas3.c:88,136
}
}
- static ulong
- s3linear(VGAscr* scr, int* size, int* align)
+ static void
+ s3linear(VGAscr* scr, int, int)
{
- char *mmioname;
- ulong aperture, oaperture, mmiobase, mmiosize;
- int i, id, j, osize, oapsize, wasupamem;
+ int id, j;
+ ulong mmiobase, mmiosize;
Pcidev *p;
-
- osize = *size;
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- mmiosize = 0;
- mmiobase = 0;
- mmioname = nil;
-
- /*
- * S3 makes cards other than display controllers, so
- * look for the first S3 display controller (device class 3)
- * and not one of their sound cards.
- */
- p = nil;
- while(p = pcimatch(p, PCIS3, 0)){
- if(p->ccrb == 0x03)
- break;
- }
- if(p != nil){
- for(i=0; i<nelem(p->mem); i++){
- if(p->mem[i].size >= *size
- && ((p->mem[i].bar & ~0x0F) & (*align-1)) == 0)
+
+ vgalinearpciid(scr, PCIS3, 0);
+ p = scr->pci;
+ if(scr->paddr == 0 || p == nil)
+ return;
+
+ addvgaseg("s3screen", scr->paddr, scr->apsize);
+
+ id = (vgaxi(Crtx, 0x2D)<<8)|vgaxi(Crtx, 0x2E);
+ switch(id){ /* find mmio */
+ case SAVAGE4:
+ case PROSAVAGEP:
+ case PROSAVAGEK:
+ case PROSAVAGE8:
+ case SUPERSAVAGEIXC16:
+ /*
+ * We could assume that the MMIO registers
+ * will be in the screen segment and just use
+ * that, but PCI software is allowed to move them
+ * if it feels like it, so we look for an aperture of
+ * the right size; only the first 512k actually means
+ * anything. The S3 engineers overestimated how
+ * much space they would need in the first design.
+ */
+ for(j=0; j<nelem(p->mem); j++){
+ if((p->mem[j].bar&~0x0F) != scr->paddr)
+ if(p->mem[j].size==512*1024 || p->mem[j].size==16*1024*1024){
+ mmiobase = p->mem[j].bar & ~0x0F;
+ mmiosize = 512*1024;
+ scr->mmio = vmap(mmiobase, mmiosize);
+ if(scr->mmio == nil)
+ return;
+ addvgaseg("savagemmio", mmiobase, mmiosize);
break;
- }
- if(i >= nelem(p->mem)){
- print("vgas3: aperture not found\n");
- return 0;
- }
- aperture = p->mem[i].bar & ~0x0F;
- *size = p->mem[i].size;
-
- id = (vgaxi(Crtx, 0x2D)<<8)|vgaxi(Crtx, 0x2E);
- switch(id){ /* find mmio */
- case SAVAGE4:
- case PROSAVAGEP:
- case PROSAVAGEK:
- case PROSAVAGE8:
- case SUPERSAVAGEIXC16:
- /*
- * We could assume that the MMIO registers
- * will be in the screen segment and just use
- * that, but PCI software is allowed to move them
- * if it feels like it, so we look for an aperture of
- * the right size; only the first 512k actually means
- * anything. The S3 engineers overestimated how
- * much space they would need in the first design.
- */
- for(j=0; j<nelem(p->mem); j++){
- if(i == j)
- continue;
- if(p->mem[j].size==512*1024 || p->mem[j].size==16*1024*1024){
- mmiobase = p->mem[j].bar & ~0x0F;
- mmiosize = 512*1024;
- scr->mmio = (ulong*)upamalloc(mmiobase, mmiosize, 0);
- mmioname = "savagemmio";
- break;
- }
}
- if(mmiosize == 0){
- print("savage4: mmio not found\n");
- return 0;
- }
}
- }else
- aperture = 0;
-
- if(wasupamem)
- upafree(oaperture, oapsize);
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0))
- scr->isupamem = 1;
}
- else
- scr->isupamem = 1;
-
- if(oaperture && oaperture != aperture)
- print("warning (BUG): redefinition of aperture does not change s3screen segment\n");
- addvgaseg("s3screen", aperture, osize);
-
- if(mmiosize)
- addvgaseg(mmioname, mmiobase, mmiosize);
-
- return aperture;
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgas3.c:223,229 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgas3.c:171,177
s3disable(scr);
opage = 0;
- p = KADDR(scr->aperture);
+ p = scr->vaddr;
id = (vgaxi(Crtx, 0x2D)<<8)|vgaxi(Crtx, 0x2E);
switch(id){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgas3.c:498,505 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgas3.c:446,453
mmio = scr->mmio;
waitforlinearfifo(scr);
waitforfifo(scr, 7);
- mmio[SrcBase] = scr->aperture;
- mmio[DstBase] = scr->aperture;
+ mmio[SrcBase] = scr->paddr;
+ mmio[DstBase] = scr->paddr;
mmio[Stride] = (stride<<16)|stride;
mmio[WidthHeight] = ((Dx(r)-1)<<16)|Dy(r);
mmio[SrcXY] = (sp.x<<16)|sp.y;
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgas3.c:524,532 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgas3.c:472,480
mmio = scr->mmio;
waitforlinearfifo(scr);
waitforfifo(scr, 8);
- mmio[SrcBase] = scr->aperture;
- mmio[DstBase] = scr->aperture;
- mmio[DstBase] = scr->aperture;
+ mmio[SrcBase] = scr->paddr;
+ mmio[DstBase] = scr->paddr;
+ mmio[DstBase] = scr->paddr;
mmio[Stride] = (stride<<16)|stride;
mmio[FgrdData] = sval;
mmio[WidthHeight] = ((Dx(r)-1)<<16)|Dy(r);
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgas3.c:579,591 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgas3.c:527,539
case VIRGE:
case VIRGEVX:
case VIRGEGX2:
- scr->mmio = (ulong*)(scr->aperture+0x1000000);
+ scr->mmio = (ulong*)((char*)scr->vaddr+0x1000000);
scr->fill = hwfill;
scr->scroll = hwscroll;
break;
case SAVAGEMXMV:
case SAVAGEIXMV:
- scr->mmio = (ulong*)(scr->aperture+0x1000000);
+ scr->mmio = (ulong*)((char*)scr->vaddr+0x1000000);
savageinit(scr);
break;
case SUPERSAVAGEIXC16:
[rsc] --rw-rw-r-- M 451989 glenda sys 9351 Nov 6 10:23 sys/src/9/pc/vgat2r4.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgat2r4.c:56,118 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgat2r4.c:56,67
CursorMode = CursorMode32x32,
};
- static ulong
- t2r4linear(VGAscr* scr, int* size, int* align)
- {
- ulong aperture, oaperture;
- int oapsize, wasupamem;
- Pcidev *p;
-
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
- aperture = 0;
- if(p = pcimatch(nil, 0x105D, 0)){
- switch(p->did){
- case 0x5348:
- aperture = p->mem[0].bar & ~0x0F;
- *size = p->mem[0].size;
- break;
- default:
- break;
- }
- }
-
- if(wasupamem){
- if(oaperture == aperture)
- return oaperture;
- upafree(oaperture, oapsize);
- }
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0)){
- aperture = oaperture;
- scr->isupamem = 1;
- }
- else
- scr->isupamem = 0;
- }
- else
- scr->isupamem = 1;
-
- return aperture;
- }
-
static void
t2r4enable(VGAscr* scr)
{
Pcidev *p;
- int size, align;
- ulong aperture, mmio;
+ void *mmio;
- /*
- * Only once, can't be disabled for now.
- * scr->mmio holds the virtual address of
- * the MMIO registers.
- */
if(scr->mmio)
return;
if(p = pcimatch(nil, 0x105D, 0)){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgat2r4.c:125,145 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgat2r4.c:74,90
}
else
return;
- mmio = upamalloc(p->mem[4].bar & ~0x0F, p->mem[4].size, 0);
- if(mmio == 0)
+ scr->pci = p;
+
+ mmio = vmap(p->mem[4].bar & ~0x0F, p->mem[4].size);
+ if(mmio == nil)
return;
- addvgaseg("t2r4mmio", mmio, p->mem[4].size);
+ addvgaseg("t2r4mmio", p->mem[4].bar & ~0x0F, p->mem[4].size);
- scr->mmio = KADDR(mmio);
-
- size = p->mem[0].size;
- align = 0;
- aperture = t2r4linear(scr, &size, &align);
- if(aperture){
- scr->aperture = aperture;
- scr->apsize = size;
- addvgaseg("t2r4screen", aperture, size);
- }
+ scr->mmio = mmio;
+ vgalinearpci(scr);
+ if(scr->paddr)
+ addvgaseg("t2r4screen", scr->paddr, scr->apsize);
}
static uchar
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgat2r4.c:571,577 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgat2r4.c:516,522
t2r4enable,
nil,
nil,
- t2r4linear,
+ nil,
t2r4drawinit,
};
[rsc] --rw-rw-r-- M 451989 glenda sys 4507 Nov 6 10:23 sys/src/9/pc/vgatvp3020.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgatvp3020.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgatvp3020.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
[rsc] --rw-rw-r-- M 451989 glenda sys 3956 Nov 6 10:23 sys/src/9/pc/vgatvp3026.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgatvp3026.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgatvp3026.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
[rsc] --rw-rw-r-- M 451989 glenda sys 5840 Nov 6 10:23 sys/src/9/pc/vgavmware.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgavmware.c:144,162 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgavmware.c:144,155
;
}
- static ulong
- vmwarelinear(VGAscr* scr, int* size, int* align)
+ static void
+ vmwarelinear(VGAscr* scr, int, int)
{
char err[64];
- ulong aperture, oaperture;
- int osize, oapsize, wasupamem;
Pcidev *p;
- osize = *size;
- oaperture = scr->aperture;
- oapsize = scr->apsize;
- wasupamem = scr->isupamem;
-
p = pcimatch(nil, PCIVMWARE, 0);
if(p == nil)
error("no vmware card found");
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgavmware.c:176,200 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgavmware.c:169,177
vm->rd = vm->ra + 1;
}
- aperture = (ulong)(vmrd(vm, Rfbstart));
- *size = vmrd(vm, Rfbsize);
-
- if(wasupamem)
- upafree(oaperture, oapsize);
- scr->isupamem = 0;
-
- aperture = upamalloc(aperture, *size, *align);
- if(aperture == 0){
- if(wasupamem && upamalloc(oaperture, oapsize, 0))
- scr->isupamem = 1;
- }else
- scr->isupamem = 1;
-
- if(oaperture && aperture != oaperture)
- print("warning (BUG): redefinition of aperture does not change vmwarescreen segment\n");
- addvgaseg("vmwarescreen", aperture, osize);
-
- return aperture;
+ vgalinearaddr(scr, vmrd(vm, Rfbstart), vmrd(vm, Rfbsize));
+ if(scr->apsize)
+ addvgaseg("vmwarescreen", scr->paddr, scr->apsize);
}
static void
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgavmware.c:341,351 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgavmware.c:318,328
if(mmiobase == 0)
return;
mmiosize = vmrd(vm, Rmemsize);
- scr->mmio = KADDR(upamalloc(mmiobase, mmiosize, 0));
- vm->mmio = scr->mmio;
- vm->mmiosize = mmiosize;
+ scr->mmio = vmap(mmiobase, mmiosize);
if(scr->mmio == nil)
return;
+ vm->mmio = scr->mmio;
+ vm->mmiosize = mmiosize;
addvgaseg("vmwaremmio", mmiobase, mmiosize);
}
[rsc] --rw-rw-r-- M 451989 glenda sys 1671 Nov 6 10:23 sys/src/9/pc/vgax.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/vgax.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/vgax.c:3,9
#include "mem.h"
#include "dat.h"
#include "fns.h"
+ #include "io.h"
#include "../port/error.h"
#define Image IMAGE
[rsc] --rw-rw-r-- M 451989 glenda sys 8219 Nov 6 10:11 sys/src/9/port/dev.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/dev.c:157,163 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/dev.c:157,162
nc->qid = c->qid;
nc->offset = c->offset;
nc->umh = nil;
- nc->mountid = c->mountid;
nc->aux = c->aux;
nc->mqid = c->mqid;
nc->mcp = c->mcp;
[rsc] --rw-rw-r-- M 451989 glenda sys 43537 Nov 6 10:11 sys/src/9/port/devdraw.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:16,21 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:16,22
{
Qtopdir = 0,
Qnew,
+ Qwinname,
Q3rd,
Q2nd,
Qcolormap,
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:53,59 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:54,59
struct Draw
{
- QLock;
int clientid;
int nclient;
Client** client;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:154,161 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:154,166
};
static Draw sdraw;
+ QLock drawlock;
+
static Memimage *screenimage;
- static Memdata screendata;
+ static DImage* screendimage;
+ static char screenname[40];
+ static int screennameid;
+
static Rectangle flushrect;
static int waste;
static DScreen* dscreen;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:164,169 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:169,175
void drawuninstall(Client*, int);
void drawfreedimage(DImage*);
Client* drawclientofpath(ulong);
+ DImage* allocdimage(Memimage*);
static char Enodrawimage[] = "unknown id for draw image";
static char Enodrawscreen[] = "unknown id for draw screen";
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:184,190 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:190,214
static char Enamed[] = "image already has name";
static char Ewrongname[] = "wrong name for image";
+ static void
+ dlock(void)
+ {
+ qlock(&drawlock);
+ }
+
static int
+ candlock(void)
+ {
+ return canqlock(&drawlock);
+ }
+
+ static void
+ dunlock(void)
+ {
+ qunlock(&drawlock);
+ }
+
+ static int
drawgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp)
{
int t;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:226,231 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:250,259
mkqid(&q, Q2nd, 0, QTDIR);
devdir(c, q, "draw", 0, eve, 0555, dp);
break;
+ case 1:
+ mkqid(&q, Qwinname, 0, 0);
+ devdir(c, q, "winname", 0, eve, 0444, dp);
+ break;
default:
return -1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:498,505 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:526,533
return 0;
}
- Memimage*
- drawinstall(Client *client, int id, Memimage *i, DScreen *dscreen)
+ DImage*
+ allocdimage(Memimage *i)
{
DImage *d;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:506,512 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:534,539
d = malloc(sizeof(DImage));
if(d == 0)
return 0;
- d->id = id;
d->ref = 1;
d->name = 0;
d->vers = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:514,519 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:541,558
d->nfchar = 0;
d->fchar = 0;
d->fromname = 0;
+ return d;
+ }
+
+ Memimage*
+ drawinstall(Client *client, int id, Memimage *i, DScreen *dscreen)
+ {
+ DImage *d;
+
+ d = allocdimage(i);
+ if(d == 0)
+ return 0;
+ d->id = id;
d->dscreen = dscreen;
d->next = client->dimage[id&HASHMASK];
client->dimage[id&HASHMASK] = d;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:637,644 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:676,683
drawfreedimage(dimage->fromname);
goto Return;
}
- if(dimage->image == screenimage) /* don't free the display */
- goto Return;
+ // if(dimage->image == screenimage) /* don't free the display */
+ // goto Return;
ds = dimage->dscreen;
if(ds){
l = dimage->image;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:856,885 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:895,954
return p;
}
- static int
- initscreenimage(void)
+ static DImage*
+ makescreenimage(void)
{
int width, depth;
ulong chan;
+ DImage *di;
+ Memdata *md;
+ Memimage *i;
Rectangle r;
+ md = malloc(sizeof *md);
+ if(md == nil)
+ return nil;
+ md->allocd = 1;
+ md->base = nil;
+ md->bdata = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen);
+ if(md->bdata == nil){
+ free(md);
+ return nil;
+ }
+ md->ref = 1;
+ i = allocmemimaged(r, chan, md);
+ if(i == nil){
+ free(md);
+ return nil;
+ }
+ i->width = width;
+ i->clipr = r;
+
+ di = allocdimage(i);
+ if(di == nil){
+ freememimage(i); /* frees md */
+ return nil;
+ }
+ if(!waserror()){
+ snprint(screenname, sizeof screenname, "noborder.screen.%d", ++screennameid);
+ drawaddname(nil, di, strlen(screenname), screenname);
+ poperror();
+ }
+ return di;
+ }
+
+ static int
+ initscreenimage(void)
+ {
if(screenimage != nil)
return 1;
- screendata.base = nil;
- screendata.bdata = attachscreen(&r, &chan, &depth, &width, &sdraw.softscreen);
- if(screendata.bdata == nil)
+ screendimage = makescreenimage();
+ if(screendimage == nil)
return 0;
- screendata.ref = 1;
-
- screenimage = allocmemimaged(r, chan, &screendata);
- if(screenimage == nil){
- /* RSC: BUG: detach screen */
- return 0;
- }
-
- screenimage->width = width;
- screenimage->clipr = r;
+ screenimage = screendimage->image;
+ // iprint("initscreenimage %p %p\n", screendimage, screenimage);
+ mouseresize();
return 1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:886,908 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:955,990
void
deletescreenimage(void)
{
- qlock(&sdraw);
- /* RSC: BUG: detach screen */
- if(screenimage)
- freememimage(screenimage);
- screenimage = nil;
- qunlock(&sdraw);
+ dlock();
+ if(screenimage){
+ /* will be freed via screendimage; disable */
+ screenimage->clipr = ZR;
+ screenimage = nil;
+ }
+ if(screendimage){
+ drawfreedimage(screendimage);
+ screendimage = nil;
+ }
+ dunlock();
}
+ void
+ resetscreenimage(void)
+ {
+ dlock();
+ initscreenimage();
+ dunlock();
+ }
+
static Chan*
drawattach(char *spec)
{
- qlock(&sdraw);
+ dlock();
if(!initscreenimage()){
- qunlock(&sdraw);
+ dunlock();
error("no frame buffer");
}
- qunlock(&sdraw);
+ dunlock();
return devattach('i', spec);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:909,915 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:991,997
static Walkqid*
drawwalk(Chan *c, Chan *nc, char **name, int nname)
{
- if(screendata.bdata == nil)
+ if(screenimage == nil)
error("no frame buffer");
return devwalk(c, nc, name, nname, 0, 0, drawgen);
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:924,929 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1006,1013
drawopen(Chan *c, int omode)
{
Client *cl;
+ DName *dn;
+ DImage *di;
if(c->qid.type & QTDIR){
c = devopen(c, omode, 0, 0, drawgen);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:930,938 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1014,1022
c->iounit = IOUNIT;
}
- qlock(&sdraw);
+ dlock();
if(waserror()){
- qunlock(&sdraw);
+ dunlock();
nexterror();
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:944,949 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1028,1036
}
switch(QID(c->qid)){
+ case Qwinname:
+ break;
+
case Qnew:
break;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:953,961 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1040,1061
error(Einuse);
cl->busy = 1;
flushrect = Rect(10000, 10000, -10000, -10000);
- drawinstall(cl, 0, screenimage, 0);
+ dn = drawlookupname(strlen(screenname), screenname);
+ if(dn == 0)
+ error("draw: cannot happen 2");
+ if(drawinstall(cl, 0, dn->dimage->image, 0) == 0)
+ error(Edrawmem);
+ di = drawlookup(cl, 0, 0);
+ if(di == 0)
+ error("draw: cannot happen 1");
+ di->vers = dn->vers;
+ di->name = smalloc(strlen(screenname)+1);
+ strcpy(di->name, screenname);
+ di->fromname = dn->dimage;
+ di->fromname->ref++;
incref(&cl->r);
break;
+
case Qcolormap:
case Qdata:
case Qrefresh:
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:963,969 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1063,1069
incref(&cl->r);
break;
}
- qunlock(&sdraw);
+ dunlock();
poperror();
c->mode = openmode(omode);
c->flag |= COPEN;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:982,990 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1082,1090
if(QID(c->qid) < Qcolormap) /* Qtopdir, Qnew, Q3rd, Q2nd have no client */
return;
- qlock(&sdraw);
+ dlock();
if(waserror()){
- qunlock(&sdraw);
+ dunlock();
nexterror();
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:1017,1023 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1117,1123
drawflush(); /* to erase visible, now dead windows */
free(cl);
}
- qunlock(&sdraw);
+ dunlock();
poperror();
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:1036,1045 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1136,1148
if(c->qid.type & QTDIR)
return devdirread(c, a, n, 0, 0, drawgen);
+ if(QID(c->qid) == Qwinname)
+ return readstr(off, a, n, screenname);
+
cl = drawclient(c);
- qlock(&sdraw);
+ dlock();
if(waserror()){
- qunlock(&sdraw);
+ dunlock();
nexterror();
}
switch(QID(c->qid)){
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:1096,1109 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1199,1212
for(;;){
if(cl->refreshme || cl->refresh)
break;
- qunlock(&sdraw);
+ dunlock();
if(waserror()){
- qlock(&sdraw); /* restore lock for waserror() above */
+ dlock(); /* restore lock for waserror() above */
nexterror();
}
sleep(&cl->refrend, drawrefactive, cl);
poperror();
- qlock(&sdraw);
+ dlock();
}
p = a;
while(cl->refresh && n>=5*4){
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:1120,1127 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1223,1231
}
cl->refreshme = 0;
n = p-(uchar*)a;
+ break;
}
- qunlock(&sdraw);
+ dunlock();
poperror();
return n;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:1149,1158 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1253,1262
if(c->qid.type & QTDIR)
error(Eisdir);
cl = drawclient(c);
- qlock(&sdraw);
+ dlock();
if(waserror()){
drawwakeall();
- qunlock(&sdraw);
+ dunlock();
nexterror();
}
switch(QID(c->qid)){
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:1206,1212 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:1310,1316
default:
error(Ebadusefd);
}
- qunlock(&sdraw);
+ dunlock();
poperror();
return n;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:2022,2031 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:2126,2135
if(blank == sdraw.blanked)
return;
- if(!canqlock(&sdraw))
+ if(!candlock())
return;
if(!initscreenimage()){
- qunlock(&sdraw);
+ dunlock();
return;
}
p = sdraw.savemap;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devdraw.c:2048,2054 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devdraw.c:2152,2158
}
}
sdraw.blanked = blank;
- qunlock(&sdraw);
+ dunlock();
}
/*
[rsc] --rw-rw-r-- M 451989 glenda sys 28233 Nov 6 10:11 sys/src/9/port/devproc.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devproc.c:669,686 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devproc.c:669,688
static long
procread(Chan *c, void *va, long n, vlong off)
{
- int m, navail, ne;
+ char *a, flag[10], *sps, *srv, statbuf[NSEG*32];
+ int i, j, m, navail, ne, pid, rsize;
long l;
- Proc *p;
- Waitq *wq;
- Ureg kur;
uchar *rptr;
+ ulong offset;
+ Confmem *cm;
Mntwalk *mw;
+ Proc *p;
Segment *sg, *s;
- char *a = va, *sps;
- int i, j, rsize, pid;
- char statbuf[NSEG*32], *srv, flag[10];
- ulong offset = off;
+ Ureg kur;
+ Waitq *wq;
+
+ a = va;
+ offset = off;
if(c->qid.type & QTDIR)
return devdirread(c, a, n, 0, 0, procgen);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devproc.c:723,730 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devproc.c:725,731
return n;
case Qmem:
- if(offset < KZERO
- || (offset >= USTKTOP-USTKSIZE && offset < USTKTOP))
+ if(offset < KZERO)
return procctlmemio(p, offset, n, va, 1);
if(!iseve())
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devproc.c:737,754 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devproc.c:738,751
memmove(a, (char*)offset, n);
return n;
}
- /* conf.base* and conf.npage* are set by xinit to refer to kernel allocation, not user pages */
- if(offset >= conf.base0 && offset < conf.npage0){
- if(offset+n > conf.npage0)
- n = conf.npage0 - offset;
- memmove(a, (char*)offset, n);
- return n;
- }
- if(offset >= conf.base1 && offset < conf.npage1){
- if(offset+n > conf.npage1)
- n = conf.npage1 - offset;
- memmove(a, (char*)offset, n);
- return n;
+ for(i=0; i<nelem(conf.mem); i++){
+ cm = &conf.mem[i];
+ if(cm->kbase <= offset && offset < cm->klimit){
+ if(offset+n > cm->klimit)
+ n = cm->klimit - offset;
+ memmove(a, (char*)offset, n);
+ return n;
+ }
}
error(Ebadarg);
[rsc] --rw-rw-r-- M 451989 glenda sys 30798 Nov 6 10:11 sys/src/9/port/devsd.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:15,29 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:15,29
extern Dev sddevtab;
extern SDifc* sdifc[];
- typedef struct SDevgrp {
- SDev* dev;
- int nunits; /* num units in dev */
- } SDevgrp;
+ static char Echange[] = "media or partition has changed";
- static SDevgrp* devs; /* all devices */
- static QLock devslock; /* insertion and removal of devices */
- static int ndevs; /* total number of devices in the system */
+ static char devletters[] = "0123456789"
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ static SDev *devs[sizeof devletters-1];
+ static QLock devslock;
+
enum {
Rawcmd,
Rawdata,
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:33,40 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:33,39
enum {
Qtopdir = 1, /* top level directory */
Qtopbase,
- Qtopctl = Qtopbase,
- Qtopstat,
+ Qtopctl = Qtopbase,
Qunitdir, /* directory per unit */
Qunitbase,
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:59,66 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:58,65
DevLOG = 8,
NDev = (1 << DevLOG),
- DevMASK = (NDev-1),
- DevSHIFT = (UnitLOG+PartLOG+TypeLOG),
+ DevMASK = (NDev-1),
+ DevSHIFT = (UnitLOG+PartLOG+TypeLOG),
Ncmd = 20,
};
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:221,226 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:220,236
return 1;
}
+ static int
+ sdindex(int idno)
+ {
+ char *p;
+
+ p = strchr(devletters, idno);
+ if(p == nil)
+ return -1;
+ return p-devletters;
+ }
+
static SDev*
sdgetdev(int idno)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:227,243 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:237,248
SDev *sdev;
int i;
+ if((i = sdindex(idno)) < 0)
+ return nil;
+
qlock(&devslock);
- for(i = 0; i != ndevs; i++)
- if(devs[i].dev->idno == idno)
- break;
-
- if(i == ndevs)
- sdev = nil;
- else{
- sdev = devs[i].dev;
+ if(sdev = devs[i])
incref(&sdev->r);
- }
qunlock(&devslock);
return sdev;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:307,374 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:312,370
sdreset(void)
{
int i;
- SDev *sdev, *tail, *sdlist;
+ SDev *sdev;
/*
- * Probe all configured controllers and make a list
- * of devices found, accumulating a possible maximum number
- * of units attached and marking each device with an index
- * into the linear top-level directory array of units.
+ * Probe all known controller types and register any devices found.
*/
- tail = sdlist = nil;
for(i = 0; sdifc[i] != nil; i++){
if(sdifc[i]->pnp == nil || (sdev = sdifc[i]->pnp()) == nil)
continue;
- if(sdlist != nil)
- tail->next = sdev;
- else
- sdlist = sdev;
- for(tail = sdev; tail->next != nil; tail = tail->next){
- tail->unit = (SDunit**)malloc(tail->nunit * sizeof(SDunit*));
- tail->unitflg = (int*)malloc(tail->nunit * sizeof(int));
- assert(tail->unit && tail->unitflg);
- ndevs++;
- }
- tail->unit = (SDunit**)malloc(tail->nunit * sizeof(SDunit*));
- tail->unitflg = (int*)malloc(tail->nunit * sizeof(int));
- ndevs++;
+ sdadddevs(sdev);
}
-
- /*
- * Legacy and option code goes here. This will be hard...
- */
+ }
- /*
- * The maximum number of possible units is known, allocate
- * placeholders for their datastructures; the units will be
- * probed and structures allocated when attached.
- * Allocate controller names for the different types.
- */
- if(ndevs == 0)
- return;
- for(i = 0; sdifc[i] != nil; i++){
- /*
- * BUG: no check is made here or later when a
- * unit is attached that the id and name are set.
- */
- if(sdifc[i]->id)
- sdifc[i]->id(sdlist);
+ void
+ sdadddevs(SDev *sdev)
+ {
+ int i, j, id;
+ SDev *next;
+
+ for(; sdev; sdev=next){
+ next = sdev->next;
+
+ sdev->unit = (SDunit**)malloc(sdev->nunit * sizeof(SDunit*));
+ sdev->unitflg = (int*)malloc(sdev->nunit * sizeof(int));
+ if(sdev->unit == nil || sdev->unitflg == nil){
+ print("sdadddevs: out of memory\n");
+ giveup:
+ free(sdev->unit);
+ free(sdev->unitflg);
+ if(sdev->ifc->clear)
+ sdev->ifc->clear(sdev);
+ free(sdev);
+ continue;
+ }
+ id = sdindex(sdev->idno);
+ if(id == -1){
+ print("sdadddevs: bad id number %d (%C)\n", id, id);
+ goto giveup;
+ }
+ qlock(&devslock);
+ for(i=0; i<nelem(devs); i++){
+ if(devs[j = (id+i)%nelem(devs)] == nil){
+ sdev->idno = devletters[j];
+ devs[j] = sdev;
+ snprint(sdev->name, sizeof sdev->name, "sd%c", devletters[j]);
+ break;
+ }
+ }
+ qunlock(&devslock);
+ if(i == nelem(devs)){
+ print("sdadddevs: out of device letters\n");
+ goto giveup;
+ }
}
-
- /*
- * The IDs have been set, unlink the sdlist and copy the spec to
- * the devtab.
- */
- devs = (SDevgrp*)malloc(ndevs * sizeof(SDevgrp));
- memset(devs, 0, ndevs * sizeof(SDevgrp));
- i = 0;
- while(sdlist != nil){
- devs[i].dev = sdlist;
- devs[i].nunits = sdlist->nunit;
- sdlist = sdlist->next;
- devs[i].dev->next = nil;
- i++;
- }
}
static int
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:438,447 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:434,439
mkqid(&q, QID(0, 0, 0, Qtopctl), 0, QTFILE);
devdir(c, q, "sdctl", 0, eve, 0640, dp);
return 1;
- case Qtopstat:
- mkqid(&q, QID(0, 0, 0, Qtopstat), 0, QTFILE);
- devdir(c, q, "sdstat", 0, eve, 0640, dp);
- return 1;
}
return -1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:465,488 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:457,482
return 1;
}
- if(s == 0 || s == 1)
- return sd1gen(c, s + Qtopbase, dp);
- s -= 2;
+ if(s+Qtopbase < Qunitdir)
+ return sd1gen(c, s+Qtopbase, dp);
+ s -= (Qunitdir-Qtopbase);
qlock(&devslock);
- for(i = 0; i != ndevs; i++){
- if(s < devs[i].nunits)
- break;
- s -= devs[i].nunits;
+ for(i=0; i<nelem(devs); i++){
+ if(devs[i]){
+ if(s < devs[i]->nunit)
+ break;
+ s -= devs[i]->nunit;
+ }
}
- if(i == ndevs){
- /* Run of the end of the list */
+ if(i == nelem(devs)){
+ /* Run off the end of the list */
qunlock(&devslock);
return -1;
}
- if((sdev = devs[i].dev) == nil){
+ if((sdev = devs[i]) == nil){
qunlock(&devslock);
return 0;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:572,578 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:566,571
decref(&sdev->r);
return r;
case Qtopctl:
- case Qtopstat:
return sd1gen(c, TYPE(c->qid), dp);
default:
break;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:587,595 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:580,588
Chan *c;
char *p;
SDev *sdev;
- int idno, subno, i;
+ int idno, subno;
- if(ndevs == 0 || *spec == '\0'){
+ if(*spec == '\0'){
c = devattach(sddevtab.dc, spec);
mkqid(&c->qid, QID(0, 0, 0, Qtopdir), 0, QTDIR);
return c;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:602,618 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:595,606
if(p == &spec[3])
error(Ebadspec);
- qlock(&devslock);
- for (sdev = nil, i = 0; i != ndevs; i++)
- if((sdev = devs[i].dev) != nil && sdev->idno == idno)
- break;
-
- if(i == ndevs || subno >= sdev->nunit || sdgetunit(sdev, subno) == nil){
- qunlock(&devslock);
+ if((sdev=sdgetdev(idno)) == nil)
error(Enonexist);
+ if(sdgetunit(sdev, subno) == nil){
+ decref(&sdev->r);
+ error(Enonexist);
}
- incref(&sdev->r);
- qunlock(&devslock);
c = devattach(sddevtab.dc, spec);
mkqid(&c->qid, QID(sdev->idno, subno, 0, Qunitdir), 0, QTDIR);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:738,744 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:726,732
}
pp = &unit->part[PART(c->qid)];
if(unit->vers+pp->vers != c->qid.vers)
- error(Eio);
+ error(Echange);
/*
* Check the request is within bounds.
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:867,872 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:855,1049
return r->rlen;
}
+ /*
+ * SCSI simulation for non-SCSI devices
+ */
+ int
+ sdsetsense(SDreq *r, int status, int key, int asc, int ascq)
+ {
+ int len;
+ SDunit *unit;
+
+ unit = r->unit;
+ unit->sense[2] = key;
+ unit->sense[12] = asc;
+ unit->sense[13] = ascq;
+
+ if(status == SDcheck && !(r->flags & SDnosense)){
+ /* request sense case from sdfakescsi */
+ len = sizeof unit->sense;
+ if(len > sizeof r->sense-1)
+ len = sizeof r->sense-1;
+ memmove(r->sense, unit->sense, len);
+ unit->sense[2] = 0;
+ unit->sense[12] = 0;
+ unit->sense[13] = 0;
+ r->flags |= SDvalidsense;
+ return SDok;
+ }
+ return status;
+ }
+
+ int
+ sdmodesense(SDreq *r, uchar *cmd, void *info, int ilen)
+ {
+ int len;
+ uchar *data;
+
+ /*
+ * Fake a vendor-specific request with page code 0,
+ * return the drive info.
+ */
+ if((cmd[2] & 0x3F) != 0 && (cmd[2] & 0x3F) != 0x3F)
+ return sdsetsense(r, SDcheck, 0x05, 0x24, 0);
+ len = (cmd[7]<<8)|cmd[8];
+ if(len == 0)
+ return SDok;
+ if(len < 8+ilen)
+ return sdsetsense(r, SDcheck, 0x05, 0x1A, 0);
+ if(r->data == nil || r->dlen < len)
+ return sdsetsense(r, SDcheck, 0x05, 0x20, 1);
+ data = r->data;
+ memset(data, 0, 8);
+ data[0] = ilen>>8;
+ data[1] = ilen;
+ if(ilen)
+ memmove(data+8, info, ilen);
+ r->rlen = 8+ilen;
+ return sdsetsense(r, SDok, 0, 0, 0);
+ }
+
+ int
+ sdfakescsi(SDreq *r, void *info, int ilen)
+ {
+ uchar *cmd, *p;
+ uvlong len;
+ SDunit *unit;
+
+ cmd = r->cmd;
+ r->rlen = 0;
+ unit = r->unit;
+
+ /*
+ * Rewrite read(6)/write(6) into read(10)/write(10).
+ */
+ switch(cmd[0]){
+ case 0x08: /* read */
+ case 0x0A: /* write */
+ cmd[9] = 0;
+ cmd[8] = cmd[4];
+ cmd[7] = 0;
+ cmd[6] = 0;
+ cmd[5] = cmd[3];
+ cmd[4] = cmd[2];
+ cmd[3] = cmd[1] & 0x0F;
+ cmd[2] = 0;
+ cmd[1] &= 0xE0;
+ cmd[0] |= 0x20;
+ break;
+ }
+
+ /*
+ * Map SCSI commands into ATA commands for discs.
+ * Fail any command with a LUN except INQUIRY which
+ * will return 'logical unit not supported'.
+ */
+ if((cmd[1]>>5) && cmd[0] != 0x12)
+ return sdsetsense(r, SDcheck, 0x05, 0x25, 0);
+
+ switch(cmd[0]){
+ default:
+ return sdsetsense(r, SDcheck, 0x05, 0x20, 0);
+
+ case 0x00: /* test unit ready */
+ return sdsetsense(r, SDok, 0, 0, 0);
+
+ case 0x03: /* request sense */
+ if(cmd[4] < sizeof unit->sense)
+ len = cmd[4];
+ else
+ len = sizeof unit->sense;
+ if(r->data && r->dlen >= len){
+ memmove(r->data, unit->sense, len);
+ r->rlen = len;
+ }
+ return sdsetsense(r, SDok, 0, 0, 0);
+
+ case 0x12: /* inquiry */
+ if(cmd[4] < sizeof unit->inquiry)
+ len = cmd[4];
+ else
+ len = sizeof unit->inquiry;
+ if(r->data && r->dlen >= len){
+ memmove(r->data, r->sense, len);
+ r->rlen = len;
+ }
+ return sdsetsense(r, SDok, 0, 0, 0);
+
+ case 0x1B: /* start/stop unit */
+ /*
+ * nop for now, can use power management later.
+ */
+ return sdsetsense(r, SDok, 0, 0, 0);
+
+ case 0x25: /* read capacity */
+ if((cmd[1] & 0x01) || cmd[2] || cmd[3])
+ return sdsetsense(r, SDcheck, 0x05, 0x24, 0);
+ if(r->data == nil || r->dlen < 8)
+ return sdsetsense(r, SDcheck, 0x05, 0x20, 1);
+
+ /*
+ * Read capacity returns the LBA of the last sector.
+ */
+ len = unit->sectors - 1;
+ p = r->data;
+ *p++ = len>>24;
+ *p++ = len>>16;
+ *p++ = len>>8;
+ *p++ = len;
+ len = 512;
+ *p++ = len>>24;
+ *p++ = len>>16;
+ *p++ = len>>8;
+ *p++ = len;
+ r->rlen = p - (uchar*)r->data;
+ return sdsetsense(r, SDok, 0, 0, 0);
+
+ case 0x9E: /* long read capacity */
+ if((cmd[1] & 0x01) || cmd[2] || cmd[3])
+ return sdsetsense(r, SDcheck, 0x05, 0x24, 0);
+ if(r->data == nil || r->dlen < 8)
+ return sdsetsense(r, SDcheck, 0x05, 0x20, 1);
+ /*
+ * Read capcity returns the LBA of the last sector.
+ */
+ len = unit->sectors - 1;
+ p = r->data;
+ *p++ = len>>56;
+ *p++ = len>>48;
+ *p++ = len>>40;
+ *p++ = len>>32;
+ *p++ = len>>24;
+ *p++ = len>>16;
+ *p++ = len>>8;
+ *p++ = len;
+ len = 512;
+ *p++ = len>>24;
+ *p++ = len>>16;
+ *p++ = len>>8;
+ *p++ = len;
+ r->rlen = p - (uchar*)r->data;
+ return sdsetsense(r, SDok, 0, 0, 0);
+
+ case 0x5A: /* mode sense */
+ return sdmodesense(r, cmd, info, ilen);
+
+ case 0x28: /* read */
+ case 0x2A: /* write */
+ return SDnostatus;
+ }
+ }
+
static long
sdread(Chan *c, void *a, long n, vlong off)
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:875,898 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:1052,1073
SDunit *unit;
SDev *sdev;
ulong offset;
- int i, l, status;
+ int i, l, m, status;
offset = off;
switch(TYPE(c->qid)){
default:
error(Eperm);
- case Qtopstat:
- p = buf = malloc(READSTR);
+ case Qtopctl:
+ m = 64*1024; /* room for register dumps */
+ p = buf = malloc(m);
assert(p);
- e = p + READSTR;
+ e = p + m;
qlock(&devslock);
- for(i = 0; i != ndevs; i++){
- SDev *sdev = devs[i].dev;
-
- if(sdev->ifc->stat)
- p = sdev->ifc->stat(sdev, p, e);
- else
- p = seprint(e, "%s; no statistics available\n", sdev->name);
+ for(i = 0; i < nelem(devs); i++){
+ sdev = devs[i];
+ if(sdev && sdev->ifc->rtopctl)
+ p = sdev->ifc->rtopctl(sdev, p, e);
}
qunlock(&devslock);
n = readstr(off, a, n, buf);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:909,916 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:1084,1092
error(Enonexist);
unit = sdev->unit[UNIT(c->qid)];
- p = malloc(READSTR);
- l = snprint(p, READSTR, "inquiry %.48s\n",
+ m = 16*1024; /* room for register dumps */
+ p = malloc(m);
+ l = snprint(p, m, "inquiry %.48s\n",
(char*)unit->inquiry+8);
qlock(&unit->ctl);
/*
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:919,936 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:1095,1112
* and the garscadden trains.
*/
if(unit->dev->ifc->rctl)
- l += unit->dev->ifc->rctl(unit, p+l, READSTR-l);
+ l += unit->dev->ifc->rctl(unit, p+l, m-l);
if(unit->sectors == 0)
sdinitpart(unit);
if(unit->sectors){
if(unit->dev->ifc->rctl == nil)
- l += snprint(p+l, READSTR-l,
+ l += snprint(p+l, m-l,
"geometry %ld %ld\n",
unit->sectors, unit->secsize);
pp = unit->part;
for(i = 0; i < unit->npart; i++){
if(pp->valid)
- l += snprint(p+l, READSTR-l,
+ l += snprint(p+l, m-l,
"part %s %lud %lud\n",
pp->name, pp->start, pp->end);
pp++;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:978,1142 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:1154,1227
return 0;
}
- typedef struct Confdata Confdata;
- struct Confdata {
- int on;
- char* spec;
- DevConf cf;
- };
+ static void legacytopctl(Cmdbuf*);
- static void
- parseswitch(Confdata* cd, char* option)
- {
- if(!strcmp("on", option))
- cd->on = 1;
- else if(!strcmp("off", option))
- cd->on = 0;
- else
- error(Ebadarg);
- }
-
- static void
- parsespec(Confdata* cd, char* option)
- {
- if(strlen(option) > 1)
- error(Ebadarg);
- cd->spec = option;
- }
-
- static Devport*
- getnewport(DevConf* dc)
- {
- Devport *p;
-
- p = (Devport *)malloc((dc->nports + 1) * sizeof(Devport));
- if(dc->nports > 0){
- memmove(p, dc->ports, dc->nports * sizeof(Devport));
- free(dc->ports);
- }
- dc->ports = p;
- p = &dc->ports[dc->nports++];
- p->size = -1;
- p->port = (ulong)-1;
- return p;
- }
-
- static void
- parseport(Confdata* cd, char* option)
- {
- char *e;
- Devport *p;
-
- if(cd->cf.nports == 0 || cd->cf.ports[cd->cf.nports-1].port != (ulong)-1)
- p = getnewport(&cd->cf);
- else
- p = &cd->cf.ports[cd->cf.nports-1];
- p->port = strtol(option, &e, 0);
- if(e == nil || *e != '\0')
- error(Ebadarg);
- }
-
- static void
- parsesize(Confdata* cd, char* option)
- {
- char *e;
- Devport *p;
-
- if(cd->cf.nports == 0 || cd->cf.ports[cd->cf.nports-1].size != -1)
- p = getnewport(&cd->cf);
- else
- p = &cd->cf.ports[cd->cf.nports-1];
- p->size = (int)strtol(option, &e, 0);
- if(e == nil || *e != '\0')
- error(Ebadarg);
- }
-
- static void
- parseirq(Confdata* cd, char* option)
- {
- char *e;
-
- cd->cf.intnum = strtoul(option, &e, 0);
- if(e == nil || *e != '\0')
- error(Ebadarg);
- }
-
- static void
- parsetype(Confdata* cd, char* option)
- {
- cd->cf.type = option;
- }
-
- static struct {
- char *option;
- void (*parse)(Confdata*, char*);
- } options[] = {
- { "switch", parseswitch, },
- { "spec", parsespec, },
- { "port", parseport, },
- { "size", parsesize, },
- { "irq", parseirq, },
- { "type", parsetype, },
- };
-
static long
sdwrite(Chan* c, void* a, long n, vlong off)
{
+ char *f0;
+ int i;
+ ulong end, start;
Cmdbuf *cb;
+ SDifc *ifc;
SDreq *req;
SDunit *unit;
SDev *sdev;
- ulong end, start;
switch(TYPE(c->qid)){
default:
error(Eperm);
- case Qtopctl: {
- Confdata cd;
- char buf[256], *field[Ncmd];
- int nf, i, j;
-
- memset(&cd, 0, sizeof(Confdata));
- if(n > sizeof(buf)-1) n = sizeof(buf)-1;
- memmove(buf, a, n);
- buf[n] = '\0';
-
- cd.on = -1;
- cd.spec = '\0';
- memset(&cd.cf, 0, sizeof(DevConf));
-
- nf = tokenize(buf, field, Ncmd);
- for(i = 0; i < nf; i++){
- char *opt = field[i++];
- if(i >= nf)
- error(Ebadarg);
- for(j = 0; j != nelem(options); j++)
- if(!strcmp(opt, options[j].option))
- break;
-
- if(j == nelem(options))
- error(Ebadarg);
- options[j].parse(&cd, field[i]);
+ case Qtopctl:
+ cb = parsecmd(a, n);
+ if(waserror()){
+ free(cb);
+ nexterror();
}
-
- if(cd.on < 0)
- error(Ebadarg);
-
- if(cd.on){
- if(cd.spec == '\0' || cd.cf.nports == 0 ||
- cd.cf.intnum == 0 || cd.cf.type == nil)
- error(Ebadarg);
+ if(cb->nf == 0)
+ error("empty control message");
+ f0 = cb->f[0];
+ cb->f++;
+ cb->nf--;
+ if(strcmp(f0, "config") == 0){
+ /* wormhole into ugly legacy interface */
+ legacytopctl(cb);
+ poperror();
+ free(cb);
+ break;
}
- else{
- if(cd.spec == '\0')
- error(Ebadarg);
+ ifc = nil;
+ sdev = nil;
+ for(i=0; sdifc[i]; i++){
+ if(strcmp(sdifc[i]->name, f0) == 0){
+ ifc = sdifc[i];
+ sdev = nil;
+ goto subtopctl;
+ }
}
-
- if(sddevtab.config == nil)
- error("No configuration function");
- sddevtab.config(cd.on, cd.spec, &cd.cf);
+ if(f0[0]=='s' && f0[1]=='d' && f0[2] && f0[3] == 0){
+ if((sdev = sdgetdev(f0[2])) != nil){
+ ifc = sdev->ifc;
+ goto subtopctl;
+ }
+ }
+ error("unknown interface");
+
+ subtopctl:
+ if(waserror()){
+ if(sdev)
+ decref(&sdev->r);
+ nexterror();
+ }
+ if(ifc->wtopctl)
+ ifc->wtopctl(sdev, cb);
+ else
+ error(Ebadctl);
+ poperror();
+ poperror();
+ decref(&sdev->r);
+ free(cb);
break;
- }
+
case Qctl:
cb = parsecmd(a, n);
sdev = sdgetdev(DEV(c->qid));
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:1152,1158 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:1237,1243
nexterror();
}
if(unit->vers != c->qid.vers)
- error(Eio);
+ error(Echange);
if(cb->nf < 1)
error(Ebadctl);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:1293,1395 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:1378,1411
return n;
}
- static char
- getspec(char base)
- {
- while(1){
- int i;
- SDev *sdev;
-
- for(i = 0; i != ndevs; i++)
- if((sdev = devs[i].dev) != nil && (char)sdev->idno == base)
- break;
-
- if(i == ndevs)
- return base;
- base++;
- }
- return '\0';
- }
-
static int
configure(char* spec, DevConf* cf)
{
- ISAConf isa;
- SDevgrp *tmpdevs;
- SDev *tail, *sdev, *(*probe)(DevConf*);
- char *p, name[32];
- int i, nnew;
+ SDev *s, *sdev;
+ char *p;
+ int i;
+ if(sdindex(*spec) < 0)
+ error("bad sd spec");
+
if((p = strchr(cf->type, '/')) != nil)
*p++ = '\0';
for(i = 0; sdifc[i] != nil; i++)
- if(!strcmp(sdifc[i]->name, cf->type))
+ if(strcmp(sdifc[i]->name, cf->type) == 0)
break;
-
if(sdifc[i] == nil)
- error("type not found");
-
- if((probe = sdifc[i]->probe) == nil)
- error("No probe function");
+ error("sd type not found");
+ if(p)
+ *(p-1) = '/';
- if(p){
- /* Try to find the card on the ISA bus. This code really belongs
- in sdata and I'll move it later. Really! */
- memset(&isa, 0, sizeof(isa));
- isa.port = cf->ports[0].port;
- isa.irq = cf->intnum;
+ if(sdifc[i]->probe == nil)
+ error("sd type cannot probe");
- if(pcmspecial(p, &isa) < 0)
- error("Cannot find controller");
- }
-
- qlock(&devslock);
- if(waserror()){
- qunlock(&devslock);
- nexterror();
- }
-
- for(i = 0; i != ndevs; i++)
- if((sdev = devs[i].dev) != nil && sdev->idno == *spec)
- break;
- if(i != ndevs)
- error(Eexist);
-
- if((sdev = (*probe)(cf)) == nil)
- error("Cannot probe controller");
- poperror();
-
- nnew = 0;
- tail = sdev;
- while(tail){
- nnew++;
- tail = tail->next;
- }
-
- tmpdevs = (SDevgrp*)malloc((ndevs + nnew) * sizeof(SDevgrp));
- memmove(tmpdevs, devs, ndevs * sizeof(SDevgrp));
- free(devs);
- devs = tmpdevs;
-
- while(sdev){
- /* Assign `spec' to the device */
- *spec = getspec(*spec);
- snprint(name, sizeof(name), "sd%c", *spec);
- kstrdup(&sdev->name, name);
- sdev->idno = *spec;
- sdev->unit = (SDunit **)malloc(sdev->nunit * sizeof(SDunit*));
- sdev->unitflg = (int *)malloc(sdev->nunit * sizeof(int));
- assert(sdev->unit && sdev->unitflg);
-
- devs[ndevs].dev = sdev;
- devs[ndevs].nunits = sdev->nunit;
- sdev = sdev->next;
- devs[ndevs].dev->next = nil;
- ndevs++;
- }
-
- qunlock(&devslock);
+ sdev = sdifc[i]->probe(cf);
+ for(s=sdev; s; s=s->next)
+ s->idno = *spec;
+ sdadddevs(sdev);
return 0;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:1398,1444 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:1414,1451
{
int i;
SDev *sdev;
+ SDunit *unit;
+ if((i = sdindex(*spec)) < 0)
+ error(Enonexist);
+
qlock(&devslock);
- if(waserror()){
+ if((sdev = devs[i]) == nil){
qunlock(&devslock);
- nexterror();
- }
-
- sdev = nil;
- for(i = 0; i != ndevs; i++)
- if((sdev = devs[i].dev) != nil && sdev->idno == *spec)
- break;
-
- if(i == ndevs)
error(Enonexist);
-
- if(sdev->r.ref)
+ }
+ if(sdev->r.ref){
+ qunlock(&devslock);
error(Einuse);
-
+ }
+ devs[i] = nil;
+ qunlock(&devslock);
+
/* make sure no interrupts arrive anymore before removing resources */
if(sdev->enabled && sdev->ifc->disable)
sdev->ifc->disable(sdev);
- /* we're alone and the device tab is locked; make the device unavailable */
- memmove(&devs[i], &devs[ndevs - 1], sizeof(SDevgrp));
- memset(&devs[ndevs - 1], 0, sizeof(SDevgrp));
- ndevs--;
-
- qunlock(&devslock);
- poperror();
-
- for(i = 0; i != sdev->nunit; i++)
- if(sdev->unit[i]){
- SDunit *unit = sdev->unit[i];
-
+ for(i = 0; i != sdev->nunit; i++){
+ if(unit = sdev->unit[i]){
free(unit->name);
free(unit->user);
free(unit);
}
+ }
if(sdev->ifc->clear)
sdev->ifc->clear(sdev);
+ free(sdev);
return 0;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsd.c:1472,1474 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsd.c:1479,1617
devpower,
sdconfig,
};
+
+ /*
+ * This is wrong for so many reasons. This code must go.
+ */
+ typedef struct Confdata Confdata;
+ struct Confdata {
+ int on;
+ char* spec;
+ DevConf cf;
+ };
+
+ static void
+ parseswitch(Confdata* cd, char* option)
+ {
+ if(!strcmp("on", option))
+ cd->on = 1;
+ else if(!strcmp("off", option))
+ cd->on = 0;
+ else
+ error(Ebadarg);
+ }
+
+ static void
+ parsespec(Confdata* cd, char* option)
+ {
+ if(strlen(option) > 1)
+ error(Ebadarg);
+ cd->spec = option;
+ }
+
+ static Devport*
+ getnewport(DevConf* dc)
+ {
+ Devport *p;
+
+ p = (Devport *)malloc((dc->nports + 1) * sizeof(Devport));
+ if(dc->nports > 0){
+ memmove(p, dc->ports, dc->nports * sizeof(Devport));
+ free(dc->ports);
+ }
+ dc->ports = p;
+ p = &dc->ports[dc->nports++];
+ p->size = -1;
+ p->port = (ulong)-1;
+ return p;
+ }
+
+ static void
+ parseport(Confdata* cd, char* option)
+ {
+ char *e;
+ Devport *p;
+
+ if(cd->cf.nports == 0 || cd->cf.ports[cd->cf.nports-1].port != (ulong)-1)
+ p = getnewport(&cd->cf);
+ else
+ p = &cd->cf.ports[cd->cf.nports-1];
+ p->port = strtol(option, &e, 0);
+ if(e == nil || *e != '\0')
+ error(Ebadarg);
+ }
+
+ static void
+ parsesize(Confdata* cd, char* option)
+ {
+ char *e;
+ Devport *p;
+
+ if(cd->cf.nports == 0 || cd->cf.ports[cd->cf.nports-1].size != -1)
+ p = getnewport(&cd->cf);
+ else
+ p = &cd->cf.ports[cd->cf.nports-1];
+ p->size = (int)strtol(option, &e, 0);
+ if(e == nil || *e != '\0')
+ error(Ebadarg);
+ }
+
+ static void
+ parseirq(Confdata* cd, char* option)
+ {
+ char *e;
+
+ cd->cf.intnum = strtoul(option, &e, 0);
+ if(e == nil || *e != '\0')
+ error(Ebadarg);
+ }
+
+ static void
+ parsetype(Confdata* cd, char* option)
+ {
+ cd->cf.type = option;
+ }
+
+ static struct {
+ char *name;
+ void (*parse)(Confdata*, char*);
+ } options[] = {
+ "switch", parseswitch,
+ "spec", parsespec,
+ "port", parseport,
+ "size", parsesize,
+ "irq", parseirq,
+ "type", parsetype,
+ };
+
+ static void
+ legacytopctl(Cmdbuf *cb)
+ {
+ char *opt;
+ int i, j;
+ Confdata cd;
+
+ memset(&cd, 0, sizeof cd);
+ cd.on = -1;
+ for(i=0; i<cb->nf; i+=2){
+ if(i+2 > cb->nf)
+ error(Ebadarg);
+ opt = cb->f[i];
+ for(j=0; j<nelem(options); j++)
+ if(strcmp(opt, options[j].name) == 0){
+ options[j].parse(&cd, cb->f[i+1]);
+ break;
+ }
+ if(j == nelem(options))
+ error(Ebadarg);
+ }
+ if(cd.on < 0)
+ error(Ebadarg);
+ if(cd.on
+ && (cd.spec == 0 || cd.cf.nports == 0 || cd.cf.intnum == 0 || cd.cf.type == nil))
+ error(Ebadarg);
+ if(!cd.on && cd.spec == 0)
+ error(Ebadarg);
+ sdconfig(cd.on, cd.spec, &cd.cf);
+ }
+
[rsc] --rw-rw-r-- M 451989 glenda sys 9610 Nov 6 10:11 sys/src/9/port/devsegment.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/devsegment.c:486,492 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/devsegment.c:486,492
s = g->s;
if(s == nil)
error("global segment not assigned a virtual address");
- if(isoverlap(p, s->base, s->top) != nil)
+ if(isoverlap(p, s->base, s->top - s->base) != nil)
error("overlaps existing segment");
incref(s);
unlock(&globalseglock);
[rsc] --rw-rw-r-- M 451989 glenda sys 7271 Nov 6 10:11 sys/src/9/port/fault.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/fault.c:352,358 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/fault.c:352,358
return t;
a += m;
n -= m;
- if((a & KZERO) != KZERO)
+ if(a < KZERO)
validaddr(a, 1, 0);
}
[rsc] --rw-rw-r-- M 451989 glenda sys 6040 Nov 6 10:11 sys/src/9/port/lib.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/lib.h:1,6 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/lib.h:1,9
/*
* functions (possibly) linked in, complete, from libc.
*/
+ #define nelem(x) (sizeof(x)/sizeof((x)[0]))
+ #define offsetof(s, m) (ulong)(&(((s*)0)->m))
+ #define assert(x) if(x){}else _assert("x")
/*
* mem routines
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/lib.h:27,32 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/lib.h:30,37
extern char* strstr(char*, char*);
extern int atoi(char*);
extern int fullrune(char*, int);
+ extern int cistrcmp(char*, char*);
+ extern int cistrncmp(char*, char*, int);
enum
{
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/lib.h:103,108 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/lib.h:108,114
extern int getfields(char*, char**, int, int, char*);
extern int tokenize(char*, char**, int);
extern int dec64(uchar*, int, char*, int);
+ extern void qsort(void*, long, long, int (*)(void*, void*));
/*
* Syscall data structures
[rsc] --rw-rw-r-- M 451989 glenda sys 510 Nov 6 10:12 sys/src/9/port/master
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/master:40,45 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/master:40,46
s srv
t uart
v vga
+ w wd
y i82365
y pcmcia
z mntstats
[rsc] --rw-rw-r-- M 451989 glenda sys 8449 Nov 6 10:12 sys/src/9/port/page.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/page.c:12,22 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/page.c:12,27
void
pageinit(void)
{
- int color;
+ int color, i, j;
Page *p;
- ulong np, vm, pm;
+ Pallocmem *pm;
+ ulong m, np, k, vkb, pkb;
- np = palloc.np0+palloc.np1;
+ np = 0;
+ for(i=0; i<nelem(palloc.mem); i++){
+ pm = &palloc.mem[i];
+ np += pm->npage;
+ }
palloc.head = xalloc(np*sizeof(Page));
if(palloc.head == 0)
panic("pageinit");
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/page.c:23,65 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/page.c:28,66
color = 0;
p = palloc.head;
- while(palloc.np0 > 0) {
- p->prev = p-1;
- p->next = p+1;
- p->pa = palloc.p0;
- p->color = color;
- palloc.freecount++;
- color = (color+1)%NCOLOR;
- palloc.p0 += BY2PG;
- palloc.np0--;
- p++;
+ for(i=0; i<nelem(palloc.mem); i++){
+ pm = &palloc.mem[i];
+ for(j=0; j<pm->npage; j++){
+ p->prev = p-1;
+ p->next = p+1;
+ p->pa = pm->base+j*BY2PG;
+ p->color = color;
+ palloc.freecount++;
+ color = (color+1)%NCOLOR;
+ p++;
+ }
}
- while(palloc.np1 > 0) {
- p->prev = p-1;
- p->next = p+1;
- p->pa = palloc.p1;
- p->color = color;
- palloc.freecount++;
- color = (color+1)%NCOLOR;
- palloc.p1 += BY2PG;
- palloc.np1--;
- p++;
- }
palloc.tail = p - 1;
palloc.head->prev = 0;
palloc.tail->next = 0;
palloc.user = p - palloc.head;
- pm = palloc.user*BY2PG/1024;
- vm = pm + (conf.nswap*BY2PG)/1024;
+ pkb = palloc.user*BY2PG/1024;
+ vkb = pkb + (conf.nswap*BY2PG)/1024;
- /* Pageing numbers */
+ /* Paging numbers */
swapalloc.highwater = (palloc.user*5)/100;
swapalloc.headroom = swapalloc.highwater + (swapalloc.highwater/4);
- print("%lud free pages, ", palloc.user);
- print("%ludK bytes, ", pm);
- print("%ludK swap\n", vm);
+ m = 0;
+ for(i=0; i<nelem(conf.mem); i++)
+ if(conf.mem[i].npage)
+ m += conf.mem[i].npage*BY2PG;
+ k = PGROUND(end - (char*)KTZERO);
+ print("%ldM memory: ", (m+k+1024*1024-1)/(1024*1024));
+ print("%ldM kernel data, ", (m+k-pkb*1024+1024*1024-1)/(1024*1024));
+ print("%ldM user, ", pkb/1024);
+ print("%ldM swap\n", vkb/1024);
}
static void
[rsc] --rw-rw-r-- M 451989 glenda sys 22628 Nov 6 10:12 sys/src/9/port/portdat.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:3,9
typedef struct Chan Chan;
typedef struct Cmdbuf Cmdbuf;
typedef struct Cmdtab Cmdtab;
+ typedef struct Confmem Confmem;
typedef struct Dev Dev;
typedef struct Dirtab Dirtab;
typedef struct Edf Edf;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:23,28 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:24,30
typedef struct Page Page;
typedef struct Path Path;
typedef struct Palloc Palloc;
+ typedef struct Pallocmem Pallocmem;
typedef struct Perf Perf;
typedef struct PhysUart PhysUart;
typedef struct Pgrp Pgrp;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:176,182 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:178,183
int mrock;
QLock rockqlock;
int ismtpt;
- ulong mountid;
Mntcache*mcp; /* Mount cache pointer */
Mnt* mux; /* Mnt for clients using me for messages */
union {
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:480,490 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:481,496
DELTAFD = 20 /* incremental increase in Fgrp.fd's */
};
+ struct Pallocmem
+ {
+ ulong base;
+ ulong npage;
+ };
+
struct Palloc
{
Lock;
- ulong p0, p1; /* base of pages in bank 0/1 */
- ulong np0, np1; /* number of pages in bank 0/1 */
+ Pallocmem mem[4];
Page *head; /* most recently used */
Page *tail; /* least recently used */
ulong freecount; /* how many pages on free list now */
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:660,668 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:666,674
ulong pc; /* DEBUG only */
Lock rlock; /* sync sleep/wakeup with postnote */
- Rendez *r; /* rendezvous point slept on */
+ Rendez *r; /* rendezvous point slept on */
Rendez sleep; /* place for syssleep/debug */
- int notepending;/* note issued but not acted on */
+ int notepending; /* note issued but not acted on */
int kp; /* true if a kernel process */
Proc *palarm; /* Next alarm time */
ulong alarm; /* Time of call */
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:669,676 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:675,682
int newtlb; /* Pager has changed my pte's, I must flush */
int noswap; /* process is not swappable */
- ulong rendtag; /* Tag for rendezvous */
- ulong rendval; /* Value for rendezvous */
+ uintptr rendtag; /* Tag for rendezvous */
+ uintptr rendval; /* Value for rendezvous */
Proc *rendhash; /* Hash list for tag values */
Timer; /* For tsleep and real-time */
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:747,763 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:753,770
extern char* conffile;
extern int cpuserver;
extern Dev* devtab[];
- extern char* eve;
+ extern char* eve;
extern char hostdomain[];
extern uchar initcode[];
- extern Queue* kbdq;
- extern Queue* kprintoq;
- extern Ref noteidalloc;
+ extern int kbdbuttons;
+ extern Queue* kbdq;
+ extern Queue* kprintoq;
+ extern Ref noteidalloc;
+ extern int nsyscall;
extern Palloc palloc;
- extern Queue* serialoq;
+ extern Queue* serialoq;
extern char* statename[];
- extern Image swapimage;
- extern int nsyscall;
+ extern Image swapimage;
extern char* sysname;
extern Talarm talarm;
extern uint qiomaxatomic;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:943,949 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:950,956
#pragma varargck argpos snprint 3
#pragma varargck argpos sprint 2
#pragma varargck argpos fprint 2
- #pragma varargck argpos panic 1
+ #pragma varargck argpos panic 1
#pragma varargck type "lld" vlong
#pragma varargck type "llx" vlong
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portdat.h:972,975 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portdat.h:979,982
#pragma varargck type "M" uchar*
#pragma varargck type "p" void*
#pragma varargck type "q" char*
- #pragma varargck flag ','
+ #pragma varargck flag ','
[rsc] --rw-rw-r-- M 451989 glenda sys 10925 Nov 6 10:12 sys/src/9/port/portfns.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portfns.h:1,3 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portfns.h:1,4
+ void _assert(char*);
void accounttime(void);
Timer* addclock0link(void (*)(void), int);
int addphysseg(Physseg*);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portfns.h:8,15 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portfns.h:9,14
Block* allocb(int);
int anyhigher(void);
int anyready(void);
- #define assert(x) if(x){}else _assert("assert(x) failed")
- void _assert(char*);
Image* attachimage(int, Chan*, ulong, ulong);
Page* auxpage(void);
Block* bl2mem(uchar*, Block*, int);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portfns.h:176,181 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portfns.h:175,181
void mmuswitch(Proc*);
Chan* mntauth(Chan*, char*);
long mntversion(Chan*, char*, int, int);
+ void mouseresize(void);
void mountfree(Mount*);
ulong ms2tk(ulong);
ulong msize(void*);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portfns.h:185,191 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portfns.h:185,190
void muxclose(Mnt*);
Chan* namec(char*, int, int, ulong);
void nameerror(char*, char*);
- #define nelem(x) (sizeof(x)/sizeof(x[0]))
Chan* newchan(void);
int newfd(Chan*);
Mhead* newmhead(Chan*);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portfns.h:211,219 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portfns.h:210,215
void pathclose(Path*);
ulong perfticks(void);
void pexit(char*, int);
- int preempted(void);
- void printinit(void);
- int procindex(ulong);
void pgrpcpy(Pgrp*, Pgrp*);
void pgrpnote(ulong, char*, long, int);
void pio(Segment *, ulong, ulong, Page **);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/portfns.h:220,230 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/portfns.h:216,229
#define poperror() up->nerrlab--
int postnote(Proc*, int, char*, int);
int pprint(char*, ...);
+ int preempted(void);
void prflush(void);
+ void printinit(void);
ulong procalarm(ulong);
void procctl(Proc*);
void procdump(void);
int procfdprint(Chan*, int, int, char*, int);
+ int procindex(ulong);
void procinit0(void);
void procflushseg(Segment*);
void procpriority(Proc*, int, int);
[rsc] --rw-rw-r-- M 451989 glenda sys 28264 Nov 6 10:13 sys/src/9/port/proc.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/proc.c:113,125 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/proc.c:113,125
void
sched(void)
{
- int x[1];
Proc *p;
if(m->ilockdepth)
panic("ilockdepth %d, last lock 0x%p at 0x%lux, sched called from 0x%lux",
m->ilockdepth, up?up->lastilock:nil,
- (up && up->lastilock)?up->lastilock->pc:0, getcallerpc(x+3));
+ (up && up->lastilock)?up->lastilock->pc:0,
+ getcallerpc(&p+2));
if(up){
if(up->nlocks.ref && up->state != Moribund && up->delaysched < 20){
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/proc.c:688,695 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/proc.c:688,697
int i;
procalloc.free = xalloc(conf.nproc*sizeof(Proc));
- if(procalloc.free == nil)
- panic("cannot allocate %lud procs\n", conf.nproc);
+ if(procalloc.free == nil){
+ xsummary();
+ panic("cannot allocate %lud procs (%ludMB)\n", conf.nproc, conf.nproc*sizeof(Proc)/(1024*1024));
+ }
procalloc.arena = procalloc.free;
p = procalloc.free;
[rsc] --rw-rw-r-- M 451989 glenda sys 2494 Nov 6 10:13 sys/src/9/port/sd.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sd.h:26,31 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sd.h:26,32
SDev* dev;
int subno;
uchar inquiry[256]; /* format follows SCSI spec */
+ uchar sense[18]; /* format follows SCSI spec */
SDperm;
QLock ctl;
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sd.h:45,52 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sd.h:46,51
/*
* Each controller is represented by a SDev.
- * Each controller is responsible for allocating its unit structures.
- * Each controller has at least one unit.
*/
struct SDev {
Ref r; /* Number of callers using device */
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sd.h:53,59 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sd.h:52,58
SDifc* ifc; /* pnp/legacy */
void* ctlr;
int idno;
- char* name;
+ char name[8];
SDev* next;
QLock; /* enable/disable */
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sd.h:69,75 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sd.h:68,73
SDev* (*pnp)(void);
SDev* (*legacy)(int, int);
- SDev* (*id)(SDev*);
int (*enable)(SDev*);
int (*disable)(SDev*);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sd.h:82,88 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sd.h:80,87
long (*bio)(SDunit*, int, int, void*, long, long);
SDev* (*probe)(DevConf*);
void (*clear)(SDev*);
- char* (*stat)(SDev*, char*, char*);
+ char* (*rtopctl)(SDev*, char*, char*);
+ int (*wtopctl)(SDev*, Cmdbuf*);
};
struct SDreq {
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sd.h:124,129 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sd.h:123,134
#define sdmalloc(n) malloc(n)
#define sdfree(p) free(p)
+
+ /* devsd.c */
+ extern void sdadddevs(SDev*);
+ extern int sdsetsense(SDreq*, int, int, int, int);
+ extern int sdmodesense(SDreq*, uchar*, void*, int);
+ extern int sdfakescsi(SDreq*, void*, int);
/* sdscsi.c */
extern int scsiverify(SDunit*);
[rsc] --rw-rw-r-- M 451989 glenda sys 13722 Nov 6 12:35 sys/src/9/port/segment.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/segment.c:521,527 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/segment.c:521,527
pg = s->map[i]->pages[j];
/*
* We want to zero s->map[i]->page[j] and putpage(pg),
- * but we have to make sure other processors flush the entry
+ * but we have to make sure other processors flush the
* entry from their TLBs before the page is freed.
* We construct a list of the pages to be freed, zero
* the entries, then (below) call procflushseg, and call
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/segment.c:627,633 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/segment.c:627,633
Segment *s, *os;
Physseg *ps;
- if(va != 0 && (va&KZERO) == KZERO) /* BUG: Only ok for now */
+ if(va != 0 && va >= USTKTOP)
error(Ebadarg);
validaddr((ulong)name, 1, 0);
[rsc] --rw-rw-r-- M 451989 glenda sys 3928 Nov 6 10:13 sys/src/9/port/taslock.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/taslock.c:123,162 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/taslock.c:123,162
lockstats.locks++;
x = splhi();
- if(tas(&l->key) == 0){
- m->ilockdepth++;
- if(up)
- up->lastilock = l;
- l->sr = x;
- l->pc = pc;
- l->p = up;
- l->isilock = 1;
- return;
- }
-
- lockstats.glare++;
- if(conf.nmach < 2){
- dumplockmem("ilock:", l);
- panic("ilock: no way out: pc %luX\n", pc);
- }
-
- for(;;){
- lockstats.inglare++;
- splx(x);
- while(l->key)
- ;
- x = splhi();
- if(tas(&l->key) == 0){
- m->ilockdepth++;
- if(up)
- up->lastilock = l;
- l->sr = x;
- l->pc = pc;
- l->p = up;
- l->isilock = 1;
- return;
+ if(tas(&l->key) != 0){
+ lockstats.glare++;
+ /*
+ * Cannot also check l->pc and l->m here because
+ * they might just not be set yet, or the lock might
+ * even have been let go.
+ */
+ if(!l->isilock){
+ dumplockmem("ilock:", l);
+ panic("corrupt ilock %p pc=%luX m=%p isilock=%d",
+ l, l->pc, l->m, l->isilock);
}
+ if(l->m == MACHP(m->machno))
+ panic("ilock: deadlock on cpu%d pc=%luX lockpc=%luX\n",
+ m->machno, pc, l->pc);
+ for(;;){
+ lockstats.inglare++;
+ splx(x);
+ while(l->key)
+ ;
+ x = splhi();
+ if(tas(&l->key) == 0)
+ goto acquire;
+ }
}
+ acquire:
+ m->ilockdepth++;
+ if(up)
+ up->lastilock = l;
+ l->sr = x;
+ l->pc = pc;
+ l->p = up;
+ l->isilock = 1;
+ l->m = MACHP(m->machno);
}
int
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/taslock.c:174,179 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/taslock.c:174,180
up->lastlock = l;
l->pc = getcallerpc(&l);
l->p = up;
+ l->m = MACHP(m->machno);
l->isilock = 0;
return 1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/taslock.c:187,192 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/taslock.c:188,194
print("unlock of ilock: pc %lux, held by %lux\n", getcallerpc(&l), l->pc);
if(l->p != up)
print("unlock: up changed: pc %lux, acquired at pc %lux, lock p 0x%p, unlock up 0x%p\n", getcallerpc(&l), l->pc, l->p, up);
+ l->m = nil;
l->key = 0;
coherence();
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/taslock.c:212,217 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/taslock.c:214,220
print("iunlock while lo: pc %lux, held by %lux\n", getcallerpc(&l), l->pc);
sr = l->sr;
+ l->m = nil;
l->key = 0;
coherence();
[rsc] --rw-rw-r-- M 451989 glenda sys 4063 Nov 6 10:14 sys/src/9/port/xalloc.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/xalloc.c:45,52 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/xalloc.c:45,55
void
xinit(void)
{
+ int i, n, upages, kpages;
+ ulong maxkpa;
+ Confmem *m;
+ Pallocmem *pm;
Hole *h, *eh;
- int upages, np0, np1;
eh = &xlists.hole[Nhole-1];
for(h = xlists.hole; h < eh; h++)
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/xalloc.c:55,86 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/xalloc.c:58,94
xlists.flist = xlists.hole;
upages = conf.upages;
- np1 = upages;
- if(np1 > conf.npage1)
- np1 = conf.npage1;
-
- palloc.p1 = conf.base1 + (conf.npage1 - np1)*BY2PG;
- conf.npage1 -= np1;
- xhole(conf.base1, conf.npage1*BY2PG);
- conf.npage1 = conf.base1+(conf.npage1*BY2PG);
- upages -= np1;
-
- np0 = upages;
- if(np0 > conf.npage0)
- np0 = conf.npage0;
-
- palloc.p0 = conf.base0 + (conf.npage0 - np0)*BY2PG;
- conf.npage0 -= np0;
- xhole(conf.base0, conf.npage0*BY2PG);
- conf.npage0 = conf.base0+(conf.npage0*BY2PG);
-
- palloc.np0 = np0;
- palloc.np1 = np1;
- /* Save the bounds of kernel alloc memory for kernel mmu mapping */
- conf.base0 = (ulong)KADDR(conf.base0);
- conf.base1 = (ulong)KADDR(conf.base1);
- conf.npage0 = (ulong)KADDR(conf.npage0);
- conf.npage1 = (ulong)KADDR(conf.npage1);
+ kpages = conf.npage - upages;
+ pm = palloc.mem;
+ maxkpa = -KZERO;
+ for(i=0; i<nelem(conf.mem); i++){
+ m = &conf.mem[i];
+ n = m->npage;
+ if(n > kpages)
+ n = kpages;
+ if(m->base >= maxkpa)
+ n = 0;
+ else if(n > 0 && m->base+n*BY2PG >= maxkpa)
+ n = (maxkpa - m->base)/BY2PG;
+ /* first give to kernel */
+ if(n > 0){
+ m->kbase = (ulong)KADDR(m->base);
+ m->klimit = (ulong)KADDR(m->base+n*BY2PG);
+ xhole(m->base, n*BY2PG);
+ kpages -= n;
+ }
+ /* if anything left over, give to user */
+ if(n < m->npage){
+ if(pm >= palloc.mem+nelem(palloc.mem)){
+ print("xinit: losing %lud pages\n", m->npage-n);
+ continue;
+ }
+ pm->base = m->base+n*BY2PG;
+ pm->npage = m->npage - n;
+ pm++;
+ }
+ }
+ xsummary();
}
void*
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/xalloc.c:122,128 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/xalloc.c:130,136
l = &xlists.table;
for(h = *l; h; h = h->link) {
if(h->size >= size) {
- p = (Xhdr*)h->addr;
+ p = (Xhdr*)KADDR(h->addr);
h->addr += size;
h->size -= size;
if(h->size == 0) {
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/xalloc.c:131,137 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/xalloc.c:139,144
xlists.flist = h;
}
iunlock(&xlists);
- p = KADDR(p);
if(zero)
memset(p->data, 0, size);
p->magix = Magichole;
[rsc] --rw-rw-r-- M 451989 presotto sys 1076 Nov 6 10:14 sys/src/9/ppc/clock.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/clock.c:57,63 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/clock.c:57,67
{
ulong i, j;
- j = m->loopconst;
+ j = 0;
+ if(m)
+ j = m->loopconst;
+ if(j == 0)
+ j = 1096;
while(l-- > 0)
for(i=0; i < j; i++)
;
[rsc] --rw-rw-r-- M 451989 presotto sys 9327 Nov 6 10:16 sys/src/9/ppc/devether.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/devether.c:11,16 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/devether.c:11,17
#include "etherif.h"
static Ether *etherxx[MaxEther];
+ extern uchar etheraddr[];
Chan*
etherattach(char* spec)
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/devether.c:365,370 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/devether.c:366,372
for(n = 0; cards[n].type; n++){
if(cistrcmp(cards[n].type, ether->type))
continue;
+ memmove(ether->ea, etheraddr, 6);
for(i = 0; i < ether->nopt; i++){
if(strncmp(ether->opt[i], "ea=", 3))
continue;
[rsc] --rw-rw-r-- M 451989 presotto sys 19599 Nov 6 10:15 sys/src/9/ppc/etherfcc.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/etherfcc.c:8,19 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/etherfcc.c:8,19
#include "dat.h"
#include "fns.h"
#include "io.h"
- #include "m8260.h"
+ #include "imm.h"
#include "../port/error.h"
#include "../port/netif.h"
#include "etherif.h"
- #include "ethermii.h"
+ #include "../ppc/ethermii.h"
#define DBG 1
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/etherfcc.c:523,545 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/etherfcc.c:523,545
/* Step 1 (Section 28.9), write the parallel ports */
ctlr->pmdio = 0x01000000;
ctlr->pmdck = 0x08000000;
- iomem->port[0].pdir &= ~A1dir0;
- iomem->port[0].pdir |= A1dir1;
- iomem->port[0].psor &= ~A1psor0;
- iomem->port[0].psor |= A1psor1;
- iomem->port[0].ppar |= (A1dir0 | A1dir1);
+ imm->port[0].pdir &= ~A1dir0;
+ imm->port[0].pdir |= A1dir1;
+ imm->port[0].psor &= ~A1psor0;
+ imm->port[0].psor |= A1psor1;
+ imm->port[0].ppar |= (A1dir0 | A1dir1);
/* Step 2, Port C clocks */
- iomem->port[2].psor &= ~0x00000c00;
- iomem->port[2].pdir &= ~0x00000c00;
- iomem->port[2].ppar |= 0x00000c00;
- iomem->port[3].pdat |= (ctlr->pmdio | ctlr->pmdck);
- iomem->port[3].podr |= ctlr->pmdio;
- iomem->port[3].pdir |= (ctlr->pmdio | ctlr->pmdck);
- iomem->port[3].ppar &= ~(ctlr->pmdio | ctlr->pmdck);
+ imm->port[2].psor &= ~0x00000c00;
+ imm->port[2].pdir &= ~0x00000c00;
+ imm->port[2].ppar |= 0x00000c00;
+ imm->port[3].pdat |= (ctlr->pmdio | ctlr->pmdck);
+ imm->port[3].podr |= ctlr->pmdio;
+ imm->port[3].pdir |= (ctlr->pmdio | ctlr->pmdck);
+ imm->port[3].ppar &= ~(ctlr->pmdio | ctlr->pmdck);
eieio();
/* Step 3, Serial Interface clock routing */
- iomem->cmxfcr &= ~0xff000000; /* Clock mask */
- iomem->cmxfcr |= 0x37000000; /* Clock route */
+ imm->cmxfcr &= ~0xff000000; /* Clock mask */
+ imm->cmxfcr |= 0x37000000; /* Clock route */
break;
case 1:
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/etherfcc.c:546,595 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/etherfcc.c:546,595
/* Step 1 (Section 28.9), write the parallel ports */
ctlr->pmdio = 0x00400000;
ctlr->pmdck = 0x00200000;
- iomem->port[1].pdir &= ~B2dir0;
- iomem->port[1].pdir |= B2dir1;
- iomem->port[1].psor &= ~B2psor0;
- iomem->port[1].psor |= B2psor1;
- iomem->port[1].ppar |= (B2dir0 | B2dir1);
+ imm->port[1].pdir &= ~B2dir0;
+ imm->port[1].pdir |= B2dir1;
+ imm->port[1].psor &= ~B2psor0;
+ imm->port[1].psor |= B2psor1;
+ imm->port[1].ppar |= (B2dir0 | B2dir1);
/* Step 2, Port C clocks */
- iomem->port[2].psor &= ~0x00003000;
- iomem->port[2].pdir &= ~0x00003000;
- iomem->port[2].ppar |= 0x00003000;
+ imm->port[2].psor &= ~0x00003000;
+ imm->port[2].pdir &= ~0x00003000;
+ imm->port[2].ppar |= 0x00003000;
- iomem->port[2].pdat |= (ctlr->pmdio | ctlr->pmdck);
- iomem->port[2].podr |= ctlr->pmdio;
- iomem->port[2].pdir |= (ctlr->pmdio | ctlr->pmdck);
- iomem->port[2].ppar &= ~(ctlr->pmdio | ctlr->pmdck);
+ imm->port[2].pdat |= (ctlr->pmdio | ctlr->pmdck);
+ imm->port[2].podr |= ctlr->pmdio;
+ imm->port[2].pdir |= (ctlr->pmdio | ctlr->pmdck);
+ imm->port[2].ppar &= ~(ctlr->pmdio | ctlr->pmdck);
eieio();
/* Step 3, Serial Interface clock routing */
- iomem->cmxfcr &= ~0x00ff0000;
- iomem->cmxfcr |= 0x00250000;
+ imm->cmxfcr &= ~0x00ff0000;
+ imm->cmxfcr |= 0x00250000;
break;
case 2:
/* Step 1 (Section 28.9), write the parallel ports */
- iomem->port[1].pdir &= ~B3dir0;
- iomem->port[1].pdir |= B3dir1;
- iomem->port[1].psor &= ~B3psor0;
- iomem->port[1].psor |= B3psor1;
- iomem->port[1].ppar |= (B3dir0 | B3dir1);
+ imm->port[1].pdir &= ~B3dir0;
+ imm->port[1].pdir |= B3dir1;
+ imm->port[1].psor &= ~B3psor0;
+ imm->port[1].psor |= B3psor1;
+ imm->port[1].ppar |= (B3dir0 | B3dir1);
/* Step 2, Port C clocks */
- iomem->port[2].psor &= ~0x0000c000;
- iomem->port[2].pdir &= ~0x0000c000;
- iomem->port[2].ppar |= 0x0000c000;
- iomem->port[3].pdat |= (ctlr->pmdio | ctlr->pmdck);
- iomem->port[3].podr |= ctlr->pmdio;
- iomem->port[3].pdir |= (ctlr->pmdio | ctlr->pmdck);
- iomem->port[3].ppar &= ~(ctlr->pmdio | ctlr->pmdck);
+ imm->port[2].psor &= ~0x0000c000;
+ imm->port[2].pdir &= ~0x0000c000;
+ imm->port[2].ppar |= 0x0000c000;
+ imm->port[3].pdat |= (ctlr->pmdio | ctlr->pmdck);
+ imm->port[3].podr |= ctlr->pmdio;
+ imm->port[3].pdir |= (ctlr->pmdio | ctlr->pmdck);
+ imm->port[3].ppar &= ~(ctlr->pmdio | ctlr->pmdck);
eieio();
/* Step 3, Serial Interface clock routing */
- iomem->cmxfcr &= ~0x0000ff00;
- iomem->cmxfcr |= 0x00003700;
+ imm->cmxfcr &= ~0x0000ff00;
+ imm->cmxfcr |= 0x00003700;
break;
}
iopunlock();
- p = (Etherparam*)(m->imap->prmfcc + ctlr->port);
+ p = (Etherparam*)(m->immr->prmfcc + ctlr->port);
memset(p, 0, sizeof(Etherparam));
/* Step 4 */
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/etherfcc.c:623,632 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/etherfcc.c:623,632
p->paddr[2-i/2] = (ea[i+1]<<8)|ea[i];
/* Step 7, initialize parameter ram, configuration-dependent values */
- p->riptr = m->imap->fccextra[ctlr->port].ri - (uchar*)INTMEM;
- p->tiptr = m->imap->fccextra[ctlr->port].ti - (uchar*)INTMEM;
- p->padptr = m->imap->fccextra[ctlr->port].pad - (uchar*)INTMEM;
- memset(m->imap->fccextra[ctlr->port].pad, 0x88, 0x20);
+ p->riptr = m->immr->fccextra[ctlr->port].ri - (uchar*)IMMR;
+ p->tiptr = m->immr->fccextra[ctlr->port].ti - (uchar*)IMMR;
+ p->padptr = m->immr->fccextra[ctlr->port].pad - (uchar*)IMMR;
+ memset(m->immr->fccextra[ctlr->port].pad, 0x88, 0x20);
/* Step 8, clear out events */
fcc->fcce = ~0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/etherfcc.c:690,696 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/etherfcc.c:690,696
}
ether->irq = fccirq[ether->port];
ether->tbdf = BusPPC;
- fcc = iomem->fcc + ether->port;
+ fcc = imm->fcc + ether->port;
ctlr = malloc(sizeof(*ctlr));
ether->ctlr = ctlr;
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/etherfcc.c:786,792 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/etherfcc.c:786,792
*/
ctlr = mii->ctlr;
- port = iomem->port + 3;
+ port = imm->port + 3;
cmd = MDIwrite | (pa<<(5+2+16))| (ra<<(2+16)) | (data & 0xffff);
x = splhi();
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/etherfcc.c:815,821 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/etherfcc.c:815,821
Ctlr *ctlr;
ctlr = mii->ctlr;
- port = iomem->port + 3;
+ port = imm->port + 3;
cmd = MDIread | pa<<(5+2+16) | ra<<(2+16);
[rsc] --rw-rw-r-- M 451989 presotto sys 9075 Nov 6 10:15 sys/src/9/ppc/main.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/main.c:330,342 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/main.c:330,342
pa = PGROUND(PADDR(end));
/* Blast Board specific */
- conf.npage0 = (MEM1SIZE - pa)/BY2PG;
- conf.base0 = pa;
+ conf.mem[0].npage = (MEM1SIZE - pa)/BY2PG;
+ conf.mem[0].base = pa;
- conf.npage1 = MEM2SIZE/BY2PG;
- conf.base1 = MEM2BASE;
+ conf.mem[1].npage = MEM2SIZE/BY2PG;
+ conf.mem[1].base = MEM2BASE;
- conf.npage = conf.npage0 + conf.npage1;
+ conf.npage = conf.mem[0].npage + conf.mem[1].npage;
conf.nmach = 1;
conf.nproc = 100 + ((conf.npage*BY2PG)/MB)*5;
[rsc] --rw-rw-r-- M 451989 presotto sys 17067 Nov 6 10:15 sys/src/9/ppc/trap.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/trap.c:9,15 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/trap.c:9,15
#include <trace.h>
static Lock vctllock;
- static Vctl *vctl[256];
+ Vctl *vctl[256];
void
intrenable(int irq, void (*f)(Ureg*, void*), void* a, char *name)
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/trap.c:56,63 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/trap.c:56,68
((*pv)->irq != irq || (*pv)->f != f || (*pv)->a != a ||
strcmp((*pv)->name, name)))
pv = &((*pv)->next);
- assert(*pv);
+ if(*pv == nil){
+ print("intrdisable: irq %d not found\n", irq);
+ iunlock(&vctllock);
+ return;
+ }
+
v = *pv;
*pv = (*pv)->next; /* Link out the entry */
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/trap.c:154,159 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/trap.c:159,165
{
int ecode, user;
char buf[ERRMAX], *s;
+ extern FPsave initfp;
ecode = (ureg->cause >> 8) & 0xff;
user = (ureg->srr1 & MSR_PR) != 0;
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/trap.c:379,471 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/trap.c:385,390
vp[n] = 0x4e800021; /* BL (LR) */
}else
vp[n] = (18<<26)|(pa&0x3FFFFFC)|3; /* bla */
- }
-
- int intrstack[5];
- uvlong intrtime[5];
- vlong lastoffset;
- int inintr;
- int nintr[10];
- int nintro;
- int dblintr[64];
- ulong thisto[32];
- ulong thistoo;
- vlong vnot[64];
- ulong vnon[64];
-
- void
- dumpvno(void)
- {
- int i;
-
- for(i = 0; i < nelem(vnon); i++){
- if(vnon[i])
- print("%d %lld %lud\n", i, vnot[i], vnon[i]);
- vnot[i] = 0;
- vnon[i] = 0;
- }
- for(i = 0; i < nelem(thisto); i++){
- if(thisto[i]) print("%d %lud\n", i, thisto[i]);
- thisto[i] = 0;
- }
- if(thistoo) print("ovl %lud\n", thistoo);
- thistoo = 0;
- }
-
- void
- intr(Ureg *ureg)
- {
- int vno, pvno, i;
- Vctl *ctl, *v;
- void (*pt)(Proc*, int, vlong);
- uvlong tt, x;
-
- cycles(&tt);
- pt = proctrace;
- pvno = -1;
- for(i = 0; i < 64; i++){
- vno = intvec();
- if(vno == 0)
- break;
- cycles(&x);
- vnot[vno] -= x;
- if(vno == pvno)
- dblintr[vno]++;
- pvno = vno;
- if(pt && up && up->trace)
- pt(up, (vno << 16) | SInts, 0);
-
- if(vno > nelem(vctl) || (ctl = vctl[vno]) == 0) {
- iprint("spurious intr %d\n", vno);
- return;
- }
-
- for(v = ctl; v != nil; v = v->next)
- if(v->f)
- v->f(ureg, v->a);
-
- intend(vno); /* reenable the interrupt */
-
- if(pt && up && up->trace)
- pt(up, (vno << 16) | SInte, 0);
- cycles(&x);
- vnot[vno] += x;
- vnon[vno]++;
- }
- if(i < nelem(nintr))
- nintr[i]++;
- else
- nintro++;
- cycles(&x);
- tt = x - tt;
- i = tt / 3600; /* 100 microseconds units */
- if(i < nelem(thisto))
- thisto[i]++;
- else
- thistoo++;
-
- if(up)
- preempted();
}
char*
[rsc] --rw-rw-r-- M 451989 presotto sys 9764 Nov 6 10:16 sys/src/9/ppc/uartsmc.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:4,11 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:4,12
#include "dat.h"
#include "fns.h"
#include "io.h"
- #include "m8260.h"
+ #include "imm.h"
#include "../port/error.h"
+ #include "../ppc/uartsmc.h"
/*
* PowerPC 8260 SMC UART
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:12,19 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:13,18
*/
enum {
- Nuart = 1, /* Number of SMC Uarts */
-
/* SMC Mode Registers */
Clen = 0x7800, /* Character length */
Sl = 0x0400, /* Stop length, 0: one stop bit, 1: two */
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:36,44 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:35,43
BDContin= 1<<9,
BDIdle= 1<<8,
BDPreamble= 1<<8,
- BDBreak= 1<<5,
+ BDBreak= 1<<5,
BDFrame= 1<<4,
- BDParity= 1<<3,
+ BDParity= 1<<3,
BDOverrun= 1<<1,
/* Tx and Rx buffer sizes (32 bytes) */
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:71,96 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:70,81
*/
};
- typedef struct UartData UartData;
- struct UartData
- {
- int smcno; /* smc number: 0 or 1 */
- SMC *smc;
- Uartsmc *usmc;
- char *rxbuf;
- char *txbuf;
- BD* rxb;
- BD* txb;
- int initialized;
- int enabled;
- } uartdata[Nuart];
-
int uartinited = 0;
static void smcinterrupt(Ureg*, void*);
static void smcputc(Uart *uart, int c);
- static int
+ int
baudgen(int baud)
{
int d;
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:111,117 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:96,102
return smcuart;
}
- static void
+ void
smcinit(Uart *uart)
{
Uartsmc *p;
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:125,136 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:110,120
if (ud->initialized)
return;
- /* magic addresses */
- p = m->imap->uartsmc + ud->smcno;
- smc = iomem->smc + ud->smcno; /* SMC1 */
- ud->smc = smc;
- ud->usmc = p;
+ smcsetup(uart); /* Steps 1 through 4, PPC-dependent */
+ p = ud->usmc;
+ smc = ud->smc;
+ /* step 5: set up buffer descriptors */
/* setup my uart structure */
if (ud->rxb == nil)
ud->rxb = bdalloc(1);
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:137,180 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:121,129
if (ud->txb == nil)
ud->txb = bdalloc(1);
- /* step 0: disable rx/tx */
- smc->smcmr &= ~3;
+ p->rbase = ((ulong)ud->rxb) - (ulong)IMMR;
+ p->tbase = ((ulong)ud->txb) - (ulong)IMMR;
- ioplock();
-
- /* step 1, Using Port D */
- if (ud->smcno != 0)
- panic("Don't know how to set Port D bits");
- iomem->port[SMC1PORT].ppar |= SMRXD1|SMTXD1;
- iomem->port[SMC1PORT].pdir |= SMTXD1;
- iomem->port[SMC1PORT].pdir &= ~SMRXD1;
- iomem->port[SMC1PORT].psor &= ~(SMRXD1|SMTXD1);
-
- /* step 2: set up brgc1 */
- iomem->brgc[ud->smcno] = baudgen(uart->baud) | 0x10000;
-
- /* step 3: route clock to SMC1 */
- iomem->cmxsmr &= (ud->smcno == 0) ? ~0xb0 : ~0xb; /* clear smcx and smcxcs */
-
- iopunlock();
-
- /* step 4: assign a pointer to the SMCparameter RAM */
- m->imap->param[ud->smcno].smcbase = (ulong)p - INTMEM;
-
- /* step 5: set up buffer descriptors */
- p->rbase = ((ulong)ud->rxb) - (ulong)INTMEM;
- p->tbase = ((ulong)ud->txb) - (ulong)INTMEM;
-
- /* step 6: issue command to CP */
- if (ud->smcno == 0)
- cpmop(InitRxTx, SMC1ID, 0);
- else
- cpmop(InitRxTx, SMC2ID, 0);
-
- /* step 7: protocol parameters */
- p->rfcr = 0x30;
- p->tfcr = 0x30;
-
/* step 8: receive buffer size */
p->mrblr = Rxsize;
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:206,213 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:155,160
/*
* step 15: enable interrupts (done later)
* smc->smcm = ce_Brke | ce_Br | ce_Bsy | ce_Txb | ce_Rxb;
-
- * intrenable(4 + ud->smcno, smcinterrupt, up, 0, uart->name);
*/
/* step 17: set parity, no of bits, UART mode, ... */
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:261,267 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:208,214
smc->smce = ce_Brke | ce_Br | ce_Bsy | ce_Txb | ce_Rxb;
/* enable interrupts */
smc->smcm = ce_Brke | ce_Br | ce_Bsy | ce_Txb | ce_Rxb;
- intrenable(4 + ud->smcno, smcinterrupt, uart, uart->name);
+ intrenable(VecSMC1 + ud->smcno, smcinterrupt, uart, uart->name);
ud->enabled = 1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:426,433 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:373,380
if(uart->freq == 0 || baud <= 0)
return -1;
- i = sp - iomem->smc;
- iomem->brgc[i] = (((m->brghz >> 4) / baud) << 1) | 0x00010000;
+ i = sp - imm->smc;
+ imm->brgc[i] = (((m->brghz >> 4) / baud) << 1) | 0x00010000;
}
uart->baud = baud;
/n/sourcesdump/2005/1106/plan9/sys/src/9/ppc/uartsmc.c:636,669 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/ppc/uartsmc.c:583,585
consuart = uart;
uart->console = 1;
}
-
- void
- dbgputc(int c)
- {
- Uartsmc *su;
- BD *tbdf;
- Imap *imap;
- char *addr;
-
- /* Should work as long as Imap is mapped at 0xf0000000 (INTMEM) */
-
- imap = (Imap*)INTMEM;
- su = (Uartsmc *)(INTMEM | imap->param[0].smcbase);
- tbdf = (BD *)(INTMEM | su->tbase);
-
- /* Wait for last character to go.
- */
- while (tbdf->status & BDReady)
- ;
-
- addr = KADDR(tbdf->addr);
- *addr = c;
- tbdf->length = 1;
- sync();
- tbdf->status |= BDReady;
-
- while (tbdf->status & BDReady)
- ;
-
- delay(300);
- }
[rsc] --rw-rw-r-- M 451989 glenda sys 3037 Nov 6 11:14 sys/src/9/pc/apbootstrap.s
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/apbootstrap.s:1,3 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/apbootstrap.s:1,13
+ /*
+ * Start an Application Processor. This must be placed on a 4KB boundary
+ * somewhere in the 1st MB of conventional memory (APBOOTSTRAP). However,
+ * due to some shortcuts below it's restricted further to within the 1st
+ * 64KB. The AP starts in real-mode, with
+ * CS selector set to the startup memory address/16;
+ * CS base set to startup memory address;
+ * CS limit set to 64KB;
+ * CPL and IP set to 0.
+ */
#include "mem.h"
#define NOP BYTE $0x90 /* NOP */
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/apbootstrap.s:23,38 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/apbootstrap.s:33,38
#define PDO(a) (((((a))>>22) & 0x03FF)<<2)
#define PTO(a) (((((a))>>12) & 0x03FF)<<2)
- /*
- * Start an Application Processor. This must be placed on a 4KB boundary
- * somewhere in the 1st MB of conventional memory (APBOOTSTRAP). However,
- * due to some shortcuts below it's restricted further to within the 1st
- * 64KB. The AP starts in real-mode, with
- * CS selector set to the startup memory address/16;
- * CS base set to startup memory address;
- * CS limit set to 64KB;
- * CPL and IP set to 0.
- */
TEXT apbootstrap(SB), $0
FARJUMP16(0, _apbootstrap(SB))
TEXT _apvector(SB), $0 /* address APBOOTSTRAP+0x08 */
[rsc] --rw-rw-r-- M 451989 glenda sys 7133 Nov 6 11:09 sys/src/9/pc/sdscsi.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/sdscsi.c:372,394 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/sdscsi.c:372,374
return rlen;
}
- SDev*
- scsiid(SDev* sdev, SDifc* ifc)
- {
- char name[32];
- static char idno[16] = "0123456789abcdef";
- static char *p = idno;
-
- while(sdev){
- if(sdev->ifc == ifc){
- sdev->idno = *p++;
- snprint(name, sizeof(name), "sd%c", sdev->idno);
- kstrdup(&sdev->name, name);
- if(p >= &idno[sizeof(idno)])
- break;
- }
- sdev = sdev->next;
- }
-
- return nil;
- }
[rsc] --rw-rw-r-- M 451989 rsc sys 2658 Nov 6 11:30 sys/src/9/pc/realmode.c
[rsc] --rw-rw-r-- M 451989 glenda sys 15159 Nov 6 12:35 sys/src/9/port/sysproc.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sysproc.c:259,265 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sysproc.c:259,265
text = l2be(exec.text);
entry = l2be(exec.entry);
if(n==sizeof(Exec) && (magic == AOUT_MAGIC)){
- if((text&KZERO) == KZERO
+ if(text >= USTKTOP-UTZERO
|| entry < UTZERO+sizeof(Exec)
|| entry >= UTZERO+sizeof(Exec)+text)
error(Ebadexec);
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sysproc.c:298,304 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sysproc.c:298,304
d = (t + data + (BY2PG-1)) & ~(BY2PG-1);
bssend = t + data + bss;
b = (bssend + (BY2PG-1)) & ~(BY2PG-1);
- if(((t|d|b) & KZERO) == KZERO)
+ if(t >= KZERO || d >= KZERO || b >= KZERO)
error(Ebadexec);
/*
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/sysproc.c:807,819 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/sysproc.c:807,818
long
sysrendezvous(ulong *arg)
{
- ulong tag;
- ulong val;
+ uintptr tag, val;
Proc *p, **l;
tag = arg[0];
l = &REND(up->rgrp, tag);
- up->rendval = ~0UL;
+ up->rendval = ~(uintptr)0;
lock(up->rgrp);
for(p = *l; p; p = p->rendhash) {
[rsc] --rw-rw-r-- M 451989 glenda sys 3580 Nov 6 11:34 sys/src/9/pc/mkfile
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:1,11 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:1,18
CONF=pc
CONFLIST=pc pccpu pcf pccpuf pcdisk pcauth
- CRAPLIST=pccd pccpud pccpusape pcext pcf pcflop pcglenda pcgr pclml pcmartha pcsape pcblast
+ CRAPLIST=pccd pcflop pcmartha
+ EXTRACOPIES=
+ #EXTRACOPIES=lookout boundary # copy to these servers on install
objtype=386
</$objtype/mkfile
p=9
+ # must match mem.h
+
+ APBOOTSTRAP=0xF0003000
+ KTZERO=0xF0100020
+
DEVS=`{rc ../port/mkdevlist $CONF}
PORT=\
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:16,24 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:23,31
cache.$O\
chan.$O\
dev.$O\
+ edf.$O\
fault.$O\
latin1.$O\
- edf.$O\
page.$O\
parse.$O\
pgrp.$O\
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:27,32 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:34,40
proc.$O\
qio.$O\
qlock.$O\
+ rdb.$O\
rebootcmd.$O\
segment.$O\
swap.$O\
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:47,53 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:55,60
memory.$O\
mmu.$O\
random.$O\
- rdb.$O\
trap.$O\
$CONF.root.$O\
$CONF.rootc.$O\
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:67,81 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:74,89
$p$CONF: $CONF.c $OBJ $LIB
$CC $CFLAGS '-DKERNDATE='`{date -n} $CONF.c
- $LD -o $target -T0x80100020 -l $OBJ $CONF.$O $LIB
+ $LD -o $target -T$KTZERO -l $OBJ $CONF.$O $LIB
size $target
- $p$CONF.gz: $p$CONF
- strip < $p$CONF | gzip -9 > $p$CONF.gz
+ $p$CONF.gz: $p$CONF
+ strip -o /fd/1 $p$CONF | gzip -9 > $p$CONF.gz
- install:V: $p$CONF $p$CONF.gz
+ install:V: $p$CONF $p$CONF.gz
cp $p$CONF $p$CONF.gz /$objtype/
- # import lookout / /n/lookout && cp $p$CONF $p$CONF.gz /n/lookout/$objtype/
+ for(i in $EXTRACOPIES)
+ import $i / /n/$i && cp $p$CONF $p$CONF.gz /n/$i/$objtype/
<../boot/bootmkfile
<../port/portmkfile
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:90,109 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:98,118
$SDEV: ../port/sd.h
sd53c8xx.$O: sd53c8xx.i
main.$O: init.h reboot.h
- wavelan.$O: wavelan.c ../pc/wavelan.c ../pc/wavelan.h
- etherwavelan.$O: etherwavelan.c ../pc/wavelan.h
- devusb.$O usbuhci.$O usbohci.$O: usb.h
- trap.$O: /sys/include/tos.h
+ wavelan.$O: wavelan.c ../pc/wavelan.c ../pc/wavelan.h
+ etherwavelan.$O: etherwavelan.c ../pc/wavelan.h
+ devusb.$O usbuhci.$O usbohci.$O: usb.h
+ trap.$O: /sys/include/tos.h
sd53c8xx.i: sd53c8xx.n
aux/na $prereq > $target
- init.h: ../port/initcode.c init9.c
+ init.h: ../port/initcode.c init9.c
$CC ../port/initcode.c
$CC init9.c
$LD -l -R1 -o init.out init9.$O initcode.$O /386/lib/libc.a
+ strip init.out
{echo 'uchar initcode[]={'
- strip < init.out | xd -1x |
+ cat init.out | xd -1x |
sed -e 's/^[0-9a-f]+ //' -e 's/ ([0-9a-f][0-9a-f])/0x\1,/g'
echo '};'} > init.h
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:117,123 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:126,132
apbootstrap.h: apbootstrap.s mem.h
$AS $prereq
- $LD -o apbootstrap.out -T0x80001000 -R4 -l -s apbootstrap.$O
+ $LD -o apbootstrap.out -T$APBOOTSTRAP -R4 -l -s apbootstrap.$O
{echo 'uchar apbootstrap[]={'
xd -1x apbootstrap.out |
sed -e '1,2d' -e 's/^[0-9a-f]+ //' -e 's/ ([0-9a-f][0-9a-f])/0x\1,/g'
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:124,130 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:133,139
echo '};'} > $target
acid:V:
- 8c -a -w -I. ../port/qio.c>acid
+ 8c -a -w -I. i8253.c>acid
%.checkether:VQ:
for (i in ether*.c){
/n/sourcesdump/2005/1106/plan9/sys/src/9/pc/mkfile:148,151 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/pc/mkfile:157,172
mk $i.$j
%.clean:V:
- rm -f $stem.c [9bz]$stem [9bz]$stem.gz boot$stem.*
+ rm -f $stem.c [9bz]$stem [9bz]$stem.gz boot$stem.* reboot.h apbootstrap.h init.h
+
+ # testing
+ 9load:D: /usr/rsc/boot/$O.load 9pcload
+ cat $prereq >$target
+
+ 9load.flp: 9load
+ disk/format -b /386/pbs -df $target $prereq
+
+ $p$CONF.flp: /386/9load plan9.ini $p$CONF.gz
+ disk/format -b /386/pbs -df $target $prereq
+
+
[rsc] --rw-rw-r-- M 451989 glenda sys 33663 Nov 6 12:38 sys/src/9/port/chan.c
/n/sourcesdump/2005/1106/plan9/sys/src/9/port/chan.c:1600,1606 -
/n/sourcesdump/2005/1107/plan9/sys/src/9/port/chan.c:1600,1607
Rune r;
name = aname;
- if(((ulong)name & KZERO) != KZERO){
+ if((ulong)name < KZERO){
+ validaddr((ulong)name, 1, 0);
if(!dup)
print("warning: validname called from %lux with user pointer", pc);
p = name;
[rsc] --rw-rw-r-- M 451989 glenda sys 13722 Nov 6 12:35 sys/src/9/port/segment.c
[rsc] --rw-rw-r-- M 451989 glenda sys 15159 Nov 6 12:35 sys/src/9/port/sysproc.c
[rsc] --rw-rw-r-- M 451989 glenda sys 1446 Nov 6 12:59 sys/src/9/pc/pcdisk
[rsc] --rw-rw-r-- M 451989 presotto sys 1504 Nov 6 12:59 sys/src/9/pc/pcf
[rsc] --rw-rw-r-- M 451989 presotto sys 1486 Nov 6 12:59 sys/src/9/pc/pccpuf
[rsc] --rw-rw-r-- M 451989 rsc sys 1473 Nov 6 12:59 sys/src/9/pc/pcflop
[rsc] --rw-rw-r-- M 451989 glenda sys 21180 Nov 6 14:44 sys/src/9/pc/trap.c
[rsc] --rw-rw-r-- M 451989 glenda sys 19739 Nov 6 20:17 sys/src/9/pc/mmu.c
[rsc] --rw-rw-r-- M 451989 glenda sys 17157 Nov 6 20:17 sys/src/9/pc/mp.c
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 8586 Nov 6 09:58 sys/include/mach.h
/n/sourcesdump/2005/1106/plan9/sys/include/mach.h:119,127 -
/n/sourcesdump/2005/1107/plan9/sys/include/mach.h:119,127
int fd; /* file descriptor */
int inuse; /* in use - not in use */
int cache; /* should cache reads? */
- ulong b; /* base */
- ulong e; /* end */
- ulong f; /* offset within file */
+ uvlong b; /* base */
+ uvlong e; /* end */
+ vlong f; /* offset within file */
} seg[1]; /* actually n of these */
};
/n/sourcesdump/2005/1106/plan9/sys/include/mach.h:169,176 -
/n/sourcesdump/2005/1107/plan9/sys/include/mach.h:169,176
char *name;
int mtype; /* machine type code */
Reglist *reglist; /* register set */
- ulong regsize; /* sizeof registers in bytes*/
- ulong fpregsize; /* sizeof fp registers in bytes*/
+ long regsize; /* sizeof registers in bytes */
+ long fpregsize; /* sizeof fp registers in bytes */
char *pc; /* pc name */
char *sp; /* sp name */
char *link; /* link register name */
/n/sourcesdump/2005/1106/plan9/sys/include/mach.h:179,184 -
/n/sourcesdump/2005/1107/plan9/sys/include/mach.h:179,185
int pgsize; /* page size */
uvlong kbase; /* kernel base address */
uvlong ktmask; /* ktzero = kbase & ~ktmask */
+ uvlong utop; /* user stack top */
int pcquant; /* quantization of pc */
int szaddr; /* sizeof(void*) */
int szreg; /* sizeof(register) */
/n/sourcesdump/2005/1106/plan9/sys/include/mach.h:188,213 -
/n/sourcesdump/2005/1107/plan9/sys/include/mach.h:189,214
extern Mach *mach; /* Current machine */
- typedef vlong (*Rgetter)(Map*, char*);
- typedef void (*Tracer)(Map*, ulong, ulong, Symbol*);
+ typedef uvlong (*Rgetter)(Map*, char*);
+ typedef void (*Tracer)(Map*, uvlong, uvlong, Symbol*);
struct Machdata { /* Machine-dependent debugger support */
uchar bpinst[4]; /* break point instr. */
short bpsize; /* size of break point instr. */
- ushort (*swab)(ushort); /* short to local byte order */
- long (*swal)(long); /* long to local byte order */
- vlong (*swav)(vlong); /* vlong to local byte order */
- int (*ctrace)(Map*, ulong, ulong, ulong, Tracer); /* C traceback */
- ulong (*findframe)(Map*, ulong, ulong, ulong, ulong);/* frame finder */
+ ushort (*swab)(ushort); /* ushort to local byte order */
+ ulong (*swal)(ulong); /* ulong to local byte order */
+ uvlong (*swav)(uvlong); /* uvlong to local byte order */
+ int (*ctrace)(Map*, uvlong, uvlong, uvlong, Tracer); /* C traceback */
+ uvlong (*findframe)(Map*, uvlong, uvlong, uvlong, uvlong);/* frame finder */
char* (*excep)(Map*, Rgetter); /* last exception */
- ulong (*bpfix)(ulong); /* breakpoint fixup */
+ ulong (*bpfix)(uvlong); /* breakpoint fixup */
int (*sftos)(char*, int, void*); /* single precision float */
int (*dftos)(char*, int, void*); /* double precision float */
- int (*foll)(Map*, ulong, Rgetter, ulong*); /* follow set */
- int (*das)(Map*, ulong, char, char*, int); /* symbolic disassembly */
- int (*hexinst)(Map*, ulong, char*, int); /* hex disassembly */
- int (*instsize)(Map*, ulong); /* instruction size */
+ int (*foll)(Map*, uvlong, Rgetter, uvlong*);/* follow set */
+ int (*das)(Map*, uvlong, char, char*, int); /* symbolic disassembly */
+ int (*hexinst)(Map*, uvlong, char*, int); /* hex disassembly */
+ int (*instsize)(Map*, uvlong); /* instruction size */
};
/*
/n/sourcesdump/2005/1106/plan9/sys/include/mach.h:216,238 -
/n/sourcesdump/2005/1107/plan9/sys/include/mach.h:217,240
typedef struct Fhdr
{
char *name; /* identifier of executable */
- short type; /* file type - see codes above*/
- short hdrsz; /* size of this header */
+ uchar type; /* file type - see codes above*/
+ uchar hdrsz; /* header size */
+ uchar spare[2];
long magic; /* magic number */
- long txtaddr; /* text address */
- long entry; /* entry point */
+ uvlong txtaddr; /* text address */
+ vlong txtoff; /* start of text in file */
+ uvlong dataddr; /* start of data segment */
+ vlong datoff; /* offset to data seg in file */
+ vlong symoff; /* offset of symbol table in file */
+ uvlong entry; /* entry point */
+ vlong sppcoff; /* offset of sp-pc table in file */
+ vlong lnpcoff; /* offset of line number-pc table in file */
long txtsz; /* text size */
- long txtoff; /* start of text in file */
- long dataddr; /* start of data segment */
long datsz; /* size of data seg */
- long datoff; /* offset to data seg in file */
long bsssz; /* size of bss */
long symsz; /* size of symbol table */
- long symoff; /* offset of symbol table in file */
long sppcsz; /* size of sp-pc table */
- long sppcoff; /* offset of sp-pc table in file */
long lnpcsz; /* size of line number-pc table */
- long lnpcoff; /* size of line number-pc table */
} Fhdr;
extern int asstype; /* dissembler type - machdata.c */
/n/sourcesdump/2005/1106/plan9/sys/include/mach.h:243,266 -
/n/sourcesdump/2005/1107/plan9/sys/include/mach.h:245,269
int beieeesftos(char*, int, void*);
int beieeedftos(char*, int, void*);
ushort beswab(ushort);
- long beswal(long);
- vlong beswav(vlong);
- int cisctrace(Map*, ulong, ulong, ulong, Tracer);
- ulong ciscframe(Map*, ulong, ulong, ulong, ulong);
+ ulong beswal(ulong);
+ uvlong beswav(uvlong);
+ uvlong ciscframe(Map*, uvlong, uvlong, uvlong, uvlong);
+ int cisctrace(Map*, uvlong, uvlong, uvlong, Tracer);
int crackhdr(int fd, Fhdr*);
- long file2pc(char*, ulong);
+ uvlong file2pc(char*, long);
int fileelem(Sym**, uchar *, char*, int);
- int fileline(char*, int, ulong);
+ long fileline(char*, int, uvlong);
int filesym(int, char*, int);
int findlocal(Symbol*, char*, Symbol*);
int findseg(Map*, char*);
- int findsym(long, int, Symbol *);
- int fnbound(long, ulong*);
+ int findsym(uvlong, int, Symbol *);
+ int fnbound(uvlong, uvlong*);
int fpformat(Map*, Reglist*, char*, int, int);
- int get1(Map*, ulong, uchar*, int);
- int get2(Map*, ulong, ushort*);
- int get4(Map*, ulong, long*);
- int get8(Map*, ulong, vlong*);
+ int get1(Map*, uvlong, uchar*, int);
+ int get2(Map*, uvlong, ushort*);
+ int get4(Map*, uvlong, ulong*);
+ int get8(Map*, uvlong, uvlong*);
+ int geta(Map*, uvlong, uvlong*);
int getauto(Symbol*, int, int, Symbol*);
Sym* getsym(int);
int globalsym(Symbol *, int);
/n/sourcesdump/2005/1106/plan9/sys/include/mach.h:272,282 -
/n/sourcesdump/2005/1107/plan9/sys/include/mach.h:275,285
int leieeesftos(char*, int, void*);
int leieeedftos(char*, int, void*);
ushort leswab(ushort);
- long leswal(long);
- vlong leswav(vlong);
- long line2addr(ulong, ulong, ulong);
+ ulong leswal(ulong);
+ uvlong leswav(uvlong);
+ uvlong line2addr(long, uvlong, uvlong);
Map* loadmap(Map*, int, Fhdr*);
- int localaddr(Map*, char*, char*, long*, Rgetter);
+ int localaddr(Map*, char*, char*, uvlong*, Rgetter);
int localsym(Symbol*, int);
int lookup(char*, char*, Symbol*);
void machbytype(int);
/n/sourcesdump/2005/1106/plan9/sys/include/mach.h:285,304 -
/n/sourcesdump/2005/1107/plan9/sys/include/mach.h:288,308
Map* newmap(Map*, int);
void objtraverse(void(*)(Sym*, void*), void*);
int objtype(Biobuf*, char**);
- long pc2sp(ulong);
- long pc2line(ulong);
- int put1(Map*, ulong, uchar*, int);
- int put2(Map*, ulong, ushort);
- int put4(Map*, ulong, long);
- int put8(Map*, ulong, vlong);
- int readar(Biobuf*, int, int, int);
+ uvlong pc2sp(uvlong);
+ long pc2line(uvlong);
+ int put1(Map*, uvlong, uchar*, int);
+ int put2(Map*, uvlong, ushort);
+ int put4(Map*, uvlong, ulong);
+ int put8(Map*, uvlong, uvlong);
+ int puta(Map*, uvlong, uvlong);
+ int readar(Biobuf*, int, vlong, int);
int readobj(Biobuf*, int);
- ulong riscframe(Map*, ulong, ulong, ulong, ulong);
- int risctrace(Map*, ulong, ulong, ulong, Tracer);
- int setmap(Map*, int, ulong, ulong, ulong, char*);
+ uvlong riscframe(Map*, uvlong, uvlong, uvlong, uvlong);
+ int risctrace(Map*, uvlong, uvlong, uvlong, Tracer);
+ int setmap(Map*, int, uvlong, uvlong, vlong, char*);
Sym* symbase(long*);
int syminit(int, Fhdr*);
- int symoff(char*, int, long, int);
- void textseg(ulong, Fhdr*);
+ int symoff(char*, int, uvlong, int);
+ void textseg(uvlong, Fhdr*);
int textsym(Symbol*, int);
void unusemap(Map*, int);
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 4080 Nov 6 10:02 sys/src/libmach/0.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/0.c:130,137 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/0.c:130,138
"setR30", /* static base register name */
0, /* SB value */
0x1000, /* page size */
- 0xC0000000, /* kernel base */
- 0x40000000, /* kernel text mask */
+ 0xC0000000ULL, /* kernel base */
+ 0x40000000ULL, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
4, /* quantization of pc */
4, /* szaddr */
8, /* szreg */
[rsc] --rw-rw-r-- M 451989 glenda sys 2074 Nov 6 10:02 sys/src/libmach/2.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2.c:75,82 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2.c:75,83
"a6base", /* static base register name */
0, /* value */
0x2000, /* page size */
- 0x80000000, /* kernel base */
+ 0x80000000ULL, /* kernel base */
0, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
2, /* quantization of pc */
4, /* szaddr */
4, /* szreg */
[rsc] --rw-rw-r-- M 451989 glenda sys 61298 Nov 6 10:03 sys/src/libmach/2db.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:9,18 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:9,18
static char *m68020excep(Map*, Rgetter);
- static int m68020foll(Map*, ulong, Rgetter, ulong*);
- static int m68020inst(Map*, ulong, char, char*, int);
- static int m68020das(Map*, ulong, char*, int);
- static int m68020instlen(Map*, ulong);
+ static int m68020foll(Map*, uvlong, Rgetter, uvlong*);
+ static int m68020inst(Map*, uvlong, char, char*, int);
+ static int m68020das(Map*, uvlong, char*, int);
+ static int m68020instlen(Map*, uvlong);
Machdata m68020mach =
{
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:95,103 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:95,104
{
struct ftype *ft;
int i, size, vec;
- ulong efl[2], stktop;
+ ulong efl[2];
uchar *ef=(uchar*)efl;
- long l;
+ ulong l;
+ uvlong stktop;
short fvo;
/* The kernel proc pointer on a 68020 is always
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:112,118 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:113,120
if ((l&0xfc000000) == 0x04000000) /* if NeXT */
size = 30*2;
else
- size = 46*2; /* 68020 */
+ size = 46*2; /* 68020 */
+ USED(size);
stktop = mach->kbase+mach->pgsize;
for(i=3; i<100; i++){
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:145,151 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:147,153
static char *
m68020excep(Map *map, Rgetter rget)
{
- ulong pc;
+ uvlong pc;
uchar buf[4];
if (m68020ufix(map) < 0)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:381,387 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:383,389
struct inst
{
int n; /* # bytes in instruction */
- ulong addr; /* addr of start of instruction */
+ uvlong addr; /* addr of start of instruction */
ushort raw[4+12]; /* longest instruction: 24 byte packed immediate */
Operand and[2];
char *end; /* end of print buffer */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:906,912 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:908,914
}
static int
- getword(Inst *ip, long offset)
+ getword(Inst *ip, uvlong offset)
{
if (ip->n < nelem(ip->raw)) {
if (get2(mymap, offset, &ip->raw[ip->n++]) > 0)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:1314,1320 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:1316,1322
plocal(Inst *ip, Operand *ap)
{
int ret, offset;
- long moved;
+ uvlong moved;
Symbol s;
offset = ap->disp;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:1979,1985 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:1981,1987
}
static int
- m68020instlen(Map *map, ulong pc)
+ m68020instlen(Map *map, uvlong pc)
{
Inst i;
Optable *op;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:1994,2003 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:1996,2006
}
static int
- m68020foll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+ m68020foll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
{
int j;
Inst i;
+ ulong l;
Optable *op;
mymap = map;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:2019,2026 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:2022,2030
foll[1] = pc+2+i.and[j].immediate;
return 2;
case STACK: /* RTR, RTS, RTD */
- if (get4(map, (*rget)(map, mach->sp), (long*) foll) < 0)
+ if (get4(map, (*rget)(map, mach->sp), &l) < 0)
return -1;
+ *foll = l;
return 1;
default:
break;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:2031,2037 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:2035,2041
}
static int
- m68020inst(Map *map, ulong pc, char modifier, char *buf, int n)
+ m68020inst(Map *map, uvlong pc, char modifier, char *buf, int n)
{
Inst i;
Optable *op;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/2db.c:2057,2063 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/2db.c:2061,2067
}
static int
- m68020das(Map *map, ulong pc, char *buf, int n)
+ m68020das(Map *map, uvlong pc, char *buf, int n)
{
Inst i;
Optable *op;
[rsc] --rw-rw-r-- M 451989 glenda sys 1553 Nov 6 10:03 sys/src/libmach/5.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5.c:53,60 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5.c:53,61
"setR12", /* static base register name */
0, /* static base register value */
0x1000, /* page size */
- 0xC0000000, /* kernel base */
+ 0xC0000000ULL, /* kernel base */
0, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
4, /* quantization of pc */
4, /* szaddr */
4, /* szreg */
[rsc] --rw-rw-r-- M 451989 glenda sys 21545 Nov 6 10:03 sys/src/libmach/5db.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:18,24 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:18,24
{
Map *map;
ulong w;
- ulong addr;
+ uvlong addr;
uchar op; /* super opcode */
uchar cond; /* bits 28-31 */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:39,45 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:39,45
{
char* o;
void (*fmt)(Opcode*, Instr*);
- ulong (*foll)(Map*, Rgetter, Instr*, ulong);
+ uvlong (*foll)(Map*, Rgetter, Instr*, uvlong);
char* a;
};
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:51,60 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:51,60
*/
static char *armexcep(Map*, Rgetter);
- static int armfoll(Map*, ulong, Rgetter, ulong*);
- static int arminst(Map*, ulong, char, char*, int);
- static int armdas(Map*, ulong, char*, int);
- static int arminstlen(Map*, ulong);
+ static int armfoll(Map*, uvlong, Rgetter, uvlong*);
+ static int arminst(Map*, uvlong, char, char*, int);
+ static int armdas(Map*, uvlong, char*, int);
+ static int arminstlen(Map*, uvlong);
/*
* Debugger interface
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:82,91 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:82,91
static char*
armexcep(Map *map, Rgetter rget)
{
- long c;
+ uvlong c;
c = (*rget)(map, "TYPE");
- switch (c&0x1f) {
+ switch ((int)c&0x1f) {
case 0x11:
return "Fiq interrupt";
case 0x12:
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:196,204 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:196,204
}
static int
- decode(Map *map, ulong pc, Instr *i)
+ decode(Map *map, uvlong pc, Instr *i)
{
- long w;
+ ulong w;
if(get4(map, pc, &w) < 0) {
werrstr("can't read instruction: %r");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:232,238 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:232,238
int offset;
if(!findsym(i->addr, CTEXT, &s)) {
- if(debug)fprint(2,"fn not found @%lux: %r\n", i->addr);
+ if(debug)fprint(2,"fn not found @%llux: %r\n", i->addr);
return 0;
}
fn = s.name;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:460,466 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:460,466
static int
armcondpass(Map *map, Rgetter rget, uchar cond)
{
- ulong psr;
+ uvlong psr;
uchar n;
uchar z;
uchar c;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:591,597 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:591,597
}
}
- static ulong
+ static uvlong
armaddr(Map *map, Rgetter rget, Instr *i)
{
char buf[8];
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:637,644 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:637,644
}
}
- static ulong
- armfadd(Map *map, Rgetter rget, Instr *i, ulong pc)
+ static uvlong
+ armfadd(Map *map, Rgetter rget, Instr *i, uvlong pc)
{
char buf[8];
int r;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:653,660 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:653,660
return rget(map, buf) + armshiftval(map, rget, i);
}
- static ulong
- armfmovm(Map *map, Rgetter rget, Instr *i, ulong pc)
+ static uvlong
+ armfmovm(Map *map, Rgetter rget, Instr *i, uvlong pc)
{
ulong v;
ulong addr;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:664,670 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:664,670
return pc+4;
addr = armmaddr(map, rget, i) + nbits(i->w & BITS(0,15));
- if(get4(map, addr, (long*)&v) < 0) {
+ if(get4(map, addr, &v) < 0) {
werrstr("can't read addr: %r");
return -1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:671,678 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:671,678
return v;
}
- static ulong
- armfbranch(Map *map, Rgetter rget, Instr *i, ulong pc)
+ static uvlong
+ armfbranch(Map *map, Rgetter rget, Instr *i, uvlong pc)
{
if(!armcondpass(map, rget, (i->w >> 28) & 0xf))
return pc+4;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:680,690 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:680,689
return pc + (((signed long)i->w << 8) >> 6) + 8;
}
- static ulong
- armfmov(Map *map, Rgetter rget, Instr *i, ulong pc)
+ static uvlong
+ armfmov(Map *map, Rgetter rget, Instr *i, uvlong pc)
{
- ulong rd;
- ulong v;
+ ulong rd, v;
rd = (i->w >> 12) & 0xf;
if(rd != 15 || !armcondpass(map, rget, (i->w>>28)&0xf))
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:693,699 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:692,698
/* LDR */
/* BUG: Needs LDH/B, too */
if((i->w>>26)&0x3 == 1) {
- if(get4(map, armaddr(map, rget, i), (long*)&v) < 0) {
+ if(get4(map, armaddr(map, rget, i), &v) < 0) {
werrstr("can't read instruction: %r");
return pc+4;
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:910,916 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:909,915
fmt = "#%lx(R%d)";
if (i->rn == 15) {
/* convert load of offset(PC) to a load immediate */
- if (get4(i->map, i->addr+i->imm+8, &i->imm) > 0)
+ if (get4(i->map, i->addr+i->imm+8, (ulong*)&i->imm) > 0)
{
g = 1;
fmt = "";
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:921,927 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:920,926
if (i->rd == 11) {
ulong nxti;
- if (get4(i->map, i->addr+4, (long*)&nxti) > 0) {
+ if (get4(i->map, i->addr+4, &nxti) > 0) {
if ((nxti & 0x0e0f0fff) == 0x060c000b) {
i->imm += mach->sb;
g = 1;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:1007,1013 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:1006,1012
}
static int
- printins(Map *map, ulong pc, char *buf, int n)
+ printins(Map *map, uvlong pc, char *buf, int n)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:1021,1027 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:1020,1026
}
static int
- arminst(Map *map, ulong pc, char modifier, char *buf, int n)
+ arminst(Map *map, uvlong pc, char modifier, char *buf, int n)
{
USED(modifier);
return printins(map, pc, buf, n);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:1028,1034 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:1027,1033
}
static int
- armdas(Map *map, ulong pc, char *buf, int n)
+ armdas(Map *map, uvlong pc, char *buf, int n)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:1043,1049 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:1042,1048
}
static int
- arminstlen(Map *map, ulong pc)
+ arminstlen(Map *map, uvlong pc)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/5db.c:1053,1061 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/5db.c:1052,1060
}
static int
- armfoll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+ armfoll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
{
- ulong d;
+ uvlong d;
Instr i;
if(decode(map, pc, &i) < 0)
[rsc] --rw-rw-r-- M 451989 jmk sys 3464 Nov 6 10:03 sys/src/libmach/6.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/6.c:2,17 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/6.c:2,14
* amd64 definition
*/
#include <u.h>
+ #include <libc.h>
#include <bio.h>
#include "/amd64/include/ureg.h"
#include <mach.h>
- #define REGOFF(x) (uvlong)(&((struct Ureg *) 0)->x)
+ #define REGOFF(x) offsetof(struct Ureg, x)
- #define PC REGOFF(ip)
- #define SP REGOFF(sp)
- #define AX REGOFF(ax)
-
#define REGSIZE sizeof(struct Ureg)
#define FP_CTLS(x) (REGSIZE+2*(x))
#define FP_CTL(x) (REGSIZE+4*(x))
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/6.c:26,32 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/6.c:23,29
{"CX", REGOFF(cx), RINT, 'Y'},
{"DX", REGOFF(dx), RINT, 'Y'},
{"SI", REGOFF(si), RINT, 'Y'},
- {"DI", REGOFF(di), RINT, 'X'},
+ {"DI", REGOFF(di), RINT, 'Y'},
{"BP", REGOFF(bp), RINT, 'Y'},
{"R8", REGOFF(r8), RINT, 'Y'},
{"R9", REGOFF(r9), RINT, 'Y'},
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/6.c:41,61 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/6.c:38,60
{"FS", REGOFF(fs), RINT, 'x'},
{"GS", REGOFF(gs), RINT, 'x'},
{"TYPE", REGOFF(type), RINT, 'Y'},
+ {"TRAP", REGOFF(type), RINT, 'Y'}, /* alias for acid */
{"ERROR", REGOFF(error), RINT, 'Y'},
- {"PC", PC, RINT, 'Y'},
+ {"IP", REGOFF(ip), RINT, 'Y'},
+ {"PC", REGOFF(ip), RINT, 'Y'}, /* alias for acid */
{"CS", REGOFF(cs), RINT, 'Y'},
{"FLAGS", REGOFF(flags), RINT, 'Y'},
- {"SP", SP, RINT, 'Y'},
+ {"SP", REGOFF(sp), RINT, 'Y'},
{"SS", REGOFF(ss), RINT, 'Y'},
{"FCW", FP_CTLS(0), RFLT, 'x'},
{"FSW", FP_CTLS(1), RFLT, 'x'},
- {"FTW", FP_CTLS(2), RFLT, 'x'},
+ {"FTW", FP_CTLS(2), RFLT, 'b'},
{"FOP", FP_CTLS(3), RFLT, 'x'},
- {"FPC", FP_CTL(2), RFLT, 'Y'},
+ {"RIP", FP_CTL(2), RFLT, 'Y'},
{"RDP", FP_CTL(4), RFLT, 'Y'},
{"MXCSR", FP_CTL(6), RFLT, 'X'},
- {"MXCSRMSK", FP_CTL(7), RFLT, 'X'},
+ {"MXCSRMASK", FP_CTL(7), RFLT, 'X'},
{"M0", FP_REG(0), RFLT, 'F'}, /* assumes double */
{"M1", FP_REG(1), RFLT, 'F'},
{"M2", FP_REG(2), RFLT, 'F'},
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/6.c:97,117 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/6.c:96,117
Mach mamd64=
{
"amd64",
- MI386, /* machine type */ /* TO DO */
- amd64reglist, /* register list */
- REGSIZE, /* size of registers in bytes */
- FPREGSIZE, /* size of fp registers in bytes */
- "PC", /* name of PC */
- "SP", /* name of SP */
- 0, /* link register */
- "setSB", /* static base register name (bogus anyways) */
- 0, /* static base register value */
- 0x1000, /* page size */
- 0x80110000, /* kernel base */ /* TO DO: uvlong or vlong */
- 0, /* kernel text mask */
- 1, /* quantization of pc */
- 8, /* szaddr */
- 4, /* szreg */
- 4, /* szfloat */
- 8, /* szdouble */
+ MAMD64, /* machine type */
+ amd64reglist, /* register list */
+ REGSIZE, /* size of registers in bytes */
+ FPREGSIZE, /* size of fp registers in bytes */
+ "PC", /* name of PC */
+ "SP", /* name of SP */
+ 0, /* link register */
+ "setSB", /* static base register name (bogus anyways) */
+ 0, /* static base register value */
+ 0x1000, /* page size */
+ 0xFFFFFFFF80110000ULL, /* kernel base */
+ 0, /* kernel text mask */
+ 0x00007FFFFFFFF000ULL, /* user stack top */
+ 1, /* quantization of pc */
+ 8, /* szaddr */
+ 4, /* szreg */
+ 4, /* szfloat */
+ 8, /* szdouble */
};
[rsc] --rw-rw-r-- M 451989 glenda sys 3299 Nov 6 10:03 sys/src/libmach/7.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7.c:103,110 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7.c:103,111
"setSB", /* static base register name */
0, /* static base register value */
0x2000, /* page size */
- 0x80000000, /* kernel base */
- 0x00000000, /* kernel text mask */
+ 0x80000000ULL, /* kernel base */
+ 0, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
4, /* quantization of pc */
4, /* szaddr */
8, /* szreg (not used?) */
[rsc] --rw-rw-r-- M 451989 glenda sys 17330 Nov 6 10:03 sys/src/libmach/7db.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:7,16 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:7,16
*/
static char *alphaexcep(Map*, Rgetter);
- static int alphafoll(Map*, ulong, Rgetter, ulong*);
- static int alphainst(Map*, ulong, char, char*, int);
- static int alphadas(Map*, ulong, char*, int);
- static int alphainstlen(Map*, ulong);
+ static int alphafoll(Map*, uvlong, Rgetter, uvlong*);
+ static int alphainst(Map*, uvlong, char, char*, int);
+ static int alphadas(Map*, uvlong, char*, int);
+ static int alphainstlen(Map*, uvlong);
/*
* Debugger interface
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:86,92 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:86,92
static char FRAMENAME[] = ".frame";
typedef struct {
- ulong addr;
+ uvlong addr;
uchar op; /* bits 31-26 */
uchar ra; /* bits 25-21 */
uchar rb; /* bits 20-16 */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:109,117 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:109,117
static Map *mymap;
static int
- decode(ulong pc, Instr *i)
+ decode(uvlong pc, Instr *i)
{
- long w;
+ ulong w;
if (get4(mymap, pc, &w) < 0) {
werrstr("can't read instruction: %r");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:140,146 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:140,146
}
static int
- mkinstr(ulong pc, Instr *i)
+ mkinstr(uvlong pc, Instr *i)
{
/* Instr x; */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:397,406 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:397,406
"OPC07", 0, alphaxxx,
"MOVQA", load, alphaload,
"MOVQAH", load, alphaload,
- "MOVBU", load, alphaload, /* v 3 */
+ "MOVBU", load, alphaload, /* v 3 */
"MOVQU", load, alphaload,
"MOVWU", load, alphaload, /* v 3 */
- "MOVWU", store, alphastore, /* v 3 */
+ "MOVWU", store, alphastore, /* v 3 */
"MOVBU", store, alphastore, /* v 3 */
"MOVQU", store, alphastore,
0, 0, 0, /* int arith */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:412,424 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:412,424
0, 0, 0, /* ieee */
0, 0, 0, /* fp */
0, misc, alphaxxx,
- "PAL19 [HW_MFPR]", 0, alphaxxx,
+ "PAL19 [HW_MFPR]",0, alphaxxx,
"JSR", jmp, 0,
- "PAL1B [HW_LD]", 0, alphaxxx,
+ "PAL1B [HW_LD]",0, alphaxxx,
"OPC1C", 0, alphaxxx,
- "PAL1D [HW_MTPR]", 0, alphaxxx,
- "PAL1E [HW_REI]", 0, alphaxxx,
- "PAL1F [HW_ST]", 0, alphaxxx,
+ "PAL1D [HW_MTPR]",0, alphaxxx,
+ "PAL1E [HW_REI]",0, alphaxxx,
+ "PAL1F [HW_ST]",0, alphaxxx,
"MOVF", loadf, alphafload,
"MOVG", loadf, alphafload,
"MOVS", loadf, alphafload,
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:804,810 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:804,810
}
static int
- printins(Map *map, ulong pc, char *buf, int n)
+ printins(Map *map, uvlong pc, char *buf, int n)
{
Instr i;
Opcode *o;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:855,861 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:855,861
}
static int
- alphainst(Map *map, ulong pc, char modifier, char *buf, int n)
+ alphainst(Map *map, uvlong pc, char modifier, char *buf, int n)
{
USED(modifier);
return printins(map, pc, buf, n);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:862,868 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:862,868
}
static int
- alphadas(Map *map, ulong pc, char *buf, int n)
+ alphadas(Map *map, uvlong pc, char *buf, int n)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:882,888 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:882,888
}
static int
- alphainstlen(Map *map, ulong pc)
+ alphainstlen(Map *map, uvlong pc)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/7db.c:893,899 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/7db.c:893,899
}
static int
- alphafoll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+ alphafoll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
{
char buf[8];
Instr i;
[rsc] --rw-rw-r-- M 451989 glenda sys 2060 Nov 6 10:03 sys/src/libmach/8.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8.c:68,75 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8.c:68,76
"setSB", /* static base register name (bogus anyways) */
0, /* static base register value */
0x1000, /* page size */
- 0x80100000, /* kernel base */
+ 0x80100000ULL, /* kernel base */
0, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
1, /* quantization of pc */
4, /* szaddr */
4, /* szreg */
[rsc] --rw-rw-r-- M 451989 glenda sys 50612 Nov 6 10:03 sys/src/libmach/8db.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:10,21 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:10,21
static char *i386excep(Map*, Rgetter);
- static int i386trace(Map*, ulong, ulong, ulong, Tracer);
- static ulong i386frame(Map*, ulong, ulong, ulong, ulong);
- static int i386foll(Map*, ulong, Rgetter, ulong*);
- static int i386inst(Map*, ulong, char, char*, int);
- static int i386das(Map*, ulong, char*, int);
- static int i386instlen(Map*, ulong);
+ static int i386trace(Map*, uvlong, uvlong, uvlong, Tracer);
+ static uvlong i386frame(Map*, uvlong, uvlong, uvlong, uvlong);
+ static int i386foll(Map*, uvlong, Rgetter, uvlong*);
+ static int i386inst(Map*, uvlong, char, char*, int);
+ static int i386das(Map*, uvlong, char*, int);
+ static int i386instlen(Map*, uvlong);
static char STARTSYM[] = "_main";
static char PROFSYM[] = "_mainp";
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:74,80 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:74,80
i386excep(Map *map, Rgetter rget)
{
ulong c;
- ulong pc;
+ uvlong pc;
static char buf[16];
c = (*rget)(map, "TRAP");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:85,91 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:85,91
if (memcmp(buf, machdata->bpinst, machdata->bpsize) == 0)
return "breakpoint";
}
- sprint(buf, "exception %ld", c);
+ snprint(buf, sizeof(buf), "exception %ld", c);
return buf;
} else
return excname[c];
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:92,101 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:92,101
}
static int
- i386trace(Map *map, ulong pc, ulong sp, ulong link, Tracer trace)
+ i386trace(Map *map, uvlong pc, uvlong sp, uvlong link, Tracer trace)
{
int i;
- ulong osp;
+ uvlong osp;
Symbol s, f;
USED(link);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:115,121 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:115,121
sp += f.value-mach->szaddr;
}
- if (get4(map, sp, (long *) &pc) < 0)
+ if (geta(map, sp, &pc) < 0)
break;
if(pc == 0)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:130,137 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:130,137
return i;
}
- static ulong
- i386frame(Map *map, ulong addr, ulong pc, ulong sp, ulong link)
+ static uvlong
+ i386frame(Map *map, uvlong addr, uvlong pc, uvlong sp, uvlong link)
{
Symbol s, f;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:149,155 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:149,155
if (s.value == addr)
return sp;
- if (get4(map, sp, (long *)&pc) < 0)
+ if (geta(map, sp, &pc) < 0)
break;
sp += mach->szaddr;
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:165,177 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:165,177
struct Instr
{
uchar mem[1+1+1+1+2+1+1+4+4]; /* raw instruction */
- ulong addr; /* address of start of instruction */
+ uvlong addr; /* address of start of instruction */
int n; /* number of bytes in instruction */
char *prefix; /* instr prefix */
char *segment; /* segment override */
uchar jumptype; /* set to the operand type for jump/ret/call */
uchar amd64;
- uchar rex; /* REX prefix (or zero) */
+ uchar rex; /* REX prefix (or zero) */
char osize; /* 'W' or 'L' (or 'Q' on amd64) */
char asize; /* address size 'W' or 'L' (or 'Q' or amd64) */
uchar mod; /* bits 6-7 of mod r/m field */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:179,191 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:179,191
char ss; /* bits 6-7 of SIB */
char index; /* bits 3-5 of SIB */
char base; /* bits 0-2 of SIB */
- char rip; /* RIP-relative in amd64 mode */
- uchar opre; /* f2/f3 could introduce media */
+ char rip; /* RIP-relative in amd64 mode */
+ uchar opre; /* f2/f3 could introduce media */
short seg; /* segment of far address */
ulong disp; /* displacement */
ulong imm; /* immediate */
ulong imm2; /* second immediate operand */
- uvlong imm64; /* big immediate */
+ uvlong imm64; /* big immediate */
char *curr; /* fill level in output buffer */
char *end; /* end of output buffer */
char *err; /* error message */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:215,221 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:215,221
/* amd64 rex extension byte */
enum{
- REXW = 1<<3, /* =1, 64-bit operand size */
+ REXW = 1<<3, /* =1, 64-bit operand size */
REXR = 1<<2, /* extend modrm reg */
REXX = 1<<1, /* extend sib index */
REXB = 1<<0 /* extend modrm r/m, sib base, or opcode reg */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:255,261 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:255,261
Iw, /* 16-bit immediate -> imm */
Iw2, /* 16-bit immediate -> imm2 */
Iwd, /* Operand-sized immediate (no sign extension)*/
- Iwdq, /* Operand-sized immediate, possibly 64 bits */
+ Iwdq, /* Operand-sized immediate, possibly 64 bits */
Awd, /* Address offset */
Iwds, /* Operand-sized immediate (sign extended) */
RM, /* Word or long R/M field with register (/r) */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:273,281 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:273,281
OA, /* literal 0x0a byte */
PTR, /* Seg:Displacement addr (ptr16:16 or ptr16:32) */
AUX, /* Multi-byte op code - Auxiliary table */
- AUXMM, /* multi-byte op code - auxiliary table chosen by prefix */
+ AUXMM, /* multi-byte op code - auxiliary table chosen by prefix */
PRE, /* Instr Prefix */
- OPRE, /* Instr Prefix or media op extension */
+ OPRE, /* Instr Prefix or media op extension */
SEG, /* Segment Prefix */
OPOVER, /* Operand size override */
ADDOVER, /* Address size override */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:299,305 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:299,305
[0x03] 0,0, "MOVL %e,IDTR",
[0x04] 0,0, "MOVW MSW,%e", /* word */
[0x06] 0,0, "MOVW %e,MSW", /* word */
- [0x07] 0,0, "INVLPG %e", /* TO DO: distinguish SWAPGS? */
+ [0x07] 0,0, "INVLPG %e", /* TO DO: distinguish SWAPGS? */
};
/* 0F71 */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:330,358 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:330,358
static Optable optab0F0F[256]=
{
- [0x0c] 0,0, "PI2FW %m,%M",
- [0x0d] 0,0, "PI2L %m,%M",
- [0x1c] 0,0, "PF2IW %m,%M",
- [0x1d] 0,0, "PF2IL %m,%M",
- [0x8a] 0,0, "PFNACC %m,%M",
- [0x8e] 0,0, "PFPNACC %m,%M",
- [0x90] 0,0, "PFCMPGE %m,%M",
- [0x94] 0,0, "PFMIN %m,%M",
- [0x96] 0,0, "PFRCP %m,%M",
- [0x97] 0,0, "PFRSQRT %m,%M",
- [0x9a] 0,0, "PFSUB %m,%M",
- [0x9e] 0,0, "PFADD %m,%M",
- [0xa0] 0,0, "PFCMPGT %m,%M",
- [0xa4] 0,0, "PFMAX %m,%M",
- [0xa6] 0,0, "PFRCPIT1 %m,%M",
- [0xa7] 0,0, "PFRSQIT1 %m,%M",
- [0xaa] 0,0, "PFSUBR %m,%M",
- [0xae] 0,0, "PFACC %m,%M",
- [0xb0] 0,0, "PFCMPEQ %m,%M",
- [0xb4] 0,0, "PFMUL %m,%M",
- [0xb6] 0,0, "PFRCPI2T %m,%M",
- [0xb7] 0,0, "PMULHRW %m,%M",
- [0xbb] 0,0, "PSWAPL %m,%M",
+ [0x0c] 0,0, "PI2FW %m,%M",
+ [0x0d] 0,0, "PI2L %m,%M",
+ [0x1c] 0,0, "PF2IW %m,%M",
+ [0x1d] 0,0, "PF2IL %m,%M",
+ [0x8a] 0,0, "PFNACC %m,%M",
+ [0x8e] 0,0, "PFPNACC %m,%M",
+ [0x90] 0,0, "PFCMPGE %m,%M",
+ [0x94] 0,0, "PFMIN %m,%M",
+ [0x96] 0,0, "PFRCP %m,%M",
+ [0x97] 0,0, "PFRSQRT %m,%M",
+ [0x9a] 0,0, "PFSUB %m,%M",
+ [0x9e] 0,0, "PFADD %m,%M",
+ [0xa0] 0,0, "PFCMPGT %m,%M",
+ [0xa4] 0,0, "PFMAX %m,%M",
+ [0xa6] 0,0, "PFRCPIT1 %m,%M",
+ [0xa7] 0,0, "PFRSQIT1 %m,%M",
+ [0xaa] 0,0, "PFSUBR %m,%M",
+ [0xae] 0,0, "PFACC %m,%M",
+ [0xb0] 0,0, "PFCMPEQ %m,%M",
+ [0xb4] 0,0, "PFMUL %m,%M",
+ [0xb6] 0,0, "PFRCPI2T %m,%M",
+ [0xb7] 0,0, "PMULHRW %m,%M",
+ [0xbb] 0,0, "PSWAPL %m,%M",
};
static Optable optab0FC7[8]=
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:385,392 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:385,392
static Optable optab660F[256]=
{
[0x2B] RM,0, "MOVNTPD %x,%e",
- [0x2E] RM,0, "UCOMISD %x,%X",
- [0x2F] RM,0, "COMISD %x,%X",
+ [0x2E] RM,0, "UCOMISD %x,%X",
+ [0x2F] RM,0, "COMISD %x,%X",
[0x5A] RM,0, "CVTPD2PS %x,%X",
[0x5B] RM,0, "CVTPS2PL %x,%X",
[0x6A] RM,0, "PUNPCKHLQ %x,%X",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:394,400 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:394,400
[0x6C] RM,0, "PUNPCKLQDQ %x,%X",
[0x6D] RM,0, "PUNPCKHQDQ %x,%X",
[0x6E] RM,0, "MOV%S %e,%X",
- [0x6F] RM,0, "MOVO %x,%X", /* MOVDQA */
+ [0x6F] RM,0, "MOVO %x,%X", /* MOVDQA */
[0x70] RM,Ib, "PSHUFL %i,%x,%X",
[0x71] RMOP,0, optab660F71,
[0x72] RMOP,0, optab660F72,
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:413,420 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:413,420
static Optable optabF20F[256]=
{
- [0x10] RM,0, "MOVSD %x,%X",
- [0x11] RM,0, "MOVSD %X,%x",
+ [0x10] RM,0, "MOVSD %x,%X",
+ [0x11] RM,0, "MOVSD %X,%x",
[0x2A] RM,0, "CVTS%S2SD %e,%X",
[0x2C] RM,0, "CVTTSD2S%S %x,%r",
[0x2D] RM,0, "CVTSD2S%S %x,%r",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:428,435 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:428,435
static Optable optabF30F[256]=
{
- [0x10] RM,0, "MOVSS %x,%X",
- [0x11] RM,0, "MOVSS %X,%x",
+ [0x10] RM,0, "MOVSS %x,%X",
+ [0x11] RM,0, "MOVSS %X,%x",
[0x2A] RM,0, "CVTS%S2SS %e,%X",
[0x2C] RM,0, "CVTTSS2S%S %x,%r",
[0x2D] RM,0, "CVTSS2S%S %x,%r",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:449,467 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:449,469
[0x01] RMOP,0, optab0F01,
[0x02] RM,0, "LAR %e,%r",
[0x03] RM,0, "LSL %e,%r",
+ [0x05] 0,0, "SYSCALL",
[0x06] 0,0, "CLTS",
[0x07] 0,0, "SYSRET",
[0x08] 0,0, "INVD",
[0x09] 0,0, "WBINVD",
- [0x0F] RM,AUX, optab0F0F, /* 3DNow! */
- [0x10] RM,0, "MOVU%s %x,%X",
- [0x11] RM,0, "MOVU%s %X,%x",
- [0x12] RM,0, "MOV[H]L%s %x,%X", /* TO DO: H if source is XMM */
- [0x13] RM,0, "MOVL%s %X,%e",
- [0x14] RM,0, "UNPCKL%s %x,%X",
- [0x15] RM,0, "UNPCKH%s %x,%X",
- [0x16] RM,0, "MOV[L]H%s %x,%X", /* TO DO: L if source is XMM */
- [0x17] RM,0, "MOVH%s %X,%x",
+ [0x0B] 0,0, "UD2",
+ [0x0F] RM,AUX, optab0F0F, /* 3DNow! */
+ [0x10] RM,0, "MOVU%s %x,%X",
+ [0x11] RM,0, "MOVU%s %X,%x",
+ [0x12] RM,0, "MOV[H]L%s %x,%X", /* TO DO: H if source is XMM */
+ [0x13] RM,0, "MOVL%s %X,%e",
+ [0x14] RM,0, "UNPCKL%s %x,%X",
+ [0x15] RM,0, "UNPCKH%s %x,%X",
+ [0x16] RM,0, "MOV[L]H%s %x,%X", /* TO DO: L if source is XMM */
+ [0x17] RM,0, "MOVH%s %X,%x",
[0x20] RMR,0, "MOVL %C,%e",
[0x21] RMR,0, "MOVL %D,%e",
[0x22] RMR,0, "MOVL %e,%C",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:468,481 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:470,483
[0x23] RMR,0, "MOVL %e,%D",
[0x24] RMR,0, "MOVL %T,%e",
[0x26] RMR,0, "MOVL %e,%T",
- [0x28] RM,0, "MOVA%s %x,%X",
- [0x29] RM,0, "MOVA%s %X,%x",
- [0x2A] RM,0, "CVTPL2%s %m*,%X",
- [0x2B] RM,0, "MOVNT%s %X,%e",
- [0x2C] RM,0, "CVTT%s2PL %x,%M",
- [0x2D] RM,0, "CVT%s2PL %x,%M",
- [0x2E] RM,0, "UCOMISS %x,%X",
- [0x2F] RM,0, "COMISS %x,%X",
+ [0x28] RM,0, "MOVA%s %x,%X",
+ [0x29] RM,0, "MOVA%s %X,%x",
+ [0x2A] RM,0, "CVTPL2%s %m*,%X",
+ [0x2B] RM,0, "MOVNT%s %X,%e",
+ [0x2C] RM,0, "CVTT%s2PL %x,%M",
+ [0x2D] RM,0, "CVT%s2PL %x,%M",
+ [0x2E] RM,0, "UCOMISS %x,%X",
+ [0x2F] RM,0, "COMISS %x,%X",
[0x30] 0,0, "WRMSR",
[0x31] 0,0, "RDTSC",
[0x32] 0,0, "RDMSR",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:500,514 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:502,516
[0x53] RM,0, "RCP%s %x,%X",
[0x54] RM,0, "AND%s %x,%X",
[0x55] RM,0, "ANDN%s %x,%X",
- [0x56] RM,0, "OR%s %x,%X", /* TO DO: S/D */
- [0x57] RM,0, "XOR%s %x,%X", /* S/D */
- [0x58] RM,0, "ADD%s %x,%X", /* S/P S/D */
+ [0x56] RM,0, "OR%s %x,%X", /* TO DO: S/D */
+ [0x57] RM,0, "XOR%s %x,%X", /* S/D */
+ [0x58] RM,0, "ADD%s %x,%X", /* S/P S/D */
[0x59] RM,0, "MUL%s %x,%X",
[0x5A] RM,0, "CVTPS2PD %x,%X",
[0x5B] RM,0, "CVTPL2PS %x,%X",
[0x5C] RM,0, "SUB%s %x,%X",
[0x5D] RM,0, "MIN%s %x,%X",
- [0x5E] RM,0, "DIV%s %x,%X", /* TO DO: S/P S/D */
+ [0x5E] RM,0, "DIV%s %x,%X", /* TO DO: S/P S/D */
[0x5F] RM,0, "MAX%s %x,%X",
[0x60] RM,0, "PUNPCKLBW %m,%M",
[0x61] RM,0, "PUNPCKLWL %m,%M",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:531,537 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:533,539
[0x7E] RM,0, "MOV%S %M,%e",
[0x7F] RM,0, "MOVQ %M,%m",
[0xAE] RMOP,0, optab0FAE,
- [0xAA] 0,0, "RSM",
+ [0xAA] 0,0, "RSM",
[0xB0] RM,0, "CMPXCHGB %r,%e",
[0xB1] RM,0, "CMPXCHG%S %r,%e",
[0xC0] RMB,0, "XADDB %r,%e",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:539,544 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:541,554
[0xC2] RM,Ib, "CMP%s %i,%x,%X",
[0xC3] RM,0, "MOVNTI%S %r,%e",
[0xC6] RM,Ib, "SHUF%s %i,%x,%X",
+ [0xC8] 0,0, "BSWAP AX",
+ [0xC9] 0,0, "BSWAP CX",
+ [0xCA] 0,0, "BSWAP DX",
+ [0xCB] 0,0, "BSWAP BX",
+ [0xCC] 0,0, "BSWAP SP",
+ [0xCD] 0,0, "BSWAP BP",
+ [0xCE] 0,0, "BSWAP SI",
+ [0xCF] 0,0, "BSWAP DI",
[0xD1] RM,0, "PSRLW %m,%M",
[0xD2] RM,0, "PSRLL %m,%M",
[0xD3] RM,0, "PSRLQ %m,%M",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:969,975 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:979,985
[0x0c] Ib,0, "ORB %i,AL",
[0x0d] Iwd,0, "OR%S %i,%OAX",
[0x0e] 0,0, "PUSHL CS",
- [0x0f] AUXMM,0, optab0F,
+ [0x0f] AUXMM,0, optab0F,
[0x10] RMB,0, "ADCB %r,%e",
[0x11] RM,0, "ADC%S %r,%e",
[0x12] RMB,0, "ADCB %e,%r",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:1094,1100 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:1104,1110
[0x8a] RMB,0, "MOVB %e,%r",
[0x8b] RM,0, "MOV%S %e,%r",
[0x8c] RM,0, "MOVW %g,%e",
- [0x8d] RM,0, "LEA %e,%r",
+ [0x8d] RM,0, "LEA%S %e,%r",
[0x8e] RM,0, "MOVW %e,%g",
[0x8f] RM,0, "POP%S %e",
[0x90] 0,0, "NOP",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:1214,1220 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:1224,1230
* get a byte of the instruction
*/
static int
- igetc(Map * map, Instr *ip, uchar *c)
+ igetc(Map *map, Instr *ip, uchar *c)
{
if(ip->n+1 > sizeof(ip->mem)){
werrstr("instruction too long");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:1234,1240 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:1244,1250
static int
igets(Map *map, Instr *ip, ushort *sp)
{
- uchar c;
+ uchar c;
ushort s;
if (igetc(map, ip, &c) < 0)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:1378,1384 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:1388,1394
}
static Optable *
- mkinstr(Map *map, Instr *ip, ulong pc)
+ mkinstr(Map *map, Instr *ip, uvlong pc)
{
int i, n, norex;
uchar c;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:1451,1456 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:1461,1467
ip->imm = c|0xff00;
else
ip->imm = c&0xff;
+ ip->imm64 = (long)ip->imm;
break;
case Iw: /* 16-bit immediate -> imm */
if (igets(map, ip, &s) < 0)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:1819,1825 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:1830,1836
Symbol s;
long w;
- if (findsym((long)val, CANY, &s)) { /* TO DO */
+ if (findsym(val, CANY, &s)) { /* TO DO */
w = val - s.value;
if (w < 0)
w = -w;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:1981,1987 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:1992,2002
bprint(ip,"???");
break;
case 'p':
- immediate(ip, ip->imm+ip->addr+ip->n);
+ /*
+ * signed immediate in the ulong ip->imm.
+ */
+ v = (long)ip->imm;
+ immediate(ip, v+ip->addr+ip->n);
break;
case 'r':
if (ip->osize == 'B')
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:2022,2030 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:2037,2045
}
static int
- i386inst(Map *map, ulong pc, char modifier, char *buf, int n)
+ i386inst(Map *map, uvlong pc, char modifier, char *buf, int n)
{
- Instr instr;
+ Instr instr;
Optable *op;
USED(modifier);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:2040,2048 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:2055,2063
}
static int
- i386das(Map *map, ulong pc, char *buf, int n)
+ i386das(Map *map, uvlong pc, char *buf, int n)
{
- Instr instr;
+ Instr instr;
int i;
if (mkinstr(map, &instr, pc) == 0) {
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:2059,2065 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:2074,2080
}
static int
- i386instlen(Map *map, ulong pc)
+ i386instlen(Map *map, uvlong pc)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:2069,2080 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:2084,2096
}
static int
- i386foll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+ i386foll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
{
Instr i;
Optable *op;
ushort s;
- ulong l, addr;
+ uvlong l, addr;
+ vlong v;
int n;
op = mkinstr(map, &i, pc);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:2087,2101 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:2103,2118
case RET: /* RETURN or LEAVE */
case Iw: /* RETURN */
if (strcmp(op->proto, "LEAVE") == 0) {
- if (get4(map, (*rget)(map, "BP"), (long*)&l) < 0)
+ if (geta(map, (*rget)(map, "BP"), &l) < 0)
return -1;
- } else if (get4(map, (*rget)(map, mach->sp), (long*)&l) < 0)
+ } else if (geta(map, (*rget)(map, mach->sp), &l) < 0)
return -1;
foll[0] = l;
return 1;
case Iwds: /* pc relative JUMP or CALL*/
case Jbs: /* pc relative JUMP or CALL */
- foll[0] = pc+i.imm+i.n;
+ v = (long)i.imm;
+ foll[0] = pc+v+i.n;
n = 1;
break;
case PTR: /* seg:displacement JUMP or CALL */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/8db.c:2110,2131 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/8db.c:2127,2148
/* calculate the effective address */
addr = i.disp;
if (i.base >= 0) {
- if (get4(map, (*rget)(map, reg[i.rex&REXB? i.base+8: i.base]), (long*)&l) < 0)
+ if (geta(map, (*rget)(map, reg[i.rex&REXB? i.base+8: i.base]), &l) < 0)
return -1;
addr += l;
}
if (i.index >= 0) {
- if (get4(map, (*rget)(map, reg[i.rex&REXX? i.index+8: i.index]), (long*)&l) < 0)
+ if (geta(map, (*rget)(map, reg[i.rex&REXX? i.index+8: i.index]), &l) < 0)
return -1;
addr += l*(1<<i.ss);
}
/* now retrieve a seg:disp value at that address */
- if (get2(map, addr, &s) < 0) /* seg */
+ if (get2(map, addr, &s) < 0) /* seg */
return -1;
foll[0] = s<<4;
addr += 2;
if (i.asize == 'L') {
- if (get4(map, addr, (long*)&l) < 0) /* disp32 */
+ if (geta(map, addr, &l) < 0) /* disp32 */
return -1;
foll[0] += l;
} else { /* disp16 */
[rsc] --rw-rw-r-- M 451989 glenda sys 4588 Nov 6 10:02 sys/src/libmach/access.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:7,22 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:7,41
#include <bio.h>
#include <mach.h>
- static int mget(Map*, ulong, char*, int);
- static int mput(Map*, ulong, char*, int);
- static struct segment* reloc(Map*, ulong, long*);
+ static int mget(Map*, uvlong, void*, int);
+ static int mput(Map*, uvlong, void*, int);
+ static struct segment* reloc(Map*, uvlong, vlong*);
/*
* routines to get/put various types
*/
+ int
+ geta(Map *map, uvlong addr, uvlong *x)
+ {
+ ulong l;
+ uvlong vl;
+ if (mach->szaddr == 8){
+ if (get8(map, addr, &vl) < 0)
+ return -1;
+ *x = vl;
+ return 1;
+ }
+
+ if (get4(map, addr, &l) < 0)
+ return -1;
+ *x = l;
+
+ return 1;
+ }
+
int
- get8(Map *map, ulong addr, vlong *x)
+ get8(Map *map, uvlong addr, uvlong *x)
{
if (!map) {
werrstr("get8: invalid map");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:24,40 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:43,59
}
if (map->nsegs == 1 && map->seg[0].fd < 0) {
- *x = (vlong)addr;
+ *x = addr;
return 1;
}
- if (mget(map, addr, (char *)x, 8) < 0)
+ if (mget(map, addr, x, 8) < 0)
return -1;
*x = machdata->swav(*x);
- return (1);
+ return 1;
}
int
- get4(Map *map, ulong addr, long *x)
+ get4(Map *map, uvlong addr, ulong *x)
{
if (!map) {
werrstr("get4: invalid map");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:45,58 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:64,77
*x = addr;
return 1;
}
- if (mget(map, addr, (char *)x, 4) < 0)
+ if (mget(map, addr, x, 4) < 0)
return -1;
*x = machdata->swal(*x);
- return (1);
+ return 1;
}
int
- get2(Map *map, ulong addr, ushort *x)
+ get2(Map *map, uvlong addr, ushort *x)
{
if (!map) {
werrstr("get2: invalid map");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:63,76 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:82,95
*x = addr;
return 1;
}
- if (mget(map, addr, (char *)x, 2) < 0)
+ if (mget(map, addr, x, 2) < 0)
return -1;
*x = machdata->swab(*x);
- return (1);
+ return 1;
}
int
- get1(Map *map, ulong addr, uchar *x, int size)
+ get1(Map *map, uvlong addr, uchar *x, int size)
{
uchar *cp;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:86,108 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:105,136
while (size-- > 0)
*x++ = 0;
} else
- return mget(map, addr, (char*)x, size);
+ return mget(map, addr, x, size);
return 1;
}
int
- put8(Map *map, ulong addr, vlong v)
+ puta(Map *map, uvlong addr, uvlong v)
{
+ if (mach->szaddr == 8)
+ return put8(map, addr, v);
+
+ return put4(map, addr, v);
+ }
+
+ int
+ put8(Map *map, uvlong addr, uvlong v)
+ {
if (!map) {
werrstr("put8: invalid map");
return -1;
}
v = machdata->swav(v);
- return mput(map, addr, (char *)&v, 8);
+ return mput(map, addr, &v, 8);
}
int
- put4(Map *map, ulong addr, long v)
+ put4(Map *map, uvlong addr, ulong v)
{
if (!map) {
werrstr("put4: invalid map");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:109,119 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:137,147
return -1;
}
v = machdata->swal(v);
- return mput(map, addr, (char *)&v, 4);
+ return mput(map, addr, &v, 4);
}
int
- put2(Map *map, ulong addr, ushort v)
+ put2(Map *map, uvlong addr, ushort v)
{
if (!map) {
werrstr("put2: invalid map");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:120,147 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:148,175
return -1;
}
v = machdata->swab(v);
- return mput(map, addr, (char *)&v, 2);
+ return mput(map, addr, &v, 2);
}
int
- put1(Map *map, ulong addr, uchar *v, int size)
+ put1(Map *map, uvlong addr, uchar *v, int size)
{
if (!map) {
werrstr("put1: invalid map");
return -1;
}
- return mput(map, addr, (char *)v, size);
+ return mput(map, addr, v, size);
}
static int
- spread(struct segment *s, char *buf, int n, ulong off)
+ spread(struct segment *s, void *buf, int n, uvlong off)
{
- ulong base;
+ uvlong base;
static struct {
struct segment *s;
char a[8192];
- ulong off;
+ uvlong off;
} cache;
if(s->cache){
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:167,180 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:195,207
}
static int
- mget(Map *map, ulong addr, char *buf, int size)
+ mget(Map *map, uvlong addr, void *buf, int size)
{
- long off;
- uvlong voff;
+ uvlong off;
int i, j, k;
struct segment *s;
- s = reloc(map, addr, &off);
+ s = reloc(map, addr, (vlong*)&off);
if (!s)
return -1;
if (s->fd < 0) {
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:181,191 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:208,217
werrstr("unreadable map");
return -1;
}
- voff = (ulong)off;
for (i = j = 0; i < 2; i++) { /* in case read crosses page */
- k = spread(s, buf, size-j, voff+j);
+ k = spread(s, buf, size-j, off+j);
if (k < 0) {
- werrstr("can't read address %lux: %r", addr);
+ werrstr("can't read address %llux: %r", addr);
return -1;
}
j += k;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:192,206 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:218,231
if (j == size)
return j;
}
- werrstr("partial read at address %lux", addr);
+ werrstr("partial read at address %llux (size %d j %d)", addr, size, j);
return -1;
}
static int
- mput(Map *map, ulong addr, char *buf, int size)
+ mput(Map *map, uvlong addr, void *buf, int size)
{
- long off;
- vlong voff;
+ vlong off;
int i, j, k;
struct segment *s;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:212,223 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:237,247
return -1;
}
- voff = (ulong)off;
- seek(s->fd, voff, 0);
+ seek(s->fd, off, 0);
for (i = j = 0; i < 2; i++) { /* in case read crosses page */
k = write(s->fd, buf, size-j);
if (k < 0) {
- werrstr("can't write address %lux: %r", addr);
+ werrstr("can't write address %llux: %r", addr);
return -1;
}
j += k;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:224,230 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:248,254
if (j == size)
return j;
}
- werrstr("partial write at address %lux", addr);
+ werrstr("partial write at address %llux", addr);
return -1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:232,238 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:256,262
* convert address to file offset; returns nonzero if ok
*/
static struct segment*
- reloc(Map *map, ulong addr, long *offp)
+ reloc(Map *map, uvlong addr, vlong *offp)
{
int i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/access.c:243,248 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/access.c:267,272
return &map->seg[i];
}
}
- werrstr("can't translate address %lux", addr);
+ werrstr("can't translate address %llux", addr);
return 0;
}
[rsc] --rw-rw-r-- M 451989 glenda sys 16128 Nov 6 10:02 sys/src/libmach/executable.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:12,25 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:12,28
typedef struct {
union{
- Exec; /* in a.out.h */
- Ehdr; /* in elf.h */
- struct mipsexec;
- struct mips4kexec;
- struct sparcexec;
- struct nextexec;
+ struct {
+ Exec; /* a.out.h */
+ uvlong hdr[1];
+ };
+ Ehdr; /* elf.h */
+ struct mipsexec; /* bootexec.h */
+ struct mips4kexec; /* bootexec.h */
+ struct sparcexec; /* bootexec.h */
+ struct nextexec; /* bootexec.h */
} e;
- long dummy; /* padding to ensure extra long */
+ long dummy; /* padding to ensure extra long */
} ExecHdr;
static int nextboot(int, Fhdr*, ExecHdr*);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:27,42 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:30,45
static int mipsboot(int, Fhdr*, ExecHdr*);
static int mips4kboot(int, Fhdr*, ExecHdr*);
static int common(int, Fhdr*, ExecHdr*);
+ static int commonllp64(int, Fhdr*, ExecHdr*);
static int adotout(int, Fhdr*, ExecHdr*);
static int elfdotout(int, Fhdr*, ExecHdr*);
static int armdotout(int, Fhdr*, ExecHdr*);
static int alphadotout(int, Fhdr*, ExecHdr*);
- static void setsym(Fhdr*, long, long, long, long);
- static void setdata(Fhdr*, long, long, long, long);
- static void settext(Fhdr*, long, long, long, long);
- static void hswal(long*, int, long(*)(long));
- static long noswal(long);
- static ulong _round(ulong, ulong);
+ static void setsym(Fhdr*, long, long, long, vlong);
+ static void setdata(Fhdr*, uvlong, long, vlong, long);
+ static void settext(Fhdr*, uvlong, uvlong, long, vlong);
+ static void hswal(void*, int, ulong(*)(ulong));
+ static uvlong _round(uvlong, ulong);
/*
* definition of per-executable file type structures
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:48,55 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:51,58
char *dlmname; /* dynamically loadable module identifier */
int type; /* Internal code */
Mach *mach; /* Per-machine data */
- ulong hsize; /* header size */
- long (*swal)(long); /* beswal or leswal */
+ long hsize; /* header size */
+ ulong (*swal)(ulong); /* beswal or leswal */
int (*hparse)(int, Fhdr*, ExecHdr*);
} ExecTable;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:160,168 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:163,171
"amd64 plan 9 dlm",
FAMD64,
&mamd64,
- sizeof(Exec),
- beswal,
- common },
+ sizeof(Exec)+8,
+ nil,
+ commonllp64 },
{ Q_MAGIC, /* PowerPC q.out & boot image */
"power plan 9 executable",
"power plan 9 dlm",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:177,183 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:180,186
FNONE,
&mi386,
sizeof(Ehdr),
- noswal,
+ nil,
elfdotout },
{ E_MAGIC, /* Arm 5.out */
"arm plan 9 executable",
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:242,248 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:245,252
{
ExecTable *mp;
ExecHdr d;
- int nb, magic, ret;
+ int nb, ret;
+ ulong magic;
fp->type = FNONE;
nb = read(fd, (char *)&d.e, sizeof(d.e));
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:258,264 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:262,267
if(mp->magic == V_MAGIC)
mp = couldbe4k(mp);
- hswal((long *) &d, sizeof(d.e)/sizeof(long), mp->swal);
fp->type = mp->type;
if ((magic & DYN_MAGIC) && mp->dlmname != nil)
fp->name = mp->dlmname;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:266,272 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:269,277
fp->name = mp->name;
fp->hdrsz = mp->hsize; /* zero on bootables */
mach = mp->mach;
- ret = mp->hparse(fd, fp, &d);
+ if(mp->swal != nil)
+ hswal(&d, sizeof(d.e)/sizeof(ulong), mp->swal);
+ ret = mp->hparse(fd, fp, &d);
seek(fd, mp->hsize, 0); /* seek to end of header */
break;
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:275,300 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:280,299
werrstr("unknown header type");
return ret;
}
+
/*
* Convert header to canonical form
*/
static void
- hswal(long *lp, int n, long (*swap) (long))
+ hswal(void *v, int n, ulong (*swap)(ulong))
{
- while (n--) {
- *lp = (*swap) (*lp);
- lp++;
- }
+ ulong *ulp;
+
+ for(ulp = v; n--; ulp++)
+ *ulp = (*swap)(*ulp);
}
+
/*
- * noop
- */
- static long
- noswal(long x)
- {
- return x;
- }
- /*
* Crack a normal a.out-type header
*/
static int
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:312,317 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:311,365
return 1;
}
+ static void
+ commonboot(Fhdr *fp)
+ {
+ uvlong kbase;
+
+ kbase = mach->kbase;
+ if ((fp->entry & kbase) != kbase)
+ return;
+
+ switch(fp->type) { /* boot image */
+ case F68020:
+ fp->type = F68020B;
+ fp->name = "68020 plan 9 boot image";
+ break;
+ case FI386:
+ fp->type = FI386B;
+ fp->txtaddr = (u32int)fp->entry;
+ fp->name = "386 plan 9 boot image";
+ fp->dataddr = _round(fp->txtaddr+fp->txtsz, mach->pgsize);
+ break;
+ case FARM:
+ fp->txtaddr = kbase+0x8010;
+ fp->name = "ARM plan 9 boot image";
+ fp->dataddr = fp->txtaddr+fp->txtsz;
+ return;
+ case FALPHA:
+ fp->type = FALPHAB;
+ fp->txtaddr = (u32int)fp->entry;
+ fp->name = "alpha plan 9 boot image?";
+ fp->dataddr = fp->txtaddr+fp->txtsz;
+ break;
+ case FPOWER:
+ fp->type = FPOWERB;
+ fp->txtaddr = (u32int)fp->entry;
+ fp->name = "power plan 9 boot image";
+ fp->dataddr = fp->txtaddr+fp->txtsz;
+ break;
+ case FAMD64:
+ fp->type = FAMD64B;
+ fp->txtaddr = fp->entry;
+ fp->name = "amd64 plan 9 boot image";
+ fp->dataddr = _round(fp->txtaddr+fp->txtsz, mach->pgsize);
+ break;
+ default:
+ return;
+ }
+ fp->hdrsz = 0; /* header stripped */
+ }
+
/*
* 68020 2.out and 68020 bootable images
* 386I 8.out and 386I bootable images
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:321,328 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:369,374
static int
common(int fd, Fhdr *fp, ExecHdr *hp)
{
- long kbase;
-
adotout(fd, fp, hp);
if(hp->e.magic & DYN_MAGIC) {
fp->txtaddr = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:329,383 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:375,416
fp->dataddr = fp->txtsz;
return 1;
}
- kbase = mach->kbase;
- if ((fp->entry & kbase) == kbase) { /* Boot image */
- switch(fp->type) {
- case F68020:
- fp->type = F68020B;
- fp->name = "68020 plan 9 boot image";
- fp->hdrsz = 0; /* header stripped */
- break;
- case FI386:
- fp->type = FI386B;
- fp->txtaddr = sizeof(Exec);
- fp->name = "386 plan 9 boot image";
- fp->hdrsz = 0; /* header stripped */
- fp->dataddr = _round(fp->txtaddr+fp->txtsz, mach->pgsize);
- break;
- case FARM:
- fp->txtaddr = kbase+0x8010;
- fp->name = "ARM plan 9 boot image";
- fp->hdrsz = 0; /* header stripped */
- fp->dataddr = fp->txtaddr+fp->txtsz;
- return 1;
- case FALPHA:
- fp->type = FALPHAB;
- fp->txtaddr = fp->entry;
- fp->name = "alpha plan 9 boot image?";
- fp->hdrsz = 0; /* header stripped */
- fp->dataddr = fp->txtaddr+fp->txtsz;
- break;
- case FPOWER:
- fp->type = FPOWERB;
- fp->txtaddr = fp->entry;
- fp->name = "power plan 9 boot image";
- fp->hdrsz = 0; /* header stripped */
- fp->dataddr = fp->txtaddr+fp->txtsz;
- break;
- case FAMD64:
- fp->type = FAMD64B;
- fp->txtaddr = sizeof(Exec);
- fp->name = "amd64 plan 9 boot image";
- fp->hdrsz = 0; /* header stripped */
- fp->dataddr = _round(fp->txtaddr+fp->txtsz, mach->pgsize);
- break;
- default:
- break;
- }
- fp->txtaddr |= kbase;
- fp->entry |= kbase;
- fp->dataddr |= kbase;
+ commonboot(fp);
+ return 1;
+ }
+
+ static int
+ commonllp64(int, Fhdr *fp, ExecHdr *hp)
+ {
+ long pgsize;
+ uvlong entry;
+
+ hswal(&hp->e, sizeof(Exec)/sizeof(long), beswal);
+ if(!(hp->e.magic & HDR_MAGIC))
+ return 0;
+
+ /*
+ * There can be more magic here if the
+ * header ever needs more expansion.
+ * For now just catch use of any of the
+ * unused bits.
+ */
+ if((hp->e.magic & ~DYN_MAGIC)>>16)
+ return 0;
+ entry = beswav(hp->e.hdr[0]);
+
+ pgsize = mach->pgsize;
+ settext(fp, entry, pgsize+fp->hdrsz, hp->e.text, fp->hdrsz);
+ setdata(fp, _round(pgsize+fp->txtsz+fp->hdrsz, pgsize),
+ hp->e.data, fp->txtsz+fp->hdrsz, hp->e.bss);
+ setsym(fp, hp->e.syms, hp->e.spsz, hp->e.pcsz, fp->datoff+fp->datsz);
+
+ if(hp->e.magic & DYN_MAGIC) {
+ fp->txtaddr = 0;
+ fp->dataddr = fp->txtsz;
+ return 1;
}
+ commonboot(fp);
return 1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:472,478 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:505,510
return 1;
}
-
/*
* Elf32 binaries.
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:480,486 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:512,518
elfdotout(int fd, Fhdr *fp, ExecHdr *hp)
{
- long (*swal)(long);
+ ulong (*swal)(ulong);
ushort (*swab)(ushort);
Ehdr *ep;
Phdr *ph;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:560,574 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:592,606
free(ph);
return 0;
}
- hswal((long*)ph, phsz/sizeof(long), swal);
+ hswal(ph, phsz/sizeof(ulong), swal);
/* find text, data and symbols and install them */
it = id = is = -1;
for(i = 0; i < ep->phnum; i++) {
- if(ph[i].type == LOAD
+ if(ph[i].type == LOAD
&& (ph[i].flags & (R|X)) == (R|X) && it == -1)
it = i;
- else if(ph[i].type == LOAD
+ else if(ph[i].type == LOAD
&& (ph[i].flags & (R|W)) == (R|W) && id == -1)
id = i;
else if(ph[i].type == NOPTYPE && is == -1)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:575,587 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:607,619
is = i;
}
if(it == -1 || id == -1) {
- /*
+ /*
* The SPARC64 boot image is something of an ELF hack.
* Text+Data+BSS are represented by ph[0]. Symbols
* are represented by ph[1]:
*
* filesz, memsz, vaddr, paddr, off
- * ph[0] : txtsz+datsz, txtsz+datsz+bsssz, txtaddr-KZERO, datasize, txtoff
+ * ph[0] : txtsz+datsz, txtsz+datsz+bsssz, txtaddr-KZERO, datasize, txtoff
* ph[1] : symsz, lcsz, 0, 0, symoff
*/
if(ep->machine == SPARC64 && ep->phnum == 2) {
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:617,623 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:649,655
static int
alphadotout(int fd, Fhdr *fp, ExecHdr *hp)
{
- long kbase;
+ uvlong kbase;
USED(fd);
settext(fp, hp->e.entry, sizeof(Exec), hp->e.text, sizeof(Exec));
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:645,651 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:677,683
static int
armdotout(int fd, Fhdr *fp, ExecHdr *hp)
{
- long kbase;
+ uvlong kbase;
USED(fd);
settext(fp, hp->e.entry, sizeof(Exec), hp->e.text, sizeof(Exec));
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:663,669 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:695,701
}
static void
- settext(Fhdr *fp, long e, long a, long s, long off)
+ settext(Fhdr *fp, uvlong e, uvlong a, long s, vlong off)
{
fp->txtaddr = a;
fp->entry = e;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:670,677 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:702,710
fp->txtsz = s;
fp->txtoff = off;
}
+
static void
- setdata(Fhdr *fp, long a, long s, long off, long bss)
+ setdata(Fhdr *fp, uvlong a, long s, vlong off, long bss)
{
fp->dataddr = a;
fp->datsz = s;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/executable.c:678,699 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/executable.c:711,733
fp->datoff = off;
fp->bsssz = bss;
}
+
static void
- setsym(Fhdr *fp, long sy, long sppc, long lnpc, long symoff)
+ setsym(Fhdr *fp, long symsz, long sppcsz, long lnpcsz, vlong symoff)
{
- fp->symsz = sy;
+ fp->symsz = symsz;
fp->symoff = symoff;
- fp->sppcsz = sppc;
+ fp->sppcsz = sppcsz;
fp->sppcoff = fp->symoff+fp->symsz;
- fp->lnpcsz = lnpc;
+ fp->lnpcsz = lnpcsz;
fp->lnpcoff = fp->sppcoff+fp->sppcsz;
}
- static ulong
- _round(ulong a, ulong b)
+ static uvlong
+ _round(uvlong a, ulong b)
{
- ulong w;
+ uvlong w;
w = (a/b)*b;
if (a!=w)
[rsc] --rw-rw-r-- M 451989 glenda sys 3370 Nov 6 10:02 sys/src/libmach/k.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/k.c:107,114 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/k.c:107,115
"setSB", /* static base register name */
0, /* value */
0x1000, /* page size */
- 0xE0000000, /* kernel base */
+ 0xE0000000ULL, /* kernel base */
0, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
4, /* quantization of pc */
4, /* szaddr */
4, /* szreg */
[rsc] --rw-rw-r-- M 451989 glenda sys 21161 Nov 6 10:03 sys/src/libmach/kdb.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:8,17 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:8,17
*/
static char *sparcexcep(Map*, Rgetter);
- static int sparcfoll(Map*, ulong, Rgetter, ulong*);
- static int sparcinst(Map*, ulong, char, char*, int);
- static int sparcdas(Map*, ulong, char*, int);
- static int sparcinstlen(Map*, ulong);
+ static int sparcfoll(Map*, uvlong, Rgetter, uvlong*);
+ static int sparcinst(Map*, uvlong, char, char*, int);
+ static int sparcdas(Map*, uvlong, char*, int);
+ static int sparcinstlen(Map*, uvlong);
Machdata sparcmach =
{
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:116,122 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:116,122
int target; /* SETHI+ADD dest reg */
long w0;
long w1;
- ulong addr; /* pc of instruction */
+ uvlong addr; /* pc of instruction */
char *curr; /* current fill level in output buffer */
char *end; /* end of buffer */
int size; /* number of longs in instr */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:126,132 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:126,132
static Map *mymap; /* disassembler context */
static int dascase;
- static int mkinstr(ulong, Instr*);
+ static int mkinstr(uvlong, Instr*);
static void bra1(Instr*, char*, char*[]);
static void bra(Instr*, char*);
static void fbra(Instr*, char*);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:288,296 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:288,296
}
static int
- decode(ulong pc, Instr *i)
+ decode(uvlong pc, Instr *i)
{
- long w;
+ ulong w;
if (get4(mymap, pc, &w) < 0) {
werrstr("can't read instruction: %r");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:323,329 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:323,329
}
static int
- mkinstr(ulong pc, Instr *i)
+ mkinstr(uvlong pc, Instr *i)
{
Instr xi;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:354,360 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:354,360
}
static int
- printins(Map *map, ulong pc, char *buf, int n)
+ printins(Map *map, uvlong pc, char *buf, int n)
{
Instr instr;
void (*f)(Instr*, char*);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:424,430 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:424,430
}
static int
- sparcinst(Map *map, ulong pc, char modifier, char *buf, int n)
+ sparcinst(Map *map, uvlong pc, char modifier, char *buf, int n)
{
static int fmtinstalled = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:442,448 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:442,448
}
static int
- sparcdas(Map *map, ulong pc, char *buf, int n)
+ sparcdas(Map *map, uvlong pc, char *buf, int n)
{
Instr instr;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:463,469 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:463,469
}
static int
- sparcinstlen(Map *map, ulong pc)
+ sparcinstlen(Map *map, uvlong pc)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:500,506 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:500,506
address(Instr *i)
{
Symbol s, s2;
- long off, off1;
+ uvlong off, off1;
if (i->rs1 == 1 && plocal(i) >= 0)
return;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:510,516 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:510,516
&& (s.class == CDATA || s.class == CTEXT)) {
if(off==s.value && s.name[0]=='$'){
off1 = 0;
- get4(mymap, s.value, &off1);
+ geta(mymap, s.value, &off1);
if(off1 && findsym(off1, CANY, &s2) && s2.value == off1){
bprint(i, "$%s(SB)", s2.name);
return;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:878,885 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:878,885
bprint(i, ", R%d", i->rd);
}
- static
- void storef(Instr *i, char *m) /* page 70 */
+ static void
+ storef(Instr *i, char *m) /* page 70 */
{
if(!dascase){
m = "FMOVD";
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:901,908 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:901,908
address(i);
}
- static
- void loadc(Instr *i, char *m) /* page 72 */
+ static void
+ loadc(Instr *i, char *m) /* page 72 */
{
if(i->i == 0)
bprint(i, "%s\t(R%d+R%d), C%d", m, i->rs1, i->rs2, i->rd);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:913,920 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:913,920
}
}
- static
- void loadcsr(Instr *i, char *m) /* page 72 */
+ static void
+ loadcsr(Instr *i, char *m) /* page 72 */
{
if(i->i == 0)
bprint(i, "%s\t(R%d+R%d), CSR", m, i->rs1, i->rs2);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/kdb.c:1007,1013 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/kdb.c:1007,1013
}
static int
- sparcfoll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+ sparcfoll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
{
ulong w, r1, r2;
char buf[8];
[rsc] --rw-rw-r-- M 451989 glenda sys 8799 Nov 6 10:02 sys/src/libmach/machdata.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:17,27 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:17,26
Machdata *machdata; /* machine-dependent functions */
int
- localaddr(Map *map, char *fn, char *var, long *r, Rgetter rget)
+ localaddr(Map *map, char *fn, char *var, uvlong *r, Rgetter rget)
{
Symbol s;
- ulong fp;
- ulong pc, sp, link;
+ uvlong fp, pc, sp, link;
if (!lookup(fn, 0, &s)) {
werrstr("function not found");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:64,73 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:63,72
}
/*
- * Print value v as name[+offset] and then the string s.
+ * Print value v as s.name[+offset] if possible, or just v.
*/
int
- symoff(char *buf, int n, long v, int space)
+ symoff(char *buf, int n, uvlong v, int space)
{
Symbol s;
int r;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:82,95 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:81,95
delta = -delta;
}
if (v == 0 || r == 0)
- return snprint(buf, n, "%lux", v);
+ return snprint(buf, n, "%llux", v);
if (s.type != 't' && s.type != 'T' && delta >= 4096)
- return snprint(buf, n, "%lux", v);
+ return snprint(buf, n, "%llux", v);
else if (delta)
return snprint(buf, n, "%s+%lux", s.name, delta);
else
return snprint(buf, n, "%s", s.name);
}
+
/*
* Format floating point registers
*
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:104,110 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:104,110
fpformat(Map *map, Reglist *rp, char *buf, int n, int modif)
{
char reg[12];
- long r;
+ ulong r;
switch(rp->rformat)
{
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:317,323 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:317,322
return beieeedftos(buf, n, (void*)ieee);
}
-
int
leieee80ftos(char *buf, int n, void *s)
{
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:332,350 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:331,348
}
int
- cisctrace(Map *map, ulong pc, ulong sp, ulong link, Tracer trace)
+ cisctrace(Map *map, uvlong pc, uvlong sp, uvlong link, Tracer trace)
{
Symbol s;
- int found;
- ulong opc;
- long moved, j;
+ int found, i;
+ uvlong opc, moved;
USED(link);
- j = 0;
+ i = 0;
opc = 0;
while(pc && opc != pc) {
moved = pc2sp(pc);
- if (moved == -1)
+ if (moved == ~0)
break;
found = findsym(pc, CTEXT, &s);
if (!found)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:354,375 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:352,373
sp += moved;
opc = pc;
- if (get4(map, sp, (long *)&pc) < 0)
+ if (geta(map, sp, &pc) < 0)
break;
(*trace)(map, pc, sp, &s);
sp += mach->szaddr; /*assumes address size = stack width*/
- if(++j > 40)
+ if(++i > 40)
break;
}
- return j;
+ return i;
}
int
- risctrace(Map *map, ulong pc, ulong sp, ulong link, Tracer trace)
+ risctrace(Map *map, uvlong pc, uvlong sp, uvlong link, Tracer trace)
{
int i;
Symbol s, f;
- ulong oldpc;
+ uvlong oldpc;
i = 0;
while(findsym(pc, CTEXT, &s)) {
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:385,391 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:383,389
if(s.type == 'L' || s.type == 'l' || pc <= s.value+mach->pcquant)
pc = link;
else
- if (get4(map, sp, (long *) &pc) < 0)
+ if (geta(map, sp, &pc) < 0)
break;
if(pc == 0 || (pc == oldpc && f.value == 0))
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:400,421 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:398,419
return i;
}
- ulong
- ciscframe(Map *map, ulong addr, ulong pc, ulong sp, ulong link)
+ uvlong
+ ciscframe(Map *map, uvlong addr, uvlong pc, uvlong sp, uvlong link)
{
Symbol s;
- int moved;
+ uvlong moved;
USED(link);
for(;;) {
moved = pc2sp(pc);
- if (moved == -1)
+ if (moved == ~0)
break;
sp += moved;
findsym(pc, CTEXT, &s);
if (addr == s.value)
return sp;
- if (get4(map, sp, (long *) &pc) < 0)
+ if (geta(map, sp, &pc) < 0)
break;
sp += mach->szaddr; /*assumes sizeof(addr) = stack width*/
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:422,429 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:420,427
return 0;
}
- ulong
- riscframe(Map *map, ulong addr, ulong pc, ulong sp, ulong link)
+ uvlong
+ riscframe(Map *map, uvlong addr, uvlong pc, uvlong sp, uvlong link)
{
Symbol s, f;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/machdata.c:444,450 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/machdata.c:442,448
if (s.type == 'L' || s.type == 'l' || pc-s.value <= mach->szaddr*2)
pc = link;
else
- if (get4(map, sp-f.value, (long *)&pc) < 0)
+ if (geta(map, sp-f.value, &pc) < 0)
break;
}
return 0;
[rsc] --rw-rw-r-- M 451989 glenda sys 3056 Nov 6 10:02 sys/src/libmach/map.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/map.c:26,32 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/map.c:26,32
}
int
- setmap(Map *map, int fd, ulong b, ulong e, ulong f, char *name)
+ setmap(Map *map, int fd, uvlong b, uvlong e, vlong f, char *name)
{
int i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/map.c:46,52 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/map.c:46,52
return 1;
}
- static ulong
+ static uvlong
stacktop(int pid)
{
char buf[64];
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/map.c:54,60 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/map.c:54,60
int n;
char *cp;
- sprint(buf, "/proc/%d/segment", pid);
+ snprint(buf, sizeof(buf), "/proc/%d/segment", pid);
fd = open(buf, 0);
if (fd < 0)
return 0;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/map.c:74,80 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/map.c:74,80
cp++;
if (!*cp)
return 0;
- return strtoul(cp, 0, 16);
+ return strtoull(cp, 0, 16);
}
Map*
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/map.c:83,89 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/map.c:83,89
char buf[64], *regs;
int fd;
Map *map;
- ulong n;
+ uvlong n;
int mode;
map = newmap(0, 4);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/map.c:116,128 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/map.c:116,128
setmap(map, fd, mach->regsize, mach->regsize+mach->fpregsize, 0, "fpregs");
}
setmap(map, corefd, fp->txtaddr, fp->txtaddr+fp->txtsz, fp->txtaddr, "text");
- if(kflag || (ulong) fp->dataddr >= 0x7fffffff) {
- setmap(map, corefd, fp->dataddr, 0xffffffff, fp->dataddr, "data");
+ if(kflag || fp->dataddr >= mach->utop) {
+ setmap(map, corefd, fp->dataddr, ~0, fp->dataddr, "data");
return map;
}
n = stacktop(pid);
if (n == 0) {
- setmap(map, corefd, fp->dataddr, 0x7fffffff, fp->dataddr, "data");
+ setmap(map, corefd, fp->dataddr, mach->utop, fp->dataddr, "data");
return map;
}
setmap(map, corefd, fp->dataddr, n, fp->dataddr, "data");
[rsc] --rw-rw-r-- M 451989 glenda sys 5929 Nov 6 10:02 sys/src/libmach/obj.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/obj.c:127,133 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/obj.c:127,133
}
int
- readar(Biobuf *bp, int objtype, int end, int doautos)
+ readar(Biobuf *bp, int objtype, vlong end, int doautos)
{
Prog p;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/obj.c:253,259 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/obj.c:253,259
* update the offset information for a 'a' or 'p' symbol in an intermediate file
*/
void
- _offset(int id, long off)
+ _offset(int id, vlong off)
{
Sym *s;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/obj.c:299,305 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/obj.c:299,305
for(i=0; i<sizeof(a.name) && i<SARNAME && a.name[i] != ' '; i++)
buf[i] = a.name[i];
buf[i] = 0;
- arsize = atol(a.size);
+ arsize = strtol(a.size, 0, 0);
if (arsize&1)
arsize++;
return arsize + SAR_HDR;
[rsc] --rw-rw-r-- M 451989 glenda sys 3630 Nov 6 10:02 sys/src/libmach/q.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/q.c:112,119 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/q.c:112,120
"setSB", /* static base register name */
0, /* value */
0x1000, /* page size */
- 0x80000000, /* kernel base */
+ 0x80000000ULL, /* kernel base */
0, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
4, /* quantization of pc */
4, /* szaddr */
4, /* szreg */
[rsc] --rw-rw-r-- M 451989 glenda sys 27506 Nov 6 10:03 sys/src/libmach/qdb.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:9,18 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:9,18
*/
static char *powerexcep(Map*, Rgetter);
- static int powerfoll(Map*, ulong, Rgetter, ulong*);
- static int powerinst(Map*, ulong, char, char*, int);
- static int powerinstlen(Map*, ulong);
- static int powerdas(Map*, ulong, char*, int);
+ static int powerfoll(Map*, uvlong, Rgetter, uvlong*);
+ static int powerinst(Map*, uvlong, char, char*, int);
+ static int powerinstlen(Map*, uvlong);
+ static int powerdas(Map*, uvlong, char*, int);
/*
* Machine description
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:146,152 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:146,152
long immediate;
long w0;
long w1;
- ulong addr; /* pc of instruction */
+ uvlong addr; /* pc of instruction */
short target;
char *curr; /* current fill level in output buffer */
char *end; /* end of buffer */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:168,176 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:168,176
}
static int
- decode(ulong pc, Instr *i)
+ decode(uvlong pc, Instr *i)
{
- long w;
+ ulong w;
if (get4(mymap, pc, &w) < 0) {
werrstr("can't read instruction: %r");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:224,230 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:224,230
}
static int
- mkinstr(ulong pc, Instr *i)
+ mkinstr(uvlong pc, Instr *i)
{
Instr x;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:271,280 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:271,280
}
static int
- pglobal(Instr *i, long off, int anyoff, char *reg)
+ pglobal(Instr *i, uvlong off, int anyoff, char *reg)
{
Symbol s, s2;
- long off1;
+ uvlong off1;
if(findsym(off, CANY, &s) &&
s.value-off < 4096 &&
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:281,287 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:281,287
(s.class == CDATA || s.class == CTEXT)) {
if(off==s.value && s.name[0]=='$'){
off1 = 0;
- get4(mymap, s.value, &off1);
+ geta(mymap, s.value, &off1);
if(off1 && findsym(off1, CANY, &s2) && s2.value == off1){
bprint(i, "$%s%s", s2.name, reg);
return 1;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:696,703 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:696,703
{31, 28, ALL, "AND%C", and, il3},
{31, 60, ALL, "ANDN%C", and, il3},
- {28, 0, 0, "ANDCC", andi, il2u},
- {29, 0, 0, "ANDCC", shifted, 0},
+ {28, 0, 0, "ANDCC", andi, il2u},
+ {29, 0, 0, "ANDCC", shifted, 0},
{18, 0, 0, "B%L", gencc, "%j"},
{16, 0, 0, "BC%L", branch, "%d,%a,%J"},
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:798,809 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:798,809
{41, 0, 0, "MOVHZU", load, ldop},
{31, 311, ALL, "MOVHZU", ldx, 0},
{31, 279, ALL, "MOVHZ", ldx, 0},
- {46, 0, 0, "MOVMW", load, ldop},
+ {46, 0, 0, "MOVMW", load, ldop},
{31, 277, ALL, "LSCBX%C", ldx, 0}, /* POWER */
{31, 597, ALL, "LSW", gen, "(R%a),$%n,R%d"},
{31, 533, ALL, "LSW", ldx, 0},
{31, 20, ALL, "LWAR", ldx, 0},
- {31, 534, ALL, "MOVWBR", ldx, 0},
+ {31, 534, ALL, "MOVWBR", ldx, 0},
{32, 0, 0, "MOVW", load, ldop},
{33, 0, 0, "MOVWU", load, ldop},
{31, 55, ALL, "MOVWU", ldx, 0},
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:814,821 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:814,821
{19, 0, ALL, "MOVFL", gen, "%S,%D"},
{63, 64, ALL, "MOVCRFS", gen, "%S,%D"},
- {31, 512, ALL, "MOVW", gen, "XER,%D"},
- {31, 19, ALL, "MOVW", gen, "CR,R%d"},
+ {31, 512, ALL, "MOVW", gen, "XER,%D"},
+ {31, 19, ALL, "MOVW", gen, "CR,R%d"},
{63, 583, ALL, "MOVW%C", gen, "FPSCR, F%d"}, /* mffs */
{31, 83, ALL, "MOVW", gen, "MSR,R%d"},
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:822,828 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:822,828
{31, 339, ALL, "MOVW", gen, "%P,R%d"},
{31, 595, ALL, "MOVW", gen, "SEG(%a),R%d"},
{31, 659, ALL, "MOVW", gen, "SEG(R%b),R%d"},
- {31, 323, ALL, "MOVW", gen, "DCR(%Q),R%d"},
+ {31, 323, ALL, "MOVW", gen, "DCR(%Q),R%d"},
{31, 451, ALL, "MOVW", gen, "R%s,DCR(%Q)"},
{31, 144, ALL, "MOVFL", gen, "R%s,%m,CR"},
{63, 70, ALL, "MTFSB0%C", gencc, "%D"},
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:846,852 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:846,852
{31, 476, ALL, "NAND%C", gencc, il3},
{31, 104, OEM, "NEG%V%C", neg, ir2},
{31, 124, ALL, "NOR%C", gencc, il3},
- {31, 444, ALL, "OR%C", or, il3},
+ {31, 444, ALL, "OR%C", or, il3},
{31, 412, ALL, "ORN%C", or, il3},
{24, 0, 0, "OR", and, "%I,R%d,R%a"},
{25, 0, 0, "OR", shifted, 0},
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:905,916 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:905,916
{45, 0, 0, "MOVHU", store, stop},
{31, 439, ALL, "MOVHU", stx, 0},
{31, 407, ALL, "MOVH", stx, 0},
- {47, 0, 0, "MOVMW", store, stop},
+ {47, 0, 0, "MOVMW", store, stop},
{31, 725, ALL, "STSW", gen, "R%d,$%n,(R%a)"},
{31, 661, ALL, "STSW", stx, 0},
{36, 0, 0, "MOVW", store, stop},
{31, 662, ALL, "MOVWBR", stx, 0},
- {31, 150, ALL, "STWCCC", stx, 0},
+ {31, 150, ALL, "STWCCC", stx, 0},
{37, 0, 0, "MOVWU", store, stop},
{31, 183, ALL, "MOVWU", stx, 0},
{31, 151, ALL, "MOVW", stx, 0},
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:1153,1159 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:1153,1159
}
static int
- printins(Map *map, ulong pc, char *buf, int n)
+ printins(Map *map, uvlong pc, char *buf, int n)
{
Instr i;
Opcode *o;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:1177,1183 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:1177,1183
}
static int
- powerinst(Map *map, ulong pc, char modifier, char *buf, int n)
+ powerinst(Map *map, uvlong pc, char modifier, char *buf, int n)
{
USED(modifier);
return printins(map, pc, buf, n);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:1184,1190 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:1184,1190
}
static int
- powerdas(Map *map, ulong pc, char *buf, int n)
+ powerdas(Map *map, uvlong pc, char *buf, int n)
{
Instr instr;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:1205,1211 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:1205,1211
}
static int
- powerinstlen(Map *map, ulong pc)
+ powerinstlen(Map *map, uvlong pc)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/qdb.c:1216,1222 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/qdb.c:1216,1222
}
static int
- powerfoll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+ powerfoll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
{
char *reg;
Instr i;
[rsc] --rw-rw-r-- M 451989 glenda sys 1056 Nov 6 10:02 sys/src/libmach/swap.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/swap.c:15,22 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/swap.c:15,22
/*
* big-endian long
*/
- long
- beswal(long l)
+ ulong
+ beswal(ulong l)
{
uchar *p;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/swap.c:27,42 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/swap.c:27,42
/*
* big-endian vlong
*/
- vlong
- beswav(vlong v)
+ uvlong
+ beswav(uvlong v)
{
uchar *p;
p = (uchar*)&v;
- return ((vlong)p[0]<<56) | ((vlong)p[1]<<48) | ((vlong)p[2]<<40)
- | ((vlong)p[3]<<32) | ((vlong)p[4]<<24)
- | ((vlong)p[5]<<16) | ((vlong)p[6]<<8)
- | (vlong)p[7];
+ return ((uvlong)p[0]<<56) | ((uvlong)p[1]<<48) | ((uvlong)p[2]<<40)
+ | ((uvlong)p[3]<<32) | ((uvlong)p[4]<<24)
+ | ((uvlong)p[5]<<16) | ((uvlong)p[6]<<8)
+ | (uvlong)p[7];
}
/*
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/swap.c:54,61 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/swap.c:54,61
/*
* little-endian long
*/
- long
- leswal(long l)
+ ulong
+ leswal(ulong l)
{
uchar *p;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/swap.c:66,79 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/swap.c:66,79
/*
* little-endian vlong
*/
- vlong
- leswav(vlong v)
+ uvlong
+ leswav(uvlong v)
{
uchar *p;
p = (uchar*)&v;
- return ((vlong)p[7]<<56) | ((vlong)p[6]<<48) | ((vlong)p[5]<<40)
- | ((vlong)p[4]<<32) | ((vlong)p[3]<<24)
- | ((vlong)p[2]<<16) | ((vlong)p[1]<<8)
- | (vlong)p[0];
+ return ((uvlong)p[7]<<56) | ((uvlong)p[6]<<48) | ((uvlong)p[5]<<40)
+ | ((uvlong)p[4]<<32) | ((uvlong)p[3]<<24)
+ | ((uvlong)p[2]<<16) | ((uvlong)p[1]<<8)
+ | (uvlong)p[0];
}
[rsc] --rw-rw-r-- M 451989 glenda sys 26729 Nov 6 10:02 sys/src/libmach/sym.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:16,22 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:16,22
Sym *sym; /* function symbol entry */
};
- struct hist { /* Stack of include files & #line directives */
+ struct hist { /* Stack of include files & #line directives */
char *name; /* Assumes names Null terminated in file */
long line; /* line # where it was included */
long offset; /* line # of #line directive */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:23,35 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:23,35
};
struct file { /* Per input file header to history stack */
- long addr; /* address of first text sym */
+ uvlong addr; /* address of first text sym */
union {
- Txtsym *txt; /* first text symbol */
- Sym *sym; /* only during initilization */
+ Txtsym *txt; /* first text symbol */
+ Sym *sym; /* only during initilization */
};
- int n; /* size of history stack */
- Hist *hist; /* history stack */
+ int n; /* size of history stack */
+ Hist *hist; /* history stack */
};
static int debug = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:53,63 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:53,63
static uchar *spoffend; /* end of pc-sp offset table */
static Sym *symbols; /* symbol table */
static Txtsym *txt; /* Base of text symbol table */
- static long txtstart; /* start of text segment */
- static long txtend; /* end of text segment */
+ static uvlong txtstart; /* start of text segment */
+ static uvlong txtend; /* end of text segment */
static void cleansyms(void);
- static int decodename(Biobuf*, Sym*);
+ static long decodename(Biobuf*, Sym*);
static short *encfname(char*);
static int fline(char*, int, long, Hist*, Hist**);
static void fillsym(Sym*, Symbol*);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:65,71 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:65,71
static int findlocvar(Symbol*, char *, Symbol*);
static int findtext(char*, Symbol*);
static int hcomp(Hist*, short*);
- static int hline(File*, short*, ulong*);
+ static int hline(File*, short*, long*);
static void printhist(char*, Hist*, int);
static int buildtbls(void);
static int symcomp(void*, void*);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:80,87 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:80,89
syminit(int fd, Fhdr *fp)
{
Sym *p;
- int i, size;
+ long i, l, size;
+ vlong vl;
Biobuf b;
+ int svalsz;
if(fp->symsz == 0)
return 0;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:101,109 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:103,120
nsym = 0;
size = 0;
for(p = symbols; size < fp->symsz; p++, nsym++) {
- if(Bread(&b, &p->value, sizeof(p->value)) != sizeof(p->value))
- return symerrmsg(sizeof(p->value), "symbol");
- p->value = beswal(p->value);
+ if(fp->magic & HDR_MAGIC){
+ svalsz = 8;
+ if(Bread(&b, &vl, 8) != 8)
+ return symerrmsg(8, "symbol");
+ p->value = beswav(vl);
+ }
+ else{
+ svalsz = 4;
+ if(Bread(&b, &l, 4) != 4)
+ return symerrmsg(4, "symbol");
+ p->value = (u32int)beswal(l);
+ }
if(Bread(&b, &p->type, sizeof(p->type)) != sizeof(p->type))
return symerrmsg(sizeof(p->value), "symbol");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:110,116 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:121,127
i = decodename(&b, p);
if(i < 0)
return -1;
- size += i+sizeof(p->value)+sizeof(p->type);
+ size += i+svalsz+sizeof(p->type);
/* count global & auto vars, text symbols, and file names */
switch (p->type) {
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:159,166 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:170,176
return -1;
}
Bseek(&b, fp->sppcoff, 0);
- i = Bread(&b, spoff, fp->sppcsz);
- if(i != fp->sppcsz){
+ if(Bread(&b, spoff, fp->sppcsz) != fp->sppcsz){
spoff = 0;
return symerrmsg(fp->sppcsz, "sp-pc");
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:173,180 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:183,189
return -1;
}
Bseek(&b, fp->lnpcoff, 0);
- i = Bread(&b, pcline, fp->lnpcsz);
- if(i != fp->lnpcsz){
+ if(Bread(&b, pcline, fp->lnpcsz) != fp->lnpcsz){
pcline = 0;
return symerrmsg(fp->lnpcsz, "pc-line");
}
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:190,201 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:199,211
return -1;
}
- static int
+ static long
decodename(Biobuf *bp, Sym *p)
{
char *cp;
int c1, c2;
- int n;
+ long n;
+ vlong o;
if((p->type & 0x80) == 0) { /* old-style, fixed length names */
p->name = malloc(NNAME);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:211,217 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:221,227
p->type &= ~0x80;
if(p->type == 'z' || p->type == 'Z') {
- n = Bseek(bp, 0, 1);
+ o = Bseek(bp, 0, 1);
if(Bgetc(bp) < 0) {
werrstr("can't read symbol name");
return -1;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:226,240 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:236,250
if(c1 == 0 && c2 == 0)
break;
}
- n = Bseek(bp, 0, 1)-n;
+ n = Bseek(bp, 0, 1)-o;
p->name = malloc(n);
if(p->name == 0) {
- werrstr("can't malloc %d bytes", n);
+ werrstr("can't malloc %ld bytes", n);
return -1;
}
Bseek(bp, -n, 1);
if(Bread(bp, p->name, n) != n) {
- werrstr("can't read %d bytes of symbol name", n);
+ werrstr("can't read %ld bytes of symbol name", n);
return -1;
}
} else {
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:246,252 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:256,262
n = Blinelen(bp);
p->name = malloc(n);
if(p->name == 0) {
- werrstr("can't malloc %d bytes", n);
+ werrstr("can't malloc %ld bytes", n);
return -1;
}
strcpy(p->name, cp);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:253,258 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:263,269
}
return n;
}
+
/*
* free any previously loaded symbol tables
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:296,310 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:307,323
free(pcline);
pcline = 0;
}
+
/*
* delimit the text segment
*/
void
- textseg(ulong base, Fhdr *fp)
+ textseg(uvlong base, Fhdr *fp)
{
txtstart = base;
txtend = base+fp->txtsz;
}
+
/*
* symbase: return base and size of raw symbol table
* (special hack for high access rate operations)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:315,320 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:328,334
*n = nsym;
return symbols;
}
+
/*
* Get the ith symbol table entry
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:332,338 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:346,353
static int
buildtbls(void)
{
- int i, j, nh, ng, nt;
+ long i;
+ int j, nh, ng, nt;
File *f;
Txtsym *tp;
Hist *hp;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:391,397 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:406,412
case 'B':
case 'b':
if(debug)
- print("Global: %s %lux\n", p->name, p->value);
+ print("Global: %s %llux\n", p->name, p->value);
globals[ng++] = p;
break;
case 'z':
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:430,436 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:445,451
tp->sym = p;
tp->locals = ap;
if(debug)
- print("TEXT: %s at %lux\n", p->name, p->value);
+ print("TEXT: %s at %llux\n", p->name, p->value);
if(f && !f->sym) { /* first */
f->sym = p;
f->addr = p->value;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:444,450 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:459,465
p->name);
else {
if(debug)
- print("Local: %s %lux\n", p->name, p->value);
+ print("Local: %s %llux\n", p->name, p->value);
tp->locals[tp->n] = p;
tp->n++;
ap++;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:468,474 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:483,489
for(j = 0; j < ntxt; j++) {
if(f->sym == tp->sym) {
if(debug) {
- print("LINK: %s to at %lux", f->sym->name, f->addr);
+ print("LINK: %s to at %llux", f->sym->name, f->addr);
printhist("... ", f->hist, 1);
}
f->txt = tp++;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:511,516 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:526,532
return findglobal(var, s); /* case 3: var not found */
}
+
/*
* find a function by name
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:535,541 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:551,557
static int
findglobal(char *name, Symbol *s)
{
- int i;
+ long i;
for(i = 0; i < nglob; i++) {
if(strcmp(globals[i]->name, name) == 0) {
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:546,551 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:562,568
}
return 0;
}
+
/*
* find the local variable by name within a given function
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:558,563 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:575,581
return 0;
return findlocvar(s1, name, s2);
}
+
/*
* find the local variable by name within a given function
* (internal function - does no parameter validation)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:580,585 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:598,604
}
return 0;
}
+
/*
* Get ith text symbol
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:596,601 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:615,621
s->index = index;
return 1;
}
+
/*
* Get ith file name
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:613,618 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:633,639
return 0;
return fileelem(fnames, (uchar*)hp->name, buf, n);
}
+
/*
* Lookup name of local variable located at an offset into the frame.
* The type selects either a parameter or automatic.
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:653,661 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:674,682
* Find text symbol containing addr; binary search assumes text array is sorted by addr
*/
static int
- srchtext(long addr)
+ srchtext(uvlong addr)
{
- ulong val;
+ uvlong val;
int top, bot, mid;
Sym *sp;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:664,672 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:685,693
top = ntxt;
for (mid = (bot+top)/2; mid < top; mid = (bot+top)/2) {
sp = txt[mid].sym;
- if(val < (ulong)sp->value)
+ if(val < sp->value)
top = mid;
- else if(mid != ntxt-1 && val >= (ulong)txt[mid+1].sym->value)
+ else if(mid != ntxt-1 && val >= txt[mid+1].sym->value)
bot = mid;
else
return mid;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:677,686 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:698,707
/*
* Find data symbol containing addr; binary search assumes data array is sorted by addr
*/
- static
- int srchdata(long addr)
+ static int
+ srchdata(uvlong addr)
{
- ulong val;
+ uvlong val;
int top, bot, mid;
Sym *sp;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:689,697 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:710,718
val = addr;
for(mid = (bot+top)/2; mid < top; mid = (bot+top)/2) {
sp = globals[mid];
- if(val < (ulong)sp->value)
+ if(val < sp->value)
top = mid;
- else if(mid < nglob-1 && val >= (ulong)globals[mid+1]->value)
+ else if(mid < nglob-1 && val >= globals[mid+1]->value)
bot = mid;
else
return mid;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:698,703 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:719,725
}
return -1;
}
+
/*
* Find symbol containing val in specified search space
* There is a special case when a value falls beyond the end
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:706,712 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:728,734
* data space are searched for a match.
*/
int
- findsym(long w, int type, Symbol *s)
+ findsym(uvlong val, int type, Symbol *s)
{
int i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:714,720 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:736,742
return 0;
if(type == CTEXT || type == CANY) {
- i = srchtext(w);
+ i = srchtext(val);
if(i >= 0) {
if(type == CTEXT || i != ntxt-1) {
fillsym(txt[i].sym, s);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:725,731 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:747,753
}
}
if(type == CDATA || type == CANY) {
- i = srchdata(w);
+ i = srchdata(val);
if(i >= 0) {
fillsym(globals[i], s);
s->index = i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:739,745 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:761,767
* Find the start and end address of the function containing addr
*/
int
- fnbound(long addr, ulong *bounds)
+ fnbound(uvlong addr, uvlong *bounds)
{
int i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:779,784 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:801,807
}
return 0;
}
+
/*
* get the ith global symbol
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:797,820 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:820,843
}
return 0;
}
+
/*
* find the pc given a file name and line offset into it.
*/
- long
- file2pc(char *file, ulong line)
+ uvlong
+ file2pc(char *file, long line)
{
File *fp;
- int i;
- long pc;
- ulong start, end;
+ long i;
+ uvlong pc, start, end;
short *name;
if(buildtbls() == 0 || files == 0)
- return -1;
+ return ~0;
name = encfname(file);
if(name == 0) { /* encode the file name */
werrstr("file %s not found", file);
- return -1;
+ return ~0;
}
/* find this history stack */
for(i = 0, fp = files; i < nfiles; i++, fp++)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:823,829 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:846,852
free(name);
if(i >= nfiles) {
werrstr("line %ld in file %s not found", line, file);
- return -1;
+ return ~0;
}
start = fp->addr; /* first text addr this file */
if(i < nfiles-1)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:835,848 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:858,872
* run the state machine to locate the pc closest to that value.
*/
if(debug)
- print("find pc for %ld - between: %lux and %lux\n", line, start, end);
+ print("find pc for %ld - between: %llux and %llux\n", line, start, end);
pc = line2addr(line, start, end);
- if(pc == -1) {
+ if(pc == ~0) {
werrstr("line %ld not in file %s", line, file);
- return -1;
+ return ~0;
}
return pc;
}
+
/*
* search for a path component index
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:856,861 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:880,886
return i;
return -1;
}
+
/*
* Encode a char file name as a sequence of short indices
* into the file name dictionary.
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:893,904 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:918,930
dest[i] = 0;
return dest;
}
+
/*
* Search a history stack for a matching file name accumulating
* the size of intervening files in the stack.
*/
static int
- hline(File *fp, short *name, ulong *line)
+ hline(File *fp, short *name, long *line)
{
Hist *hp;
int offset, depth;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:942,947 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:968,974
*line = ln+offset;
return 1;
}
+
/*
* compare two encoded file names
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:966,979 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:993,1006
}
return *s == 0;
}
+
/*
* Convert a pc to a "file:line {file:line}" string.
*/
- int
- fileline(char *str, int n, ulong dot)
+ long
+ fileline(char *str, int n, uvlong dot)
{
- long line;
- int top, bot, mid;
+ long line, top, bot, mid;
File *f;
*str = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1008,1014 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1035,1041
{
Hist *start; /* start of current level */
Hist *h; /* current entry */
- int delta; /* sum of size of files this level */
+ long delta; /* sum of size of files this level */
int k;
start = base;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1067,1072 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1094,1100
********************/
return 0;
}
+
/*
* convert an encoded file name to a string.
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1093,1098 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1121,1127
}
return i;
}
+
/*
* compare the values of two symbol table entries.
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1106,1111 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1135,1141
return i;
return strcmp((*(Sym**)a)->name, (*(Sym**)b)->name);
}
+
/*
* compare the values of the symbols referenced by two text table entries
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1114,1119 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1144,1150
{
return ((Txtsym*)a)->sym->value - ((Txtsym*)b)->sym->value;
}
+
/*
* compare the values of the symbols referenced by two file table entries
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1122,1127 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1153,1159
{
return ((File*)a)->addr - ((File*)b)->addr;
}
+
/*
* fill an interface Symbol structure from a symbol table entry
*/
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1160,1183 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1192,1214
}
s->handle = 0;
}
+
/*
* find the stack frame, given the pc
*/
- long
- pc2sp(ulong pc)
+ uvlong
+ pc2sp(uvlong pc)
{
- uchar *c;
- uchar u;
- ulong currpc;
- long currsp;
+ uchar *c, u;
+ uvlong currpc, currsp;
if(spoff == 0)
- return -1;
+ return ~0;
currsp = 0;
currpc = txtstart - mach->pcquant;
if(pc<currpc || pc>txtend)
- return -1;
+ return ~0;
for(c = spoff; c < spoffend; c++) {
if (currpc >= pc)
return currsp;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1194,1210 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1225,1241
currpc += mach->pcquant*(u-129);
currpc += mach->pcquant;
}
- return -1;
+ return ~0;
}
+
/*
* find the source file line number for a given value of the pc
*/
long
- pc2line(ulong pc)
+ pc2line(uvlong pc)
{
- uchar *c;
- uchar u;
- ulong currpc;
+ uchar *c, u;
+ uvlong currpc;
long currline;
if(pcline == 0)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1212,1218 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1243,1249
currline = 0;
currpc = txtstart-mach->pcquant;
if(pc<currpc || pc>txtend)
- return -1;
+ return ~0;
for(c = pcline; c < pclineend; c++) {
if(currpc >= pc)
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1230,1237 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1261,1269
currpc += mach->pcquant*(u-129);
currpc += mach->pcquant;
}
- return -1;
+ return ~0;
}
+
/*
* find the pc associated with a line number
* basepc and endpc are text addresses bounding the search.
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1239,1260 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1271,1291
* usually, basepc and endpc contain the first text address in
* a file and the first text address in the following file, respectively.
*/
- long
- line2addr(ulong line, ulong basepc, ulong endpc)
+ uvlong
+ line2addr(long line, uvlong basepc, uvlong endpc)
{
- uchar *c;
- uchar u;
- ulong currpc;
+ uchar *c, u;
+ uvlong currpc, pc;
long currline;
long delta, d;
- long pc, found;
+ int found;
if(pcline == 0 || line == 0)
- return -1;
+ return ~0;
currline = 0;
currpc = txtstart-mach->pcquant;
- pc = -1;
+ pc = ~0;
found = 0;
delta = HUGEINT;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/sym.c:1287,1294 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/sym.c:1318,1326
}
if(found)
return pc;
- return -1;
+ return ~0;
}
+
/*
* Print a history stack (debug). if count is 0, prints the whole stack
*/
[rsc] --rw-rw-r-- M 451989 jmk sys 3436 Nov 6 10:02 sys/src/libmach/u.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/u.c:108,115 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/u.c:108,116
"setSB", /* static base register name */
0, /* value */
0x2000, /* page size */
- 0x80000000, /* kernel base */
+ 0x80000000ULL, /* kernel base */
0, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
4, /* quantization of pc */
4, /* szaddr */
4, /* szreg */
[rsc] --rw-rw-r-- M 451989 jmk sys 21910 Nov 6 10:03 sys/src/libmach/udb.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:8,17 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:8,17
*/
static char *sparc64excep(Map*, Rgetter);
- static int sparc64foll(Map*, ulong, Rgetter, ulong*);
- static int sparc64inst(Map*, ulong, char, char*, int);
- static int sparc64das(Map*, ulong, char*, int);
- static int sparc64instlen(Map*, ulong);
+ static int sparc64foll(Map*, uvlong, Rgetter, uvlong*);
+ static int sparc64inst(Map*, uvlong, char, char*, int);
+ static int sparc64das(Map*, uvlong, char*, int);
+ static int sparc64instlen(Map*, uvlong);
Machdata sparc64mach =
{
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:143,149 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:143,149
int target; /* SETHI+ADD dest reg */
long w0;
long w1;
- ulong addr; /* pc of instruction */
+ uvlong addr; /* pc of instruction */
char *curr; /* current fill level in output buffer */
char *end; /* end of buffer */
int size; /* number of longs in instr */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:153,159 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:153,159
static Map *mymap; /* disassembler context */
static int dascase;
- static int mkinstr(ulong, Instr*);
+ static int mkinstr(uvlong, Instr*);
static void bra1(Instr*, char*, char*[]);
static void bra(Instr*, char*);
static void fbra(Instr*, char*);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:317,323 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:317,323
static int
decode(ulong pc, Instr *i)
{
- long w;
+ ulong w;
if (get4(mymap, pc, &w) < 0) {
werrstr("can't read instruction: %r");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:350,356 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:350,356
}
static int
- mkinstr(ulong pc, Instr *i)
+ mkinstr(uvlong pc, Instr *i)
{
Instr xi;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:381,387 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:381,387
}
static int
- printins(Map *map, ulong pc, char *buf, int n)
+ printins(Map *map, uvlong pc, char *buf, int n)
{
Instr instr;
void (*f)(Instr*, char*);
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:451,457 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:451,457
}
static int
- sparc64inst(Map *map, ulong pc, char modifier, char *buf, int n)
+ sparc64inst(Map *map, uvlong pc, char modifier, char *buf, int n)
{
static int fmtinstalled = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:469,475 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:469,475
}
static int
- sparc64das(Map *map, ulong pc, char *buf, int n)
+ sparc64das(Map *map, uvlong pc, char *buf, int n)
{
Instr instr;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:490,496 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:490,496
}
static int
- sparc64instlen(Map *map, ulong pc)
+ sparc64instlen(Map *map, uvlong pc)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:527,533 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:527,533
address(Instr *i)
{
Symbol s, s2;
- long off, off1;
+ uvlong off, off1;
if (i->rs1 == 1 && plocal(i) >= 0)
return;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:537,543 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:537,543
&& (s.class == CDATA || s.class == CTEXT)) {
if(off==s.value && s.name[0]=='$'){
off1 = 0;
- get4(mymap, s.value, &off1);
+ geta(mymap, s.value, &off1);
if(off1 && findsym(off1, CANY, &s2) && s2.value == off1){
bprint(i, "$%s(SB)", s2.name);
return;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/udb.c:1034,1040 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/udb.c:1034,1040
}
static int
- sparc64foll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+ sparc64foll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
{
ulong w, r1, r2;
char buf[8];
[rsc] --rw-rw-r-- M 451989 glenda sys 3446 Nov 6 10:02 sys/src/libmach/v.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/v.c:106,113 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/v.c:106,114
"setR30", /* static base register name */
0, /* value */
0x1000, /* page size */
- 0xC0000000, /* kernel base */
- 0x40000000, /* kernel text mask */
+ 0xC0000000ULL, /* kernel base */
+ 0x40000000ULL, /* kernel text mask */
+ 0x7FFFFFFFULL, /* user stack top */
4, /* quantization of pc */
4, /* szaddr */
4, /* szreg */
[rsc] --rw-rw-r-- M 451989 glenda sys 10258 Nov 6 10:03 sys/src/libmach/vcodas.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vcodas.c:6,12 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vcodas.c:6,12
/* mips native disassembler */
typedef struct {
- long addr; /* pc of instr */
+ uvlong addr; /* pc of instr */
uchar op; /* bits 31-26 */
uchar rs; /* bits 25-21 */
uchar rt; /* bits 20-16 */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vcodas.c:282,290 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vcodas.c:282,290
static int
- mkinstr(Instr *i, Map *map, ulong pc)
+ mkinstr(Instr *i, Map *map, uvlong pc)
{
- long w;
+ ulong w;
if (get4(map, pc, &w) < 0) {
werrstr("can't read instruction: %r");
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vcodas.c:506,512 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vcodas.c:506,512
}
int
- _mipscoinst(Map *map, ulong pc, char *buf, int n)
+ _mipscoinst(Map *map, uvlong pc, char *buf, int n)
{
Instr i;
Opcode *o;
[rsc] --rw-rw-r-- M 451989 glenda sys 22264 Nov 6 10:03 sys/src/libmach/vdb.c
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:7,16 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:7,16
*/
static char *mipsexcep(Map*, Rgetter);
- static int mipsfoll(Map*, ulong, Rgetter, ulong*);
- static int mipsinst(Map*, ulong, char, char*, int);
- static int mipsdas(Map*, ulong, char*, int);
- static int mipsinstlen(Map*, ulong);
+ static int mipsfoll(Map*, uvlong, Rgetter, uvlong*);
+ static int mipsinst(Map*, uvlong, char, char*, int);
+ static int mipsdas(Map*, uvlong, char*, int);
+ static int mipsinstlen(Map*, uvlong);
/*
* Debugger interface
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:123,129 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:123,129
static char FRAMENAME[] = ".frame";
typedef struct {
- ulong addr;
+ uvlong addr;
uchar op; /* bits 31-26 */
uchar rs; /* bits 25-21 */
uchar rt; /* bits 20-16 */
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:144,152 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:144,152
static Map *mymap;
static int
- decode(ulong pc, Instr *i)
+ decode(uvlong pc, Instr *i)
{
- long w;
+ ulong w;
extern Mach mmips2le;
if (get4(mymap, pc, &w) < 0) {
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:172,178 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:172,178
}
static int
- mkinstr(ulong pc, Instr *i)
+ mkinstr(uvlong pc, Instr *i)
{
Instr x;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:993,999 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:993,999
}
static int
- printins(Map *map, ulong pc, char *buf, int n)
+ printins(Map *map, uvlong pc, char *buf, int n)
{
Instr i;
Opcode *o;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:1046,1056 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:1046,1056
return i.size*4;
}
- extern int _mipscoinst(Map *, ulong, char*, int);
+ extern int _mipscoinst(Map *, uvlong, char*, int);
/* modifier 'I' toggles the default disassembler type */
static int
- mipsinst(Map *map, ulong pc, char modifier, char *buf, int n)
+ mipsinst(Map *map, uvlong pc, char modifier, char *buf, int n)
{
if ((asstype == AMIPSCO && modifier == 'i')
|| (asstype == AMIPS && modifier == 'I'))
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:1060,1066 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:1060,1066
}
static int
- mipsdas(Map *map, ulong pc, char *buf, int n)
+ mipsdas(Map *map, uvlong pc, char *buf, int n)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:1080,1086 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:1080,1086
}
static int
- mipsinstlen(Map *map, ulong pc)
+ mipsinstlen(Map *map, uvlong pc)
{
Instr i;
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/vdb.c:1091,1097 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/vdb.c:1091,1097
}
static int
- mipsfoll(Map *map, ulong pc, Rgetter rget, ulong *foll)
+ mipsfoll(Map *map, uvlong pc, Rgetter rget, uvlong *foll)
{
ulong w, l;
char buf[8];
[rsc] --rw-rw-r-- M 451989 glenda sys 2301 Nov 6 11:01 sys/src/libmach/elf.h
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/elf.h:1,22 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/elf.h:1,21
-
/*
* Definitions needed for accessing Irix ELF headers
*/
typedef struct {
- unsigned char ident[16]; /* ident bytes */
- ushort type; /* file type */
- ushort machine; /* target machine */
- int version; /* file version */
- ulong elfentry; /* start address */
- ulong phoff; /* phdr file offset */
- ulong shoff; /* shdr file offset */
- int flags; /* file flags */
- ushort ehsize; /* sizeof ehdr */
- ushort phentsize; /* sizeof phdr */
- ushort phnum; /* number phdrs */
- ushort shentsize; /* sizeof shdr */
- ushort shnum; /* number shdrs */
- ushort shstrndx; /* shdr string index */
+ uchar ident[16]; /* ident bytes */
+ ushort type; /* file type */
+ ushort machine; /* target machine */
+ int version; /* file version */
+ ulong elfentry; /* start address */
+ ulong phoff; /* phdr file offset */
+ ulong shoff; /* shdr file offset */
+ int flags; /* file flags */
+ ushort ehsize; /* sizeof ehdr */
+ ushort phentsize; /* sizeof phdr */
+ ushort phnum; /* number phdrs */
+ ushort shentsize; /* sizeof shdr */
+ ushort shnum; /* number shdrs */
+ ushort shstrndx; /* shdr string index */
} Ehdr;
typedef struct {
[rsc] --rw-rw-r-- M 451989 glenda sys 604 Nov 6 11:01 sys/src/libmach/obj.h
/n/sourcesdump/2005/1106/plan9/sys/src/libmach/obj.h:21,24 -
/n/sourcesdump/2005/1107/plan9/sys/src/libmach/obj.h:21,24
};
#define UNKNOWN '?'
- void _offset(int, long);
+ void _offset(int, vlong);
64-bit fixes, also deal with PC stack moving.
[rsc] --rw-rw-r-- M 451989 glenda sys 2363 Nov 6 10:04 sys/lib/acid/leak
/n/sourcesdump/2005/1106/plan9/sys/lib/acid/leak:83,89 -
/n/sourcesdump/2005/1107/plan9/sys/lib/acid/leak:83,89
print("range ", type, " ", s\X, " ", e\X, "\n");
x = s;
while x < e do {
- y = *x;
+ y = *(x\X);
if isptr(y) then print("data ", x\X, " ", y\X, " ", type, "\n");
x = x + 4;
}
/n/sourcesdump/2005/1106/plan9/sys/lib/acid/leak:90,98 -
/n/sourcesdump/2005/1107/plan9/sys/lib/acid/leak:90,113
}
defn
+ stacktop()
+ {
+ local e, m;
+
+ m = map();
+ while m != {} do {
+ e = head m;
+ if e[0] == "*data" then
+ return e[2];
+ m = tail m;
+ }
+ return 0x7ffff000;
+ }
+
+ defn
dumpmem()
{
- local s;
+ local s, top;
xbloc = *bloc;
// assume map()[1] is "data"
/n/sourcesdump/2005/1106/plan9/sys/lib/acid/leak:99,110 -
/n/sourcesdump/2005/1107/plan9/sys/lib/acid/leak:114,126
dumprange(map()[1][1], end, "bss"); // bss
dumprange(end, xbloc, "alloc"); // allocated
- if 0x7efff000 < *SP && *SP < 0x7ffff000 then
+ top = stacktop() - 8;
+ if top-0x01000000 < *SP && *SP < top then
s = *SP;
else
- s = 0x7fff7000; // 32 k
+ s = top-32*1024;
- dumprange(s, 0x7ffff000, "stack");
+ dumprange(s, top, "stack");
}
defn
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 4273 Nov 6 10:04 sys/src/cmd/acid/acid.h
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/acid.h:37,43 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/acid.h:37,42
Extern int iop;
Extern char symbol[Strsize];
Extern int interactive;
- Extern Node* code;
Extern int na;
Extern int wtflag;
Extern Map* cormap;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/acid.h:45,59 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/acid.h:44,55
Extern Lsym* hash[Hashsize];
Extern long dogc;
Extern Rplace* ret;
- Extern char* filename;
Extern char* aout;
Extern int gotint;
- Extern long flen;
Extern Gc* gcl;
Extern int stacked;
Extern jmp_buf err;
Extern Node* prnt;
- Extern Node* fomt;
Extern List* tracelist;
Extern int initialising;
Extern int quiet;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/acid.h:182,188 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/acid.h:178,184
void catcher(void*, char*);
void checkqid(int, int);
void cmd(void);
- Node* con(int);
+ Node* con(vlong);
List* construct(Node*);
void ctrace(int);
void decl(Node*);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/acid.h:194,211 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/acid.h:190,206
void error(char*, ...);
void execute(Node*);
void fatal(char*, ...);
- ulong findframe(ulong);
void flatten(Node**, Node*);
void gc(void);
char* getstatus(int);
void* gmalloc(long);
- void indir(Map*, ulong, char, Node*);
+ void indir(Map*, uvlong, char, Node*);
void installbuiltin(void);
void kinit(void);
int Lfmt(Fmt*);
int listcmp(List*, List*);
int listlen(List*);
- List* listvar(char*, long);
+ List* listvar(char*, vlong);
void loadmodule(char*);
void loadvars(void);
Lsym* look(char*);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/acid.h:224,233 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/acid.h:219,227
void pstr(String*);
void pushfile(char*);
void pushstr(Node*);
- ulong raddr(char*);
void readtext(char*);
void restartio(void);
- vlong rget(Map*, char*);
+ uvlong rget(Map*, char*);
String *runenode(Rune*);
int scmp(String*, String*);
void sproc(int);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/acid.h:236,242 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/acid.h:230,236
String* strnode(char*);
String* strnodlen(char*, int);
char* system(void);
- void trlist(Map*, ulong, ulong, Symbol*);
+ void trlist(Map*, uvlong, uvlong, Symbol*);
void unwind(void);
void userinit(void);
void varreg(void);
[rsc] --rw-rw-r-- M 451989 glenda sys 20193 Nov 6 10:04 sys/src/cmd/acid/builtin.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:343,349 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:343,349
{
int n, i;
Node res;
- ulong f[10];
+ uvlong f[10];
List **tail, *l;
if(args == 0)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:370,376 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:370,376
{
int n;
Node res;
- ulong bounds[2];
+ uvlong bounds[2];
List *l;
if(args == 0)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:425,438 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:425,438
c = *p;
*p++ = '\0';
- r->ival = file2pc(res.string->string, atoi(p));
+ r->ival = file2pc(res.string->string, strtol(p, 0, 0));
p[-1] = c;
- if(r->ival == -1)
+ if(r->ival == ~0)
error("filepc(filename:line): can't find address");
r->op = OCONST;
r->type = TINT;
- r->fmt = 'D';
+ r->fmt = 'V';
}
void
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:674,681 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:674,681
r->op = OCONST;
r->type = TINT;
- r->ival = strtoul(res.string->string, 0, 0);
- r->fmt = 'D';
+ r->ival = strtoull(res.string->string, 0, 0);
+ r->fmt = 'V';
}
void
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:683,689 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:683,689
{
Node res;
Node *av[Maxarg];
- int ival;
+ vlong ival;
char buf[128], *fmt;
if(args == 0)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:696,703 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:696,703
expr(av[0], &res);
if(res.type != TINT)
error("itoa(integer): arg type");
- ival = (int)res.ival;
- fmt = "%d";
+ ival = res.ival;
+ fmt = "%lld";
if(na == 2){
expr(av[1], &res);
if(res.type != TSTRING)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:705,711 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:705,711
fmt = res.string->string;
}
- sprint(buf, fmt, ival);
+ snprint(buf, sizeof(buf), fmt, ival);
r->op = OCONST;
r->type = TSTRING;
r->string = strnode(buf);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:733,747 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:733,747
l->next = al(TINT);
l = l->next;
l->ival = m->seg[i].b;
- l->fmt = 'X';
+ l->fmt = 'W';
l->next = al(TINT);
l = l->next;
l->ival = m->seg[i].e;
- l->fmt = 'X';
+ l->fmt = 'W';
l->next = al(TINT);
l = l->next;
l->ival = m->seg[i].f;
- l->fmt = 'X';
+ l->fmt = 'W';
}
return h;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:831,837 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:831,837
strace(Node *r, Node *args)
{
Node *av[Maxarg], *n, res;
- ulong pc, sp;
+ uvlong pc, sp;
na = 0;
flatten(av, args);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:857,863 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:857,863
tracelist = 0;
if ((*machdata->ctrace)(cormap, pc, sp, res.ival, trlist) <= 0)
- error("no stack frame");
+ error("no stack frame: %r");
r->type = TLIST;
r->l = tracelist;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:896,902 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:896,902
free(rp);
}
- char vfmt[] = "aBbcCdDfFgGiIoOqQrRsSuUVxXYZ";
+ char vfmt[] = "aBbcCdDfFgGiIoOqQrRsSuUVWxXYZ";
void
fmt(Node *r, Node *args)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:954,962 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:954,959
case 'x':
Bprint(bout, "%.4lux", (ulong)res->ival&0xffff);
break;
- case 'W':
- Bprint(bout, "%.16llux", res->ival);
- break;
case 'D':
Bprint(bout, "%d", (int)res->ival);
break;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:975,980 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:972,980
case 'V':
Bprint(bout, "%lld", res->ival);
break;
+ case 'W':
+ Bprint(bout, "%.8llux", res->ival);
+ break;
case 'Y':
Bprint(bout, "%.16llux", res->ival);
break;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/builtin.c:1214,1218 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/builtin.c:1214,1218
p = strrchr(buf, ':');
if(p == 0)
error("pcline(addr): funny file %s", buf);
- r->ival = atoi(p+1);
+ r->ival = strtol(p+1, 0, 0);
}
[rsc] --rw-rw-r-- M 451989 glenda sys 5568 Nov 6 10:04 sys/src/cmd/acid/dbg.y
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/dbg.y:11,17 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/dbg.y:11,17
{
Node *node;
Lsym *sym;
- ulong ival;
+ uvlong ival;
float fval;
String *string;
}
[rsc] --rw-rw-r-- M 451989 glenda sys 2162 Nov 6 10:04 sys/src/cmd/acid/dot.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/dot.c:28,34 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/dot.c:28,34
char *s;
Type *t;
Node res;
- ulong addr;
+ uvlong addr;
s = n->sym->name;
if(s == 0)
[rsc] --rw-rw-r-- M 451989 glenda sys 8383 Nov 6 10:04 sys/src/cmd/acid/exec.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/exec.c:62,68 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/exec.c:62,68
Value *v;
Lsym *sl;
Node *l, *r;
- int i, s, e;
+ vlong i, s, e;
Node res, xx;
static int stmnt;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/exec.c:203,213 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/exec.c:203,213
}
void
- indir(Map *m, ulong addr, char fmt, Node *r)
+ indir(Map *m, uvlong addr, char fmt, Node *r)
{
int i;
- long ival;
- vlong vval;
+ ulong lval;
+ uvlong uvval;
int ret;
uchar cval;
ushort sval;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/exec.c:241,246 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/exec.c:241,252
break;
case 'a':
case 'A':
+ r->type = TINT;
+ ret = geta(m, addr, &uvval);
+ if (ret < 0)
+ error("indir: %r");
+ r->ival = uvval;
+ break;
case 'B':
case 'X':
case 'D':
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/exec.c:248,257 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/exec.c:254,263
case 'O':
case 'Q':
r->type = TINT;
- ret = get4(m, addr, &ival);
+ ret = get4(m, addr, &lval);
if (ret < 0)
error("indir: %r");
- r->ival = ival;
+ r->ival = lval;
break;
case 'V':
case 'W':
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/exec.c:258,267 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/exec.c:264,273
case 'Y':
case 'Z':
r->type = TINT;
- ret = get8(m, addr, &vval);
+ ret = get8(m, addr, &uvval);
if (ret < 0)
error("indir: %r");
- r->ival = vval;
+ r->ival = uvval;
break;
case 's':
r->type = TSTRING;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/exec.c:354,359 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/exec.c:360,366
{
uchar cval;
ushort sval;
+ long lval;
Node res, aes;
int ret;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/exec.c:393,404 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/exec.c:400,414
break;
case 'a':
case 'A':
+ ret = puta(m, aes.ival, res.ival);
+ break;
case 'B':
case 'X':
case 'D':
case 'U':
case 'O':
- ret = put4(m, aes.ival, res.ival);
+ lval = res.ival;
+ ret = put4(m, aes.ival, lval);
break;
case 'V':
case 'W':
[rsc] --rw-rw-r-- M 451989 glenda sys 15220 Nov 6 10:04 sys/src/cmd/acid/expr.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/expr.c:135,141 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/expr.c:135,141
{
char *p;
Node *lp;
- long ival;
+ uvlong ival;
Frtype *f;
p = n->sym->name;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/expr.c:553,559 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/expr.c:553,559
res->type = TINT;
if(l.type != TINT || r.type != TINT)
error("bad expr type >>");
- res->ival = (unsigned)l.ival>>r.ival;
+ res->ival = (uvlong)l.ival>>r.ival;
}
void
[rsc] --rw-rw-r-- M 451989 glenda sys 7963 Nov 6 10:04 sys/src/cmd/acid/lex.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/lex.c:168,182 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/lex.c:168,182
e = lexio;
if(e) {
- i = sprint(buf, "%s:%d", e->name, line);
+ i = snprint(buf, sizeof(buf), "%s:%d", e->name, line);
while(e->prev) {
e = e->prev;
if(initialising && e->prev == 0)
break;
- i += sprint(buf+i, " [%s:%d]", e->name, e->line);
+ i += snprint(buf+i, sizeof(buf)-i, " [%s:%d]", e->name, e->line);
}
} else
- sprint(buf, "no file:0");
+ snprint(buf, sizeof(buf), "no file:0");
fmtstrcpy(f, buf);
return 0;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/lex.c:228,233 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/lex.c:228,235
unlexc(c);
break;
}
+ if(n >= Strsize)
+ error("string escape too long");
buf[n++] = c;
}
buf[n] = '\0';
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/lex.c:517,525 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/lex.c:519,527
}
if(isbin)
- yylval.ival = strtoul(symbol+2, 0, 2);
+ yylval.ival = strtoull(symbol+2, 0, 2);
else
- yylval.ival = strtoul(symbol, 0, 0);
+ yylval.ival = strtoull(symbol, 0, 0);
return Tconst;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/lex.c:550,556 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/lex.c:552,558
enter(char *name, int t)
{
Lsym *s;
- ulong h;
+ uint h;
char *p;
Value *v;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/lex.c:581,587 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/lex.c:583,589
look(char *name)
{
Lsym *s;
- ulong h;
+ uint h;
char *p;
h = 0;
[rsc] --rw-rw-r-- M 451989 glenda sys 3680 Nov 6 10:04 sys/src/cmd/acid/list.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/list.c:173,179 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/list.c:173,179
}
List*
- listvar(char *s, long v)
+ listvar(char *s, vlong v)
{
List *l, *tl;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/list.c:192,201 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/list.c:192,201
}
static List*
- listlocals(Map *map, Symbol *fn, ulong fp)
+ listlocals(Map *map, Symbol *fn, uvlong fp)
{
int i;
- long val;
+ uvlong val;
Symbol s;
List **tail, *l2;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/list.c:209,215 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/list.c:209,215
if(s.name[0] == '.')
continue;
- if(get4(map, fp-s.value, &val) > 0) {
+ if(geta(map, fp-s.value, &val) > 0) {
*tail = listvar(s.name, val);
tail = &(*tail)->next;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/list.c:218,228 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/list.c:218,228
}
static List*
- listparams(Map *map, Symbol *fn, ulong fp)
+ listparams(Map *map, Symbol *fn, uvlong fp)
{
int i;
Symbol s;
- long v;
+ uvlong v;
List **tail, *l2;
l2 = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/list.c:233,239 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/list.c:233,239
if (s.class != CPARAM)
continue;
- if(get4(map, fp+s.value, &v) > 0) {
+ if(geta(map, fp+s.value, &v) > 0) {
*tail = listvar(s.name, v);
tail = &(*tail)->next;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/list.c:242,248 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/list.c:242,248
}
void
- trlist(Map *map, ulong pc, ulong sp, Symbol *sym)
+ trlist(Map *map, uvlong pc, uvlong sp, Symbol *sym)
{
List *q, *l;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/list.c:265,271 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/list.c:265,271
l->next = al(TINT); /* called from address */
l = l->next;
l->ival = pc;
- l->fmt = 'X';
+ l->fmt = 'Y';
l->next = al(TLIST); /* make list of params */
l = l->next;
[rsc] --rw-rw-r-- M 451989 glenda sys 8565 Nov 6 10:04 sys/src/cmd/acid/main.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:31,37 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:31,37
{
Lsym *l;
Node *n;
- char buf[128], *s;
+ char *s;
int pid, i;
argv0 = argv[0];
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:73,80 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:73,80
aout = argv[0];
else
if(isnumeric(argv[0])) {
- pid = atoi(argv[0]);
- sprint(prog, "/proc/%d/text", pid);
+ pid = strtol(argv[0], 0, 0);
+ snprint(prog, sizeof(prog), "/proc/%d/text", pid);
aout = prog;
if(argc > 1)
aout = argv[1];
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:90,96 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:90,96
}
} else
if(remote)
- aout = "/mips/bcarrera";
+ aout = "/mips/9ch";
fmtinstall('x', xfmt);
fmtinstall('L', Lfmt);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:114,121 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:114,122
if(access(lm[i], AREAD) >= 0)
loadmodule(lm[i]);
else {
- sprint(buf, "/sys/lib/acid/%s", lm[i]);
- loadmodule(buf);
+ s = smprint("/sys/lib/acid/%s", lm[i]);
+ loadmodule(s);
+ free(s);
}
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:198,212 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:199,215
{
Lsym *l;
Node *n;
- char buf[128], *p;
+ char *buf, *p;
- sprint(buf, "/sys/lib/acid/%s", mach->name);
+ buf = smprint("/sys/lib/acid/%s", mach->name);
loadmodule(buf);
+ free(buf);
p = getenv("home");
if(p != 0) {
- sprint(buf, "%s/lib/acid", p);
+ buf = smprint("%s/lib/acid", p);
silent = 1;
loadmodule(buf);
+ free(buf);
}
interactive = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:244,250 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:247,253
Dir *d;
Lsym *l;
Value *v;
- ulong length;
+ uvlong length;
Symbol sym;
extern Machdata mipsmach;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:335,347 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:338,350
}
Node*
- con(int v)
+ con(vlong v)
{
Node *n;
n = an(OCONST, ZN, ZN);
n->ival = v;
- n->fmt = 'X';
+ n->fmt = 'W';
n->type = TINT;
return n;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:501,507 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:504,510
return;
}
- sprint(buf, "/proc/%d/text", pid);
+ snprint(buf, sizeof(buf), "/proc/%d/text", pid);
fd = open(buf, OREAD);
if(fd < 0 || (d2 = dirfstat(fd)) == nil){
print("checkqid: (qid not checked) dirstat %s: %r\n", buf);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:538,544 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:541,547
system(void)
{
char *cpu, *p, *q;
- static char kernel[128];
+ static char *kernel;
cpu = getenv("cputype");
if(cpu == 0) {
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:547,553 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:550,556
}
p = getenv("terminal");
if(p == 0 || (p=strchr(p, ' ')) == 0 || p[1] == ' ' || p[1] == 0) {
- p = "9power";
+ p = "ch";
print("missing or bad $terminal; assuming %s\n", p);
}
else{
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/main.c:555,562 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/main.c:558,569
q = strchr(p, ' ');
if(q)
*q = 0;
- sprint(kernel, "/%s/9%s", cpu, p);
}
+
+ if(kernel != nil)
+ free(kernel);
+ kernel = smprint("/%s/9%s", cpu, p);
+
return kernel;
}
[rsc] --rw-rw-r-- M 451989 glenda sys 6831 Nov 6 10:04 sys/src/cmd/acid/print.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/print.c:109,116 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/print.c:109,115
if(t == TINT || t == TFLOAT)
Bprint(bout, " format %c", l->v->fmt);
if(l->v->comt)
- Bprint(bout, " complex %s",
- l->v->comt->base->name);
+ Bprint(bout, " complex %s", l->v->comt->base->name);
Bputc(bout, '\n');
def = 1;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/print.c:252,258 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/print.c:251,257
case OCONST:
switch(n->type) {
case TINT:
- Bprint(bout, "%d", (int)n->ival);
+ Bprint(bout, "%lld", n->ival);
break;
case TFLOAT:
Bprint(bout, "%g", n->fval);
[rsc] --rw-rw-r-- M 451989 glenda sys 4356 Nov 6 10:04 sys/src/cmd/acid/proc.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/proc.c:29,41 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/proc.c:29,40
{
Lsym *s;
char buf[64];
- ulong proctab;
- int fd, i, fcor;
+ int i, fcor;
if(symmap == 0)
error("no map");
- sprint(buf, "/proc/%d/mem", pid);
+ snprint(buf, sizeof(buf), "/proc/%d/mem", pid);
fcor = open(buf, ORDWR);
if(fcor < 0)
error("setproc: open %s: %r", buf);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/proc.c:42,64 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/proc.c:41,46
checkqid(symmap->seg[0].fd, pid);
- if(kernel) {
- proctab = 0;
- sprint(buf, "/proc/%d/proc", pid);
- fd = open(buf, OREAD);
- if(fd >= 0) {
- i = read(fd, buf, sizeof(buf));
- if(i >= 0) {
- buf[i] = '\0';
- proctab = strtoul(buf, 0, 0);
- }
- close(fd);
- }
- s = look("proc");
- if(s != 0)
- s->v->ival = proctab;
- }
-
s = look("pid");
s->v->ival = pid;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/proc.c:88,94 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/proc.c:70,76
case 0:
rfork(RFNAMEG|RFNOTEG);
- sprint(buf, "/proc/%d/ctl", getpid());
+ snprint(buf, sizeof(buf), "/proc/%d/ctl", getpid());
fd = open(buf, ORDWR);
if(fd < 0)
fatal("new: open %s: %r", buf);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/proc.c:132,138 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/proc.c:114,120
return;
v = s->v;
- sprint(buf, "/proc/%d/note", pid);
+ snprint(buf, sizeof(buf), "/proc/%d/note", pid);
fd = open(buf, OREAD);
if(fd < 0)
error("pid=%d: open note: %r", pid);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/proc.c:193,199 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/proc.c:175,181
if(new == -1)
error("no free process slots");
- sprint(buf, "/proc/%d/ctl", pid);
+ snprint(buf, sizeof(buf), "/proc/%d/ctl", pid);
fd = open(buf, OWRITE);
if(fd < 0)
error("pid=%d: open ctl: %r", pid);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/proc.c:265,271 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/proc.c:247,253
char *argv[16], buf[64];
static char status[128];
- sprint(buf, "/proc/%d/status", pid);
+ snprint(buf, sizeof(buf), "/proc/%d/status", pid);
fd = open(buf, OREAD);
if(fd < 0)
error("open %s: %r", buf);
[rsc] --rw-rw-r-- M 451989 glenda sys 4609 Nov 6 10:04 sys/src/cmd/acid/util.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/util.c:36,42 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/util.c:36,42
}
}
if(renamed && !quiet)
- print("\t%s=%s %c/%lux\n", s->name, buf, s->type, s->value);
+ print("\t%s=%s %c/%llux\n", s->name, buf, s->type, s->value);
if(l == 0)
l = enter(buf, Tid);
return l;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/util.c:49,55 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/util.c:49,55
Sym *s;
long n;
Lsym *l;
- ulong v;
+ uvlong v;
char buf[1024];
List *list, **tail, *l2, *tl;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/util.c:178,189 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/util.c:178,189
l->v->type = TLIST;
}
- vlong
+ uvlong
rget(Map *map, char *reg)
{
Lsym *s;
- long x;
- vlong v;
+ ulong x;
+ uvlong v;
int ret;
s = look(reg);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/acid/util.c:191,199 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/acid/util.c:191,199
fatal("rget: %s\n", reg);
if(s->v->fmt == 'W')
- ret = get8(map, (long)s->v->ival, &v);
+ ret = get8(map, s->v->ival, &v);
else {
- ret = get4(map, (long)s->v->ival, &x);
+ ret = get4(map, s->v->ival, &x);
v = x;
}
if(ret < 0)
Add -p flag to avoid setting memory private.
[rsc] --rw-rw-r-- M 451989 glenda sys 10524 Nov 6 10:09 sys/src/cmd/auth/factotum/fs.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/auth/factotum/fs.c:3,8 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/auth/factotum/fs.c:3,9
int askforkeys = 1;
char *authaddr;
int debug;
+ int doprivate = 1;
int gflag;
char *owner;
int kflag;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/auth/factotum/fs.c:75,80 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/auth/factotum/fs.c:76,82
break;
case 'd':
debug = 1;
+ doprivate = 0;
break;
case 'g': /* get: prompt for key for name and domain */
gflag = 1;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/auth/factotum/fs.c:88,93 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/auth/factotum/fs.c:90,98
case 'n':
trysecstore = 0;
break;
+ case 'p':
+ doprivate = 0;
+ break;
case 's': /* set service name */
service = EARGF(usage());
break;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/auth/factotum/fs.c:100,106 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/auth/factotum/fs.c:105,111
if(argc != 0 && !gflag)
usage();
- if(!debug)
+ if(doprivate)
private();
initcap();
[rsc] --rw-rw-r-- M 451989 glenda sys 18035 Nov 6 10:09 sys/src/cmd/auth/factotum/util.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/auth/factotum/util.c:348,353 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/auth/factotum/util.c:348,355
if(p && findproto(p) == nil){
werrstr("unknown protocol %s", p);
_freeattr(attr1);
+ _freeattr(attr2);
+ _freeattr(attr3);
return failure(ki->fss, nil);
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/auth/factotum/util.c:374,379 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/auth/factotum/util.c:376,383
}
}
_freeattr(attr1);
+ _freeattr(attr2);
+ _freeattr(attr3);
k->ref++;
*ret = k;
return RpcOk;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/auth/factotum/util.c:381,386 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/auth/factotum/util.c:385,392
}
flog("%d: no key matches %A %A %A %A", ki->fss->seqnum, attr0, attr1, attr2, attr3);
werrstr("no key matches %A %A", attr0, attr1);
+ _freeattr(attr2);
+ _freeattr(attr3);
s = RpcFailure;
if(askforkeys && who==nil && (hasqueries(attr0) || hasqueries(attr1))){
if(nmatch == 0){
64-bit fixes, also fix handling of times in archives.
[rsc] --rw-rw-r-- M 451989 glenda sys 826 Nov 6 10:05 sys/src/cmd/mk/arc.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/arc.c:41,47 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/arc.c:41,47
sym = symlook("NREP", S_VAR, 0);
if(sym){
- w = (Word *) sym->value;
+ w = sym->u.ptr;
if (w && w->s && *w->s)
nreps = atoi(w->s);
}
[rsc] --rw-rw-r-- M 451989 glenda sys 3071 Nov 6 10:05 sys/src/cmd/mk/archive.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/archive.c:18,38 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/archive.c:18,38
t = mtime(archive);
sym = symlook(archive, S_AGG, 0);
if(sym){
- if(force || (t > (long)sym->value)){
+ if(force || t > sym->u.value){
atimes(archive);
- sym->value = (void *)t;
+ sym->u.value = t;
}
}
else{
atimes(archive);
/* mark the aggegate as having been done */
- symlook(strdup(archive), S_AGG, "")->value = (void *)t;
+ symlook(strdup(archive), S_AGG, "")->u.value = t;
}
/* truncate long member name to sizeof of name field in archive header */
snprint(buf, sizeof(buf), "%s(%.*s)", archive, utfnlen(member, SARNAME), member);
sym = symlook(buf, S_TIME, 0);
if (sym)
- return (long)sym->value; /* uggh */
+ return sym->u.value;
return 0;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/archive.c:82,91 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/archive.c:82,92
atimes(char *ar)
{
struct ar_hdr h;
- long t;
+ long at, t;
int fd, i;
char buf[BIGBLOCK];
-
+ Dir *d;
+
fd = open(ar, OREAD);
if(fd < 0)
return;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/archive.c:94,102 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/archive.c:95,111
close(fd);
return;
}
+ if((d = dirfstat(fd)) == nil){
+ close(fd);
+ return;
+ }
+ at = d->mtime;
+ free(d);
while(read(fd, (char *)&h, sizeof(h)) == sizeof(h)){
t = atol(h.date);
- if(t == 0) /* as it sometimes happens; thanks ken */
+ if(t >= at) /* new things in old archives confuses mk */
+ t = at-1;
+ if(t <= 0) /* as it sometimes happens; thanks ken */
t = 1;
for(i = sizeof(h.name)-1; i > 0 && h.name[i] == ' '; i--)
;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/archive.c:104,110 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/archive.c:113,119
i--;
h.name[i+1]=0; /* can stomp on date field */
sprint(buf, "%s(%s)", ar, h.name);
- symlook(strdup(buf), S_TIME, (void *)t)->value = (void *)t;
+ symlook(strdup(buf), S_TIME, (void*)t)->u.value = t;
t = atol(h.size);
if(t&01) t++;
LSEEK(fd, t, 1);
[rsc] --rw-rw-r-- M 451989 glenda sys 2281 Nov 6 10:05 sys/src/cmd/mk/env.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/env.c:79,85 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/env.c:79,85
for(p = myenv; *p; p++)
if(strcmp(*p, s->name) == 0)
return;
- envinsert(s->name, (Word *) s->value);
+ envinsert(s->name, s->u.ptr);
}
void
[rsc] --rw-rw-r-- M 451989 glenda sys 1299 Nov 6 10:05 sys/src/cmd/mk/file.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/file.c:22,28 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/file.c:22,28
sym = symlook(name, S_TIME, 0);
if (sym)
- return (long) sym->value; /* uggh */
+ return sym->u.value; /* uggh */
t = mkmtime(name, 0);
if(t == 0)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/file.c:76,82 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/file.c:76,82
} while(*s);
c = *s;
*s = 0;
- symlook(strdup(cp), S_TIME, (void *)t)->value = (void *)t;
+ symlook(strdup(cp), S_TIME, (void *)t)->u.value = t;
if (c)
*s++ = c;
while(*s){
[rsc] --rw-rw-r-- M 451989 glenda sys 5822 Nov 6 10:05 sys/src/cmd/mk/graph.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/graph.c:40,46 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/graph.c:40,46
/* print("applyrules(%lux='%s')\n", target, target);/**/
sym = symlook(target, S_NODE, 0);
if(sym)
- return (Node *)(sym->value);
+ return sym->u.ptr;
target = strdup(target);
node = newnode(target);
head.n = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/graph.c:47,53 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/graph.c:47,53
head.next = 0;
sym = symlook(target, S_TARGET, 0);
memset((char*)rmatch, 0, sizeof(rmatch));
- for(r = sym? (Rule *)(sym->value):0; r; r = r->chain){
+ for(r = sym? sym->u.ptr:0; r; r = r->chain){
if(r->attr&META) continue;
if(strcmp(target, r->target)) continue;
if((!r->recipe || !*r->recipe) && (!r->tail || !r->tail->s || !*r->tail->s)) continue; /* no effect; ignore */
[rsc] --rw-rw-r-- M 451989 glenda sys 5330 Nov 6 10:05 sys/src/cmd/mk/mk.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/mk.c:217,227 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/mk.c:217,227
str = strdup(buf);
ret = pcmp(arc->prog, node->name, arc->n->name);
if(sym)
- sym->value = (void *)ret;
+ sym->u.value = ret;
else
symlook(str, S_OUTOFDATE, (void *)ret);
} else
- ret = (int)(uintptr)sym->value;
+ ret = sym->u.value;
return(ret-1);
} else if(strchr(arc->n->name, '(') && arc->n->time == 0) /* missing archive member */
return 1;
[rsc] --rw-rw-r-- M 451989 glenda sys 3765 Nov 6 10:05 sys/src/cmd/mk/mk.h
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/mk.h:116,122 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/mk.h:116,125
{
short space;
char *name;
- void *value;
+ union{
+ void *ptr;
+ uintptr value;
+ } u;
struct Symtab *next;
} Symtab;
[rsc] --rw-rw-r-- M 451989 glenda sys 6941 Nov 6 10:05 sys/src/cmd/mk/plan9.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/plan9.c:49,55 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/plan9.c:49,55
free(p);
p = strdup(e[i].name);
setvar(p, (void *) w);
- symlook(p, S_EXPORTED, (void*)"")->value = (void*)"";
+ symlook(p, S_EXPORTED, (void*)"")->u.ptr = "";
}
free(e);
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/plan9.c:346,352 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/plan9.c:346,351
dirtime(char *dir, char *path)
{
int i, fd, n;
- void *t;
Dir *d;
char buf[4096];
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/plan9.c:354,366 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/plan9.c:353,364
if(fd >= 0){
while((n = dirread(fd, &d)) > 0){
for(i=0; i<n; i++){
- t = (void*)d[i].mtime;
- if(t == nil)
+ if(d[i].mtime == 0) /* yeah, this is likely */
continue;
sprint(buf, "%s%s", path, d[i].name);
if(symlook(buf, S_TIME, 0))
continue;
- symlook(strdup(buf), S_TIME, t)->value = t;
+ symlook(strdup(buf), S_TIME, (void*)d[i].mtime)->u.value = d[i].mtime;
}
free(d);
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/plan9.c:423,429 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/plan9.c:421,427
if(!force){
sym = symlook(name, S_TIME, 0);
if(sym)
- return (ulong)sym->value;
+ return sym->u.value;
return 0;
}
if((d = dirstat(name)) == nil)
[rsc] --rw-rw-r-- M 451989 glenda sys 2543 Nov 6 10:05 sys/src/cmd/mk/recipe.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/recipe.c:63,69 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/recipe.c:63,69
aw = aw->next;
if((s = symlook(buf, S_NODE, 0)) == 0)
continue; /* not a node we are interested in */
- n = (Node *)s->value;
+ n = s->u.ptr;
if(aflag == 0 && n->time) {
for(a = n->prereqs; a; a = a->next)
if(a->n && outofdate(n, a, 0))
[rsc] --rw-rw-r-- M 451989 glenda sys 1946 Nov 6 10:05 sys/src/cmd/mk/rule.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/rule.c:15,21 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/rule.c:15,21
r = 0;
reuse = 0;
if(sym = symlook(head, S_TARGET, 0)){
- for(r = (Rule *)sym->value; r; r = r->chain)
+ for(r = sym->u.ptr; r; r = r->chain)
if(rcmp(r, head, tail) == 0){
reuse = 1;
break;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/rule.c:34,40 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/rule.c:34,40
r->rule = nrules++;
if(!reuse){
- rr = (Rule *)symlook(head, S_TARGET, (void *)r)->value;
+ rr = symlook(head, S_TARGET, r)->u.ptr;
if(rr != r){
r->chain = rr->chain;
rr->chain = r;
[rsc] --rw-rw-r-- M 451989 glenda sys 5063 Nov 6 10:05 sys/src/cmd/mk/run.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/run.c:169,175 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/run.c:169,175
for(w = j->t; w; w = w->next){
if((s = symlook(w->s, S_NODE, 0)) == 0)
continue; /* not interested in this node */
- update(uarg, (Node *)s->value);
+ update(uarg, s->u.ptr);
}
if(nrunning < nproclimit)
sched();
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/run.c:183,189 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/run.c:183,189
Word *w;
if(sym = symlook("NPROC", S_VAR, 0)) {
- w = (Word *) sym->value;
+ w = sym->u.ptr;
if (w && w->s && w->s[0])
nproclimit = atoi(w->s);
}
[rsc] --rw-rw-r-- M 451989 glenda sys 1581 Nov 6 10:05 sys/src/cmd/mk/symtab.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/symtab.c:36,42 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/symtab.c:36,42
s = (Symtab *)Malloc(sizeof(Symtab));
s->space = space;
s->name = sym;
- s->value = install;
+ s->u.ptr = install;
s->next = hash[h];
hash[h] = s;
return(s);
[rsc] --rw-rw-r-- M 451989 glenda sys 530 Nov 6 10:05 sys/src/cmd/mk/var.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/var.c:3,9 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/var.c:3,9
void
setvar(char *name, void *value)
{
- symlook(name, S_VAR, value)->value = value;
+ symlook(name, S_VAR, value)->u.ptr = value;
symlook(name, S_MAKEVAR, (void*)"");
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/var.c:13,19 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/var.c:13,19
Word *w;
Bprint(&bout, "\t%s=", s->name);
- for (w = (Word *) s->value; w; w = w->next)
+ for (w = s->u.ptr; w; w = w->next)
Bprint(&bout, "'%s'", w->s);
Bprint(&bout, "\n");
}
[rsc] --rw-rw-r-- M 451989 glenda sys 4425 Nov 6 10:05 sys/src/cmd/mk/varsub.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/varsub.c:66,72 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/varsub.c:66,72
sym = symlook(name, S_VAR, 0);
if(sym){
/* check for at least one non-NULL value */
- for (w = (Word*)sym->value; w; w = w->next)
+ for (w = sym->u.ptr; w; w = w->next)
if(w->s && *w->s)
return wdup(w);
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/mk/varsub.c:113,122 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/mk/varsub.c:113,122
*s = end+1;
sym = symlook(buf->start, S_VAR, 0);
- if(sym == 0 || sym->value == 0)
+ if(sym == 0 || sym->u.value == 0)
w = newword(buf->start);
else
- w = subsub((Word*) sym->value, cp, end);
+ w = subsub(sym->u.ptr, cp, end);
freebuf(buf);
return w;
}
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 7964 Nov 6 10:04 sys/src/cmd/rdbfs.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/rdbfs.c:275,281 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/rdbfs.c:275,281
{
char buf[ERRMAX];
- switch((int)r->fid->file->aux){
+ switch((uintptr)r->fid->file->aux){
case Xtext:
close(textfd);
textfd = open(textfile, OREAD);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/rdbfs.c:295,301 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/rdbfs.c:295,301
int i, n;
char buf[512];
- switch((int)r->fid->file->aux) {
+ switch((uintptr)r->fid->file->aux) {
case Xfpregs:
case Xproc:
case Xregs:
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/rdbfs.c:336,342 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/rdbfs.c:336,342
{
char buf[ERRMAX];
- switch((int)r->fid->file->aux) {
+ switch((uintptr)r->fid->file->aux) {
case Xctl:
if(strncmp(r->ifcall.data, "kill", 4) == 0 ||
strncmp(r->ifcall.data, "exit", 4) == 0) {
64-bit fixes.
[jmk] --rw-rw-r-- M 451989 glenda sys 4377 Nov 6 12:25 sys/src/cmd/db/command.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/command.c:150,156 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/command.c:150,156
map = symmap;
}
if (!map) {
- sprint(buf, "no map for %c", pc);
+ snprint(buf, sizeof(buf), "no map for %c", pc);
error(buf);
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/command.c:186,192 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/command.c:186,192
void
cmdsrc(int c, Map *map)
{
- long w;
+ ulong w;
long locval, locmsk;
ADDR savdot;
ushort sh;
[rsc] --rw-rw-r-- M 451989 glenda sys 1700 Nov 6 11:02 sys/src/cmd/db/defs.h
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/defs.h:10,17 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/defs.h:10,17
#include <mach.h>
- typedef long WORD;
- typedef vlong ADDR;
+ typedef ulong WORD;
+ typedef uvlong ADDR;
#define HUGEINT 0x7fffffff /* enormous WORD */
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/defs.h:57,62 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/defs.h:57,63
#define BKPTSKIP 2 /* real, skip over it next time */
#define BKPTTMP 3 /* temporary; clear when it happens */
+ typedef struct bkpt BKPT;
struct bkpt {
ADDR loc;
uchar save[4];
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/defs.h:64,72 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/defs.h:65,72
int initcnt;
int flag;
char comm[MAXCOM];
- struct bkpt *nxtbkpt;
+ BKPT *nxtbkpt;
};
- typedef struct bkpt BKPT;
#define BADREG (-1)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/defs.h:75,81 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/defs.h:75,81
*/
extern WORD adrval;
- extern vlong expv;
+ extern uvlong expv;
extern int adrflg;
extern WORD cntval;
extern int cntflg;
[rsc] --rw-rw-r-- M 451989 glenda sys 5441 Nov 6 11:02 sys/src/cmd/db/expr.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/expr.c:10,16 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/expr.c:10,16
static long round(long, long);
extern ADDR ditto;
- vlong expv;
+ uvlong expv;
static WORD
ascval(void)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/expr.c:119,131 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/expr.c:119,131
term(int a)
{ /* item | monadic item | (expr) | */
- WORD e;
+ ADDR e;
switch ((int)readchar()) {
case '*':
term(a|1);
- if (get4(cormap, (ADDR)expv, &e) < 0)
+ if (geta(cormap, expv, &e) < 0)
error("%r");
expv = e;
return(1);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/expr.c:132,138 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/expr.c:132,138
case '@':
term(a|1);
- if (get4(symmap, (ADDR)expv, &e) < 0)
+ if (geta(symmap, expv, &e) < 0)
error("%r");
expv = e;
return(1);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/expr.c:163,169 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/expr.c:163,169
{ /* name [ . local ] | number | . | ^ | <register | 'x | | */
char *base;
char savc;
- WORD e;
+ uvlong e;
Symbol s;
char gsym[MAXSYM], lsym[MAXSYM];
[jmk] --rw-rw-r-- M 451989 glenda sys 2014 Nov 6 12:25 sys/src/cmd/db/fns.h
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/fns.h:24,33 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/fns.h:24,29
void execbkpt(BKPT*, int);
char* exform(int, int, char*, Map*, int, int);
int expr(int);
- /*
- void fixregs(Map*);
- void adjustreg(char*, ulong, long);
- */
void flush(void);
void flushbuf(void);
char* getfname(void);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/fns.h:35,41 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/fns.h:31,37
int getnum(int (*)(void));
void grab(void);
void iclose(int, int);
- ADDR inkdot(long);
+ ADDR inkdot(WORD);
int isfileref(void);
int item(int);
void killpcs(void);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/fns.h:55,61 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/fns.h:51,57
void printpc(void);
void printregs(int);
void prints(char*);
- void printsource(long);
+ void printsource(ADDR);
void printsym(void);
void printsyscall(void);
void printtrace(int);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/fns.h:68,79 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/fns.h:64,75
void readfname(char *);
void reread(void);
char* regname(int);
- vlong rget(Map*, char*);
+ uvlong rget(Map*, char*);
Reglist* rname(char*);
void rput(Map*, char*, vlong);
int runpcs(int, int);
void runrun(int);
- void runstep(ulong, int);
+ void runstep(uvlong, int);
BKPT* scanbkpt(ADDR adr);
void scanform(long, int, char*, Map*, int);
void setbp(void);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/fns.h:88,90 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/fns.h:84,89
int term(int);
void ungrab(void);
int valpr(long, int);
+
+ #pragma varargck argpos dprint 1
+ #pragma varargck type "t" void
[jmk] --rw-rw-r-- M 451989 glenda sys 6868 Nov 6 12:25 sys/src/cmd/db/format.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/format.c:51,59 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/format.c:51,59
* sets `dotinc' and moves `dot'
* returns address of next format item
*/
- vlong v;
- long w;
- ulong savdot;
+ uvlong v;
+ ulong w;
+ ADDR savdot;
char *fp;
char c, modifier;
int i;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/format.c:102,108 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/format.c:102,108
break;
case 'A':
- dprint("%#lux%10t", dot);
+ dprint("%#llux%10t", dot);
dotinc = 0;
break;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/format.c:294,300 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/format.c:294,300
case 'f':
/* BUG: 'f' and 'F' assume szdouble is sizeof(vlong) in the literal case */
if (literal) {
- v = machdata->swav((ulong)dot);
+ v = machdata->swav(dot);
memmove(buf, &v, mach->szfloat);
}else if (get1(map, dot, (uchar*)buf, mach->szfloat) < 0)
error("%r");
[jmk] --rw-rw-r-- M 451989 glenda sys 5949 Nov 6 12:25 sys/src/cmd/db/print.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:20,26 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:20,26
* callback on stack trace
*/
static void
- ptrace(Map *map, ulong pc, ulong sp, Symbol *sym)
+ ptrace(Map *map, uvlong pc, uvlong sp, Symbol *sym)
{
char buf[512];
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:41,53 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:41,53
void
printtrace(int modif)
{
- int i;
- ulong pc, sp, link;
- long v;
+ int i;
+ uvlong pc, sp, link;
+ ulong w;
BKPT *bk;
Symbol s;
- int stack;
- char *fname;
+ int stack;
+ char *fname;
char buf[512];
if (cntflg==0)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:127,135 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:127,140
case 'C':
tracetype = modif;
if (machdata->ctrace) {
- if (adrflg) { /* trace from jmpbuf for multi-threaded code */
- if (get4(cormap, adrval, (long*)&sp) < 0 ||
- get4(cormap, adrval+4, (long*)&pc) < 0)
+ if (adrflg) {
+ /*
+ * trace from jmpbuf for multi-threaded code.
+ * assume sp and pc are in adjacent locations
+ * and mach->szaddr in size.
+ */
+ if (geta(cormap, adrval, &sp) < 0 ||
+ geta(cormap, adrval+mach->szaddr, &pc) < 0)
error("%r");
} else {
sp = rget(cormap, mach->sp);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:147,154 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:152,159
/*print externals*/
case 'e':
for (i = 0; globalsym(&s, i); i++) {
- if (get4(cormap, s.value, &v) > 0)
- dprint("%s/%12t%#lux\n", s.name, v);
+ if (get4(cormap, s.value, &w) > 0)
+ dprint("%s/%12t%#lux\n", s.name, w);
}
break;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:226,232 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:231,237
void
redirin(int stack, char *file)
{
- char pfile[ARB];
+ char *pfile;
if (file == 0) {
iclose(-1, 0);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:234,243 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:239,248
}
iclose(stack, 0);
if ((infile = open(file, 0)) < 0) {
- strcpy(pfile, Ipath);
- strcat(pfile, "/");
- strcat(pfile, file);
- if ((infile = open(pfile, 0)) < 0) {
+ pfile = smprint("%s/%s", Ipath, file);
+ infile = open(pfile, 0);
+ free(pfile);
+ if(infile < 0) {
infile = STDIN;
error("cannot open");
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:259,266 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:264,272
dprint("%s\n", s);
for (i = 0; i < map->nsegs; i++) {
if (map->seg[i].inuse)
- dprint("%s%8t%-16#lux %-16#lux %-16#lux\n", map->seg[i].name,
- map->seg[i].b, map->seg[i].e, map->seg[i].f);
+ dprint("%s%8t%-16#llux %-16#llux %-16#llux\n",
+ map->seg[i].name, map->seg[i].b,
+ map->seg[i].e, map->seg[i].f);
}
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:277,287 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:283,293
switch(sp->type) {
case 't':
case 'l':
- dprint("%8#lux t %s\n", sp->value, sp->name);
+ dprint("%16#llux t %s\n", sp->value, sp->name);
break;
case 'T':
case 'L':
- dprint("%8#lux T %s\n", sp->value, sp->name);
+ dprint("%16#llux T %s\n", sp->value, sp->name);
break;
case 'D':
case 'd':
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:290,296 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:296,302
case 'a':
case 'p':
case 'm':
- dprint("%8#lux %c %s\n", sp->value, sp->type, sp->name);
+ dprint("%16#llux %c %s\n", sp->value, sp->type, sp->name);
break;
default:
break;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:304,310 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:310,316
* print the value of dot as file:line
*/
void
- printsource(long dot)
+ printsource(ADDR dot)
{
char str[STRINGSZ];
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:317,323 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:323,329
{
char buf[512];
- dot = (ulong)rget(cormap, mach->pc);
+ dot = rget(cormap, mach->pc);
if(dot){
printsource((long)dot);
printc(' ');
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:333,339 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:339,345
printlocals(Symbol *fn, ADDR fp)
{
int i;
- long val;
+ ulong w;
Symbol s;
s = *fn;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:340,347 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:346,353
for (i = 0; localsym(&s, i); i++) {
if (s.class != CAUTO)
continue;
- if (get4(cormap, fp-s.value, &val) > 0)
- dprint("%8t%s.%s/%10t%#lux\n", fn->name, s.name, val);
+ if (get4(cormap, fp-s.value, &w) > 0)
+ dprint("%8t%s.%s/%10t%#lux\n", fn->name, s.name, w);
else
dprint("%8t%s.%s/%10t?\n", fn->name, s.name);
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:352,358 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:358,364
{
int i;
Symbol s;
- long v;
+ ulong w;
int first = 0;
fp += mach->szaddr; /* skip saved pc */
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/print.c:362,368 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/print.c:368,374
continue;
if (first++)
dprint(", ");
- if (get4(cormap, fp+s.value, &v) > 0)
- dprint("%s=%#lux", s.name, v);
+ if (get4(cormap, fp+s.value, &w) > 0)
+ dprint("%s=%#lux", s.name, w);
}
}
[jmk] --rw-rw-r-- M 451989 glenda sys 1998 Nov 6 12:25 sys/src/cmd/db/regs.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/regs.c:19,29 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/regs.c:19,30
return 0;
}
- static vlong
+ static uvlong
getreg(Map *map, Reglist *rp)
{
- vlong v;
- long w;
+ uvlong v;
+ ulong w;
+ ushort s;
int ret;
v = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/regs.c:31,42 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/regs.c:32,43
switch (rp->rformat)
{
case 'x':
- ret = get2(map, rp->roffs, (ushort*) &w);
- v = w;
+ ret = get2(map, rp->roffs, &s);
+ v = s;
break;
case 'f':
case 'X':
- ret = get4(map, rp->roffs, (long*) &w);
+ ret = get4(map, rp->roffs, &w);
v = w;
break;
case 'F':
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/regs.c:55,61 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/regs.c:56,62
return v;
}
- vlong
+ uvlong
rget(Map *map, char *name)
{
Reglist *rp;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/regs.c:104,109 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/regs.c:105,111
{
Reglist *rp;
int i;
+ uvlong v;
for (i = 1, rp = mach->reglist; rp->rname; rp++, i++) {
if ((rp->rflags & RFLT)) {
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/regs.c:112,121 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/regs.c:114,124
if (rp->rformat == '8' || rp->rformat == '3')
continue;
}
+ v = getreg(cormap, rp);
if(rp->rformat == 'Y')
- dprint("%-8s %-20#llux", rp->rname, getreg(cormap, rp));
+ dprint("%-8s %-20#llux", rp->rname, v);
else
- dprint("%-8s %-12#lux", rp->rname, (ulong)getreg(cormap, rp));
+ dprint("%-8s %-12#lux", rp->rname, (ulong)v);
if ((i % 3) == 0) {
dprint("\n");
i = 0;
[jmk] --rw-rw-r-- M 451989 glenda sys 4433 Nov 6 12:25 sys/src/cmd/db/trcrun.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/trcrun.c:205,214 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/trcrun.c:205,214
}
void
- runstep(ulong loc, int keepnote)
+ runstep(uvlong loc, int keepnote)
{
int nfoll;
- ulong foll[3];
+ uvlong foll[3];
BKPT bkpt[3];
int i;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/db/trcrun.c:264,270 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/db/trcrun.c:264,270
bkput(BKPT *bp, int install)
{
char buf[256];
- ulong loc;
+ ADDR loc;
int ret;
errstr(buf, sizeof buf);
[jmk] --rw-rw-r-- M 451989 glenda sys 4377 Nov 6 12:25 sys/src/cmd/db/command.c
[jmk] --rw-rw-r-- M 451989 glenda sys 2014 Nov 6 12:25 sys/src/cmd/db/fns.h
[jmk] --rw-rw-r-- M 451989 glenda sys 6868 Nov 6 12:25 sys/src/cmd/db/format.c
[jmk] --rw-rw-r-- M 451989 glenda sys 5949 Nov 6 12:25 sys/src/cmd/db/print.c
[jmk] --rw-rw-r-- M 451989 glenda sys 1998 Nov 6 12:25 sys/src/cmd/db/regs.c
[jmk] --rw-rw-r-- M 451989 glenda sys 4433 Nov 6 12:25 sys/src/cmd/db/trcrun.c
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 4837 Nov 6 11:02 sys/src/cmd/vi/mips.h
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/vi/mips.h:193,199 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/vi/mips.h:193,199
void initstk(int, char**);
void reset(void);
void dobplist(void);
- int _mipscoinst(Map*, ulong, char*, int);
+ int _mipscoinst(Map*, uvlong, char*, int);
void procinit(int);
void printsource(long);
void printparams(Symbol *, ulong);
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 4914 Nov 6 11:02 sys/src/cmd/nm.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/nm.c:265,271 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/nm.c:265,271
} else
cp = s->name;
if (s->value || s->type == 'a' || s->type == 'p')
- Bprint(&bout, "%8lux %c %s\n", s->value, s->type, cp);
+ Bprint(&bout, "%16llux %c %s\n", s->value, s->type, cp);
else
Bprint(&bout, " %c %s\n", s->type, cp);
}
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 1407 Nov 6 11:07 sys/include/a.out.h
/n/sourcesdump/2005/1106/plan9/sys/include/a.out.h:11,41 -
/n/sourcesdump/2005/1107/plan9/sys/include/a.out.h:11,44
long pcsz; /* size of pc/line number table */
};
- #define _MAGIC(b) ((((4*b)+0)*b)+7)
- #define A_MAGIC _MAGIC(8) /* 68020 */
- #define I_MAGIC _MAGIC(11) /* intel 386 */
- #define J_MAGIC _MAGIC(12) /* intel 960 (retired) */
- #define K_MAGIC _MAGIC(13) /* sparc */
- #define V_MAGIC _MAGIC(16) /* mips 3000 BE */
- #define X_MAGIC _MAGIC(17) /* att dsp 3210 (retired) */
- #define M_MAGIC _MAGIC(18) /* mips 4000 BE */
- #define D_MAGIC _MAGIC(19) /* amd 29000 (retired) */
- #define E_MAGIC _MAGIC(20) /* arm */
- #define Q_MAGIC _MAGIC(21) /* powerpc */
- #define N_MAGIC _MAGIC(22) /* mips 4000 LE */
- #define L_MAGIC _MAGIC(23) /* dec alpha */
- #define P_MAGIC _MAGIC(24) /* mips 3000 LE */
- #define U_MAGIC _MAGIC(25) /* sparc64 */
- #define S_MAGIC _MAGIC(26) /* amd64 */
+ #define HDR_MAGIC 0x00008000 /* header expansion */
+
+ #define _MAGIC(f, b) ((f)|((((4*(b))+0)*(b))+7))
+ #define A_MAGIC _MAGIC(0, 8) /* 68020 */
+ #define I_MAGIC _MAGIC(0, 11) /* intel 386 */
+ #define J_MAGIC _MAGIC(0, 12) /* intel 960 (retired) */
+ #define K_MAGIC _MAGIC(0, 13) /* sparc */
+ #define V_MAGIC _MAGIC(0, 16) /* mips 3000 BE */
+ #define X_MAGIC _MAGIC(0, 17) /* att dsp 3210 (retired) */
+ #define M_MAGIC _MAGIC(0, 18) /* mips 4000 BE */
+ #define D_MAGIC _MAGIC(0, 19) /* amd 29000 (retired) */
+ #define E_MAGIC _MAGIC(0, 20) /* arm */
+ #define Q_MAGIC _MAGIC(0, 21) /* powerpc */
+ #define N_MAGIC _MAGIC(0, 22) /* mips 4000 LE */
+ #define L_MAGIC _MAGIC(0, 23) /* dec alpha */
+ #define P_MAGIC _MAGIC(0, 24) /* mips 3000 LE */
+ #define U_MAGIC _MAGIC(0, 25) /* sparc64 */
+ #define S_MAGIC _MAGIC(HDR_MAGIC, 26) /* amd64 */
+
#define MIN_MAGIC 8
- #define MAX_MAGIC 26
+ #define MAX_MAGIC 26 /* <= 90 */
- #define DYN_MAGIC 0x80000000 /* or'd in for dynamically loaded modules */
+ #define DYN_MAGIC 0x80000000 /* dlm */
typedef struct Sym Sym;
struct Sym
{
- long value;
+ vlong value;
char type;
char *name;
};
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 523 Nov 6 11:07 sys/man/1/strip
/n/sourcesdump/2005/1106/plan9/sys/man/1/strip:3,18 -
/n/sourcesdump/2005/1107/plan9/sys/man/1/strip:3,30
strip \- remove symbols from binary files
.SH SYNOPSIS
.B strip
- [
.I file ...
- ]
+ .PP
+ .B strip
+ .B -o
+ .I ofile
+ .I file
.SH DESCRIPTION
.I Strip
- removes symbol table segments from executable files, rewriting the files in place.
+ removes symbol table segments from executable files,
+ rewriting the files in place.
Stripping a file requires write permission of the file
and the directory it is in.
- If no file is given,
- standard input is stripped and the result written to standard output.
+ .PP
+ If the
+ .B -o
+ flag is given,
+ the single input file
+ .I file
+ is stripped and the result written to
+ .IR ofile .
+ .I File
+ is unchanged.
.SH SOURCE
.B /sys/src/cmd/strip.c
.SH "SEE ALSO"
[rsc] --rw-rw-r-- M 451989 glenda sys 2502 Nov 6 11:07 sys/src/cmd/strip.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/strip.c:1,206 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/strip.c:1,170
#include <u.h>
#include <libc.h>
- #include <a.out.h>
+ #include <bio.h>
+ #include <mach.h>
- int strip(char*);
- int stripfilt(int, int);
void
- main(int argc, char *argv[])
+ error(char* fmt, ...)
{
- int i;
- int rv;
+ va_list arg;
+ char *e, s[256];
- rv = 0;
+ va_start(arg, fmt);
+ e = seprint(s, s+sizeof(s), "%s: ", argv0);
+ e = vseprint(e, s+sizeof(s), fmt, arg);
+ e = seprint(e, s+sizeof(s), "\n");
+ va_end(arg);
- if(argc == 1) {
- if(stripfilt(0, 1))
- exits("error");
- exits(0);
- }
-
- for(i = 1; i < argc; i++)
- rv |= strip(argv[i]);
- if(rv)
- exits("error");
- exits(0);
+ write(2, s, e-s);
}
- long
- ben(long xen)
+ static void
+ usage(void)
{
- union
- {
- long xen;
- uchar uch[sizeof(long)];
- } u;
-
- u.xen = xen;
- return (u.uch[0] << 24) | (u.uch[1] << 16) | (u.uch[2] << 8) | (u.uch[3] << 0);
+ error("usage: %s -o ofile file\n\t%s file ...\n", argv0, argv0);
+ exits("usage");
}
- int
- stripfilt(int in, int out)
+ static int
+ strip(char* file, char* out)
{
- Exec exec;
- int i, j, n, m, len;
- char buf[8192];
+ Dir *dir;
+ int fd, i;
+ Fhdr fhdr;
+ Exec *exec;
+ ulong mode;
+ void *data;
+ vlong length;
- /*
- * read header
- */
-
- if(readn(in, &exec, sizeof(Exec)) != sizeof(Exec)) {
- fprint(2, "strip: short read\n");
+ if((fd = open(file, OREAD)) < 0){
+ error("%s: open: %r", file);
return 1;
}
- i = ben(exec.magic);
- for (j = MIN_MAGIC; j <= MAX_MAGIC; j++)
- if (i == _MAGIC(j))
- break;
- if (j > MAX_MAGIC) {
- fprint(2, "strip: not a recognizable binary\n");
- return 1;
- }
- len = ben(exec.data) + ben(exec.text);
-
- /*
- * copy exec, text and data
- */
- exec.syms = 0;
- exec.spsz = 0;
- exec.pcsz = 0;
- write(out, &exec, sizeof(exec));
-
- for(n=0; n<len; n+=m) {
- m = len - n;
- if(m > sizeof(buf))
- m = sizeof(buf);
- if((m = read(in, buf, m)) < 0) {
- fprint(2, "strip: premature eof: %r\n");
- return 1;
- }
- if(write(out, buf, m) != m) {
- fprint(2, "strip: write error; %r\n");
- return 1;
- }
- }
-
- return 0;
- }
-
-
- int
- strip(char *file)
- {
- int fd;
- Exec exec;
- char *data;
- Dir *d;
- long n, len;
- int i, j;
-
- /*
- * make sure file is executable
- */
- d = dirstat(file);
- if(d == nil){
- perror(file);
+ if(!crackhdr(fd, &fhdr)){
+ error("%s: %r", file);
+ close(fd);
return 1;
}
- if((d->qid.path & (DMDIR|DMAPPEND|DMEXCL))){
- fprint(2, "strip: %s must be executable\n", file);
- return 1;
+ for(i = MIN_MAGIC; i <= MAX_MAGIC; i++){
+ if(fhdr.magic == _MAGIC(0, i) || fhdr.magic == _MAGIC(HDR_MAGIC, i))
+ break;
}
- /*
- * read its header and see if that makes sense
- */
- fd = open(file, OREAD);
- if(fd < 0){
- perror(file);
- free(d);
- return 1;
- }
- n = read(fd, &exec, sizeof exec);
- if (n != sizeof(exec)) {
- fprint(2, "strip: Unable to read header of %s\n", file);
+ if(i > MAX_MAGIC){
+ error("%s: not a recognizeable binary", file);
close(fd);
- free(d);
return 1;
}
- i = ben(exec.magic);
- for (j = MIN_MAGIC; j <= MAX_MAGIC; j++)
- if (i == _MAGIC(j))
- break;
- if (j > MAX_MAGIC) {
- fprint(2, "strip: %s is not a recognizable binary\n", file);
+
+ if((dir = dirfstat(fd)) == nil){
+ error("%s: stat: %r", file);
close(fd);
- free(d);
return 1;
}
- len = ben(exec.data) + ben(exec.text);
- if(len+sizeof(exec) == d->length) {
- fprint(2, "strip: %s is already stripped\n", file);
- close(fd);
- free(d);
- return 0;
+ length = fhdr.datoff+fhdr.datsz;
+ if(length == dir->length){
+ if(out == nil){ /* nothing to do */
+ error("%s: already stripped", file);
+ free(dir);
+ close(fd);
+ return 0;
+ }
}
- if(len+sizeof(exec) > d->length) {
- fprint(2, "strip: %s has strange length\n", file);
+ if(length > dir->length){
+ error("%s: strange length", file);
close(fd);
- free(d);
+ free(dir);
return 1;
}
- /*
- * allocate a huge buffer, copy the header into it, then
- * read the file.
- */
- data = malloc(len+sizeof(exec));
- if (!data) {
- fprint(2, "strip: Malloc failure. %s too big to strip.\n", file);
+
+ mode = dir->mode;
+ free(dir);
+
+ if((data = malloc(length)) == nil){
+ error("%s: malloc failure", file);
close(fd);
- free(d);
return 1;
}
- /*
- * copy exec, text and data
- */
- exec.syms = 0;
- exec.spsz = 0;
- exec.pcsz = 0;
- memcpy(data, &exec, sizeof(exec));
- n = read(fd, data+sizeof(exec), len);
- if (n != len) {
- perror(file);
+ seek(fd, 0LL, 0);
+ if(read(fd, data, length) != length){
+ error("%s: read: %r", file);
close(fd);
- free(d);
+ free(data);
return 1;
}
close(fd);
- if(remove(file) < 0) {
- perror(file);
- free(data);
- free(d);
- return 1;
+
+ exec = data;
+ exec->syms = 0;
+ exec->spsz = 0;
+ exec->pcsz = 0;
+
+ if(out == nil){
+ if(remove(file) < 0) {
+ error("%s: remove: %r", file);
+ free(data);
+ return 1;
+ }
+ out = file;
}
- fd = create(file, OWRITE, d->mode);
- if (fd < 0) {
- perror(file);
+ if((fd = create(out, OWRITE, mode)) < 0){
+ error("%s: create: %r", out);
free(data);
- free(d);
return 1;
}
- n = write(fd, data, len+sizeof(exec));
- if (n != len+sizeof(exec)) {
- perror(file);
+ if(write(fd, data, length) != length){
+ error("%s: write: %r", out);
close(fd);
free(data);
- free(d);
return 1;
- }
+ }
close(fd);
free(data);
- free(d);
+
return 0;
+ }
+
+ void
+ main(int argc, char* argv[])
+ {
+ int r;
+ char *p;
+
+ p = nil;
+
+ ARGBEGIN{
+ default:
+ usage();
+ break;
+ case 'o':
+ p = ARGF();
+ if(p == nil)
+ usage();
+ break;
+ }ARGEND;
+
+ switch(argc){
+ case 0:
+ usage();
+ return;
+ case 1:
+ if(p != nil){
+ r = strip(*argv, p);
+ break;
+ }
+ /*FALLTHROUGH*/
+ default:
+ r = 0;
+ while(argc > 0){
+ r |= strip(*argv, nil);
+ argc--;
+ argv++;
+ }
+ break;
+ }
+
+ if(r)
+ exits("error");
+ exits(0);
}
More buffering changes.
[rsc] --rw-rw-r-- M 451989 glenda sys 23883 Nov 6 11:10 sys/src/cmd/cc/lex.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/cc/lex.c:188,193 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/cc/lex.c:188,194
}
Binit(&outbuf, c, OWRITE);
}
+ Binit(&diagbuf, 1, OWRITE);
newio();
/* Use an ANSI preprocessor */
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/cc/lex.c:232,238 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/cc/lex.c:233,239
if(debug['p'] > 1) {
for(c = 0; c < i; c++)
fprint(2, "%s ", av[c]);
- print("\n");
+ fprint(2, "\n");
}
myexec(av[0], av);
fprint(2, "can't exec C preprocessor %s: %r\n", CPP);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/cc/lex.c:1458,1464 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/cc/lex.c:1459,1465
{
void *p;
- while((ulong)hunk & MAXALIGN) {
+ while((uintptr)hunk & MAXALIGN) {
hunk++;
nhunk--;
}
[rsc] --rw-rw-r-- M 451989 glenda sys 9188 Nov 6 11:10 sys/src/cmd/cc/lexbody
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/cc/lexbody:45,51 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/cc/lexbody:45,51
{
void *p;
- while((ulong)hunk & MAXALIGN) {
+ while((uintptr)hunk & MAXALIGN) {
hunk++;
nhunk--;
}
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 5885 Nov 6 11:07 sys/src/cmd/ktrace.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:4,13 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:4,13
#include <mach.h>
#include <ctype.h>
- static int rtrace(ulong, ulong, ulong);
- static int ctrace(ulong, ulong, ulong);
- static int i386trace(ulong, ulong, ulong);
- static ulong getval(ulong);
+ static int rtrace(uvlong, uvlong, uvlong);
+ static int ctrace(uvlong, uvlong, uvlong);
+ static int i386trace(uvlong, uvlong, uvlong);
+ static uvlong getval(uvlong);
static void inithdr(int);
static void fatal(char*, ...);
static void readstack(void);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:25,31 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:25,31
}
static void
- printaddr(char *addr, ulong pc)
+ printaddr(char *addr, uvlong pc)
{
int i;
char *p;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:42,48 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:42,48
if(!isxdigit(addr[i]))
break;
if(i == 8){
- print("src(0x%.8lux); // 0x%s\n", pc, addr);
+ print("src(0x%.8llux); // 0x%s\n", pc, addr);
return;
}
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:49,66 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:49,66
if(p=strchr(addr, '+')){
*p++ = 0;
- print("src(0x%.8lux); // %s+0x%s\n", pc, addr, p);
+ print("src(0x%.8llux); // %s+0x%s\n", pc, addr, p);
}else
- print("src(0x%.8lux); // %s\n", pc, addr);
+ print("src(0x%.8llux); // %s\n", pc, addr);
}
- static void (*fmt)(char*, ulong) = printaddr;
+ static void (*fmt)(char*, uvlong) = printaddr;
void
main(int argc, char *argv[])
{
- int (*t)(ulong, ulong, ulong);
- ulong pc, sp, link;
+ int (*t)(uvlong, uvlong, uvlong);
+ uvlong pc, sp, link;
int fd;
ARGBEGIN{
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:76,82 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:76,82
switch(argc){
case 4:
t = rtrace;
- link = strtoul(argv[3], 0, 16);
+ link = strtoull(argv[3], 0, 16);
break;
case 3:
break;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:83,90 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:83,90
default:
usage();
}
- pc = strtoul(argv[1], 0, 16);
- sp = strtoul(argv[2], 0, 16);
+ pc = strtoull(argv[1], 0, 16);
+ sp = strtoull(argv[2], 0, 16);
if(!interactive)
readstack();
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:135,145 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:135,145
}
static int
- rtrace(ulong pc, ulong sp, ulong link)
+ rtrace(uvlong pc, uvlong sp, uvlong link)
{
Symbol s, f;
char buf[128];
- ulong oldpc;
+ uvlong oldpc;
int i;
i = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:175,187 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:175,187
}
static int
- ctrace(ulong pc, ulong sp, ulong link)
+ ctrace(uvlong pc, uvlong sp, uvlong link)
{
Symbol s;
char buf[128];
int found;
- ulong opc;
- long moved, j;
+ uvlong opc, moved;
+ long j;
USED(link);
j = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:188,195 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:188,195
opc = 0;
while(pc && opc != pc) {
moved = pc2sp(pc);
- if (moved == -1){
- print("pc2sp(%.8lux) = -1 %r\n", pc);
+ if (moved == ~0){
+ print("pc2sp(%.8llux) = -1 %r\n", pc);
break;
}
found = findsym(pc, CTEXT, &s);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:213,222 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:213,222
}
static int
- i386trace(ulong pc, ulong sp, ulong link)
+ i386trace(uvlong pc, uvlong sp, uvlong link)
{
int i;
- ulong osp;
+ uvlong osp;
Symbol s, f;
char buf[128];
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:228,256 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:228,261
symoff(buf, sizeof buf, pc, CANY);
fmt(buf, pc);
+ //XXX s.value &= ~(uintptr)0;
if(pc != s.value) { /* not at first instruction */
if(findlocal(&s, FRAMENAME, &f) == 0)
break;
sp += f.value-mach->szaddr;
}else if(strcmp(s.name, "forkret") == 0){
- print("//passing interrupt frame; last pc found at sp=%lux\n", osp);
+ //XXX
+ print("//passing interrupt frame; last pc found at sp=%llux\n", osp);
+
sp += 15 * mach->szaddr; /* pop interrupt frame */
}
pc = getval(sp);
+ //XXX
if(pc == 0 && strcmp(s.name, "forkret") == 0){
sp += 3 * mach->szaddr; /* pop iret eip, cs, eflags */
- print("//guessing call through invalid pointer, try again at sp=%lux\n", sp);
+ print("//guessing call through invalid pointer, try again at sp=%llux\n", sp);
s.name = "";
pc = getval(sp);
}
if(pc == 0) {
- print("//didn't find pc at sp=%lux, last pc found at sp=%lux\n", sp, osp);
+ print("//didn't find pc at sp=%llux, last pc found at sp=%llux\n", sp, osp);
break;
}
osp = sp;
sp += mach->szaddr;
+ //XXX
if(strcmp(s.name, "forkret") == 0)
sp += 2 * mach->szaddr; /* pop iret cs, eflags */
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:261,271 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:266,276
}
int naddr;
- ulong addr[1024];
- ulong val[1024];
+ uvlong addr[1024];
+ uvlong val[1024];
static void
- putval(ulong a, ulong v)
+ putval(uvlong a, uvlong v)
{
if(naddr < nelem(addr)){
addr[naddr] = a;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ktrace.c:289,313 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ktrace.c:294,318
for(i=0; i<nf; i++){
if(p=strchr(f[i], '=')){
*p++ = 0;
- putval(strtoul(f[i], 0, 16), strtoul(p, 0, 16));
+ putval(strtoull(f[i], 0, 16), strtoull(p, 0, 16));
}
}
}
}
- static ulong
- getval(ulong a)
+ static uvlong
+ getval(uvlong a)
{
char buf[256];
int i, n;
if(interactive){
- print("// data at 0x%8.8lux? ", a);
+ print("// data at 0x%8.8llux? ", a);
n = read(0, buf, sizeof(buf)-1);
if(n <= 0)
return 0;
buf[n] = '\0';
- return strtoul(buf, 0, 16);
+ return strtoull(buf, 0, 16);
}else{
for(i=0; i<naddr; i++)
if(addr[i] == a)
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 7295 Nov 6 11:11 sys/src/cmd/tbl/t6.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t6.c:9,16 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t6.c:9,16
void
maktab(void) /* define the tab stops of the table */
{
- int icol, ilin, tsep, k, ik, vforml, il, text;
- char *s;
+ int icol, ilin, tsep, k, ik, vforml, il, s, text;
+ char *ss;
for (icol = 0; icol < ncol; icol++) {
doubled[icol] = acase[icol] = 0;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t6.c:34,47 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t6.c:34,48
switch (ctype(vforml, icol)) {
case 'a':
acase[icol] = 1;
- s = table[ilin][icol].col;
- if ((int)s > 0 && (int)s < 128 && text) {
+ ss = table[ilin][icol].col;
+ s = (int)(uintptr)ss;
+ if (s > 0 && s < 128 && text) {
if (doubled[icol] == 0)
Bprint(&tabout, ".nr %d 0\n.nr %d 0\n",
S1, S2);
doubled[icol] = 1;
Bprint(&tabout, ".if \\n(%c->\\n(%d .nr %d \\n(%c-\n",
- (int)s, S2, S2, (int)s);
+ s, S2, S2, (int)s);
}
case 'n':
if (table[ilin][icol].rcol != 0) {
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t6.c:49,66 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t6.c:50,68
Bprint(&tabout, ".nr %d 0\n.nr %d 0\n",
S1, S2);
doubled[icol] = 1;
- if (real(s = table[ilin][icol].col) && !vspen(s)) {
- if (tx((int)s) != text)
+ if (real(ss = table[ilin][icol].col) && !vspen(ss)) {
+ s = (int)(uintptr)ss;
+ if (tx(s) != text)
continue;
Bprint(&tabout, ".nr %d ", TMP);
- wide(s, FN(vforml, icol), SZ(vforml, icol));
+ wide(ss, FN(vforml, icol), SZ(vforml, icol));
Bprint(&tabout, "\n");
Bprint(&tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n",
S1, TMP, S1, TMP);
}
- if (text == 0 && real(s = table[ilin][icol].rcol) && !vspen(s) && !barent(s)) {
+ if (text == 0 && real(ss = table[ilin][icol].rcol) && !vspen(ss) && !barent(ss)) {
Bprint(&tabout, ".nr %d \\w%c%s%c\n",
- TMP, F1, s, F1);
+ TMP, F1, ss, F1);
Bprint(&tabout, ".if \\n(%d<\\n(%d .nr %d \\n(%d\n", S2, TMP, S2,
TMP);
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t6.c:69,79 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t6.c:71,82
case 'r':
case 'c':
case 'l':
- if (real(s = table[ilin][icol].col) && !vspen(s)) {
- if (tx((int)s) != text)
+ if (real(ss = table[ilin][icol].col) && !vspen(ss)) {
+ s = (int)(uintptr)ss;
+ if (tx(s) != text)
continue;
Bprint(&tabout, ".nr %d ", TMP);
- wide(s, FN(vforml, icol), SZ(vforml, icol));
+ wide(ss, FN(vforml, icol), SZ(vforml, icol));
Bprint(&tabout, "\n");
Bprint(&tabout, ".if \\n(%2s<\\n(%d .nr %2s \\n(%d\n",
reg(icol, CRIGHT), TMP, reg(icol, CRIGHT), TMP);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t6.c:100,107 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t6.c:103,110
}
for (ilin = 0; ilin < nlin; ilin++)
if (k = lspan(ilin, icol)) {
- s = table[ilin][icol-k].col;
- if (!real(s) || barent(s) || vspen(s) )
+ ss = table[ilin][icol-k].col;
+ if (!real(ss) || barent(ss) || vspen(ss) )
continue;
Bprint(&tabout, ".nr %d ", TMP);
wide(table[ilin][icol-k].col, FN(ilin, icol - k), SZ(ilin, icol - k));
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t6.c:210,216 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t6.c:213,219
putsize("0");
Bprint(&tabout, "%c", F1);
} else
- Bprint(&tabout, "\\n(%c-", (int)s);
+ Bprint(&tabout, "\\n(%c-", (int)(uintptr)s);
}
[rsc] --rw-rw-r-- M 451989 glenda sys 9041 Nov 6 11:11 sys/src/cmd/tbl/t8.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t8.c:9,17 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t8.c:9,17
/* i is line number for deciding format */
/* nl is line number for finding data usually identical */
{
- int c, lf, ct, form, lwid, vspf, ip, cmidx, exvspen, vforml;
+ int c, s, lf, ct, form, lwid, vspf, ip, cmidx, exvspen, vforml;
int vct, chfont, uphalf;
- char *s, *size, *fn, *rct;
+ char *ss, *size, *fn, *rct;
cmidx = watchout = vspf = exvspen = 0;
if (i == 0)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t8.c:20,39 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t8.c:20,43
fullwide(0, dboxflg ? '=' : '-');
if (instead[nl] == 0 && fullbot[nl] == 0)
for (c = 0; c < ncol; c++) {
- s = table[nl][c].col;
- if (s == 0)
+ ss = table[nl][c].col;
+ if (ss == 0)
continue;
- if (vspen(s)) {
- for (ip = nl; ip < nlin; ip = next(ip))
- if (!vspen(s = table[ip][c].col))
+ if (vspen(ss)) {
+ for (ip = nl; ip < nlin; ip = next(ip)){
+ ss = table[ip][c].col;
+ if (!vspen(ss))
break;
- if ((int)s > 0 && (int)s < 128)
- Bprint(&tabout, ".ne \\n(%c|u+\\n(.Vu\n", (int)s);
+ }
+ s = (int)(uintptr)ss;
+ if (s > 0 && s < 128)
+ Bprint(&tabout, ".ne \\n(%c|u+\\n(.Vu\n", s);
continue;
}
- if (point(s))
+ if (point(ss))
continue;
- Bprint(&tabout, ".ne \\n(%c|u+\\n(.Vu\n", (int)s);
+ s = (int)(uintptr)ss;
+ Bprint(&tabout, ".ne \\n(%c|u+\\n(.Vu\n", s);
watchout = 1;
}
if (linestop[nl])
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t8.c:66,86 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t8.c:70,92
vspf = 0;
chfont = 0;
for (c = 0; c < ncol; c++) {
- s = table[nl][c].col;
- if (s == 0)
+ ss = table[nl][c].col;
+ if (ss == 0)
continue;
- chfont |= (int)(font[c][stynum[nl]]);
- if (point(s) )
+ if(font[c][stynum[nl]])
+ chfont = 1;
+ if (point(ss) )
continue;
+ s = (int)(uintptr)ss;
lf = prev(nl);
if (lf >= 0 && vspen(table[lf][c].col))
Bprint(&tabout,
".if (\\n(%c|+\\n(^%c-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(^%c-\\n(#--1v)\n",
- (int)s, 'a' + c, (int)s, 'a' + c);
+ s, 'a' + c, s, 'a' + c);
else
Bprint(&tabout,
".if (\\n(%c|+\\n(#^-1v)>\\n(#- .nr #- +(\\n(%c|+\\n(#^-\\n(#--1v)\n",
- (int)s, (int)s);
+ s, s);
}
if (allflg && once > 0 )
fullwide(i, '-');
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t8.c:117,123 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t8.c:123,129
rct = reg(c, CMID);
Bprint(&tabout, "\\h'|\\n(%2su'", rct);
}
- s = table[nl][c].col;
+ ss = table[nl][c].col;
fn = font[c][stynum[vforml]];
size = csize[c][stynum[vforml]];
if (*size == 0)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t8.c:150,161 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t8.c:156,167
Bprint(&tabout, "%c%c", F1, F2);
if (uphalf)
Bprint(&tabout, "\\u");
- puttext(s, fn, size);
+ puttext(ss, fn, size);
if (uphalf)
Bprint(&tabout, "\\d");
Bprint(&tabout, "%c", F1);
}
- s = table[nl][c].rcol;
+ ss = table[nl][c].rcol;
form = 1;
break;
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t8.c:179,190 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t8.c:185,196
}
if (realsplit ? rused[c] : used[c]) /*Zero field width*/ {
/* form: 1 left, 2 right, 3 center adjust */
- if (ifline(s)) {
- makeline(i, c, ifline(s));
+ if (ifline(ss)) {
+ makeline(i, c, ifline(ss));
continue;
}
- if (filler(s)) {
- Bprint(&tabout, "\\l'|\\n(%2su\\&%s'", reg(c, CRIGHT), s + 2);
+ if (filler(ss)) {
+ Bprint(&tabout, "\\l'|\\n(%2su\\&%s'", reg(c, CRIGHT), ss + 2);
continue;
}
ip = prev(nl);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t8.c:204,216 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t8.c:210,222
Bprint(&tabout, "%c", F1);
if (form != 1)
Bprint(&tabout, "%c", F2);
- if (vspen(s))
+ if (vspen(ss))
vspf = 1;
else
{
if (uphalf)
Bprint(&tabout, "\\u");
- puttext(s, fn, size);
+ puttext(ss, fn, size);
if (uphalf)
Bprint(&tabout, "\\d");
}
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/t8.c:289,295 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/t8.c:295,301
continue;
if (ss == 0)
continue;
- s = (int)ss;
+ s = (int)(uintptr)ss;
Bprint(&tabout, ".sp |\\n(##u-1v\n");
Bprint(&tabout, ".nr %d ", SIND);
ct = 0;
[rsc] --rw-rw-r-- M 451989 glenda sys 1274 Nov 6 11:11 sys/src/cmd/tbl/tc.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/tbl/tc.c:54,65 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/tbl/tc.c:54,63
return;
}
-
int
- point(char *s)
+ point(char *ss)
{
- int ss = (int)s;
- return(ss >= 128 || ss < 0);
- }
+ int s = (int)(uintptr)ss;
-
+ return(s >= 128 || s < 0);
+ }
Remove unused variable.
[rsc] --rw-rw-r-- M 451989 glenda sys 6420 Nov 6 11:11 sys/src/cmd/upas/smtp/mxdial.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/upas/smtp/mxdial.c:49,55 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/upas/smtp/mxdial.c:49,55
}
static int
- timeout(void *x, char *msg)
+ timeout(void*, char *msg)
{
if(strstr(msg, "alarm"))
return 1;
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 23778 Nov 6 11:07 sys/src/cmd/ar.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:22,28 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:22,28
char *name;
int type;
int len;
- long offset;
+ vlong offset;
struct Arsymref *next;
} Arsymref;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:40,46 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:40,46
int paged; /* set when some data paged to disk */
char *fname; /* paging file name */
int fd; /* paging file descriptor */
- long size;
+ vlong size;
Armember *head; /* head of member chain */
Armember *tail; /* tail of member chain */
Arsymref *sym; /* head of defined symbol chain */
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:118,132 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:118,132
int page(Arfile*);
void pmode(long);
void rl(int);
- void scanobj(Biobuf*, Arfile*, int);
+ void scanobj(Biobuf*, Arfile*, long);
void select(int*, long);
void setcom(void(*)(char*, int, char**));
- void skip(Biobuf*, long);
+ void skip(Biobuf*, vlong);
int symcomp(void*, void*);
void trim(char*, char*, int);
void usage(void);
void wrerr(void);
- void wrsym(Biobuf*, int, Arsymref*);
+ void wrsym(Biobuf*, long, Arsymref*);
void rcmd(char*, int, char**); /* command processing */
void dcmd(char*, int, char**);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:316,322 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:316,321
Armember *bp;
int fd, i;
-
if (!count)
return;
fd = openar(arname, ORDWR, 0);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:517,526 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:516,525
* extract the symbol references from an object file
*/
void
- scanobj(Biobuf *b, Arfile *ap, int size)
+ scanobj(Biobuf *b, Arfile *ap, long size)
{
int obj;
- long offset;
+ vlong offset;
Dir *d;
static int lastobj = -1;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:634,639 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:633,639
}
return fd;
}
+
/*
* create an archive and set its header
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:651,656 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:651,657
wrerr();
return fd;
}
+
/*
* error handling
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:681,686 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:682,688
fprint(2, "usage: ar [%s][%s] archive files ...\n", opt, man);
exits("error");
}
+
/*
* read the header for the next archive member
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:704,713 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:706,716
;
cp[1] = '\0';
file = name;
- bp->date = atol(bp->hdr.date);
- bp->size = atol(bp->hdr.size);
+ bp->date = strtol(bp->hdr.date, 0, 0);
+ bp->size = strtol(bp->hdr.size, 0, 0);
return bp;
}
+
/*
* Copy the file referenced by fd to the temp file
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:742,747 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:745,751
}
free(d);
}
+
/*
* Copy the archive member at the current offset into the temp file.
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:748,754 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:752,758
void
arcopy(Biobuf *b, Arfile *ap, Armember *bp)
{
- int n;
+ long n;
n = bp->size;
if (n & 01)
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:759,774 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:763,780
ap->size += n+SAR_HDR;
}
}
+
/*
* Skip an archive member
*/
void
- skip(Biobuf *bp, long len)
+ skip(Biobuf *bp, vlong len)
{
if (len & 01)
len++;
Bseek(bp, len, 1);
}
+
/*
* Stream the three temp files to an archive
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:850,860 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:856,867
Bputc(&b, 0);
Bterm(&b);
}
+
/*
* Write the defined symbols to the symdef file
*/
void
- wrsym(Biobuf *bp, int offset, Arsymref *as)
+ wrsym(Biobuf *bp, long offset, Arsymref *as)
{
int off;
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:870,875 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:877,883
as = as->next;
}
}
+
/*
* Check if the archive member matches an entry on the command line.
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:891,896 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:899,905
}
return 0;
}
+
/*
* compare the current member to the name of the pivot member
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:920,925 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:929,935
}
return 0;
}
+
/*
* output a message, if 'v' option was specified
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:930,935 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:940,946
if(vflag)
Bprint(&bout, "%c - %s\n", c, file);
}
+
/*
* isolate file name by stripping leading directories and trailing slashes
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:951,956 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:962,968
*p = 0; /* strip trailing slash */
}
}
+
/*
* utilities for printing long form of 't' command
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:973,979 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:985,991
char *cp;
pmode(strtoul(bp->hdr.mode, 0, 8));
- Bprint(&bout, "%3ld/%1ld", atol(bp->hdr.uid), atol(bp->hdr.gid));
+ Bprint(&bout, "%3ld/%1ld", strtol(bp->hdr.uid, 0, 0), strtol(bp->hdr.gid, 0, 0));
Bprint(&bout, "%7ld", bp->size);
cp = ctime(bp->date);
Bprint(&bout, " %-12.12s %-4.4s ", cp+4, cp+24);
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:1010,1015 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:1022,1028
ap++;
Bputc(&bout, *ap);
}
+
/*
* Temp file I/O subsystem. We attempt to cache all three temp files in
* core. When we run out of memory we spill to disk.
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:1049,1054 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:1062,1068
rderr();
}
}
+
/*
* insert a member buffer into the member chain
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:1062,1067 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:1076,1082
ap->tail->next = bp;
ap->tail = bp;
}
+
/*
* stream the members in a temp file to the file referenced by 'fd'.
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:1092,1097 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:1107,1113
wrerr();
}
}
+
/*
* write a member to 'fd'.
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:1109,1114 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:1125,1131
return 0;
return 1;
}
+
/*
* Spill a member to a disk copy of a temp file
*/
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:1136,1141 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:1153,1159
free(bp);
return 1;
}
+
/*
* try to reclaim space by paging. we try to spill the start, middle,
* and end files, in that order. there is no particular reason for the
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/ar.c:1166,1171 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/ar.c:1184,1190
}
free(ap);
}
+
/*
* allocate space for a control block or member buffer. if the malloc
* fails we try to reclaim space by spilling previously allocated
Add -p flag.
[rsc] --rw-rw-r-- M 451989 glenda sys 14841 Nov 6 11:29 sys/man/4/factotum
/n/sourcesdump/2005/1106/plan9/sys/man/4/factotum:4,10 -
/n/sourcesdump/2005/1107/plan9/sys/man/4/factotum:4,10
.SH SYNOPSIS
.B auth/factotum
[
- .B -DdkSun
+ .B -DdknpuS
] [
.B -a asaddr
] [
/n/sourcesdump/2005/1106/plan9/sys/man/4/factotum:211,216 -
/n/sourcesdump/2005/1107/plan9/sys/man/4/factotum:211,224
.BR \-S .
This option is typically used by
the kernel at boot time.
+ .TP
+ .B \-p
+ causes the agent not to mark itself `private'
+ via
+ .IR proc (3),
+ so that it can be debugged.
+ It is implied by
+ .BR \-d .
.PD
.PP
.I Fgui
-
[rsc] --rw-rw-r-- M 451989 sape sys 1547 Nov 6 11:09 sys/src/games/music/playlistfs/boilerplate.c
/n/sourcesdump/2005/1106/plan9/sys/src/games/music/playlistfs/boilerplate.c:41,73 -
/n/sourcesdump/2005/1107/plan9/sys/src/games/music/playlistfs/boilerplate.c:41,82
{
Worker *w;
- if(w = nbrecvp(q))
- send(w->eventc, m);
- return w != nil;
+ while(w = nbrecvp(q)){
+ /* Test for markerdom (see bcastmsg) */
+ if(w->eventc){
+ send(w->eventc, m);
+ return 1;
+ }
+ sendp(q, w); /* put back */
+ }
+ return 0;
}
void
bcastmsg(Channel *q, Wmsg *m)
{
- Worker *w;
- Channel *c;
+ Worker *w, marker;
void *a;
a = m->arg;
/*
- * Allocate a temp chan to prevent workers from getting the
- * broadcast and putting themselves back on the workers
+ * Use a marker to mark the end of the queue.
+ * This prevents workers from getting the
+ * broadcast and putting themselves back on the
* queue before the broadcast has finished
*/
- c = chancreate(sizeof(Worker*), 256);
- while(w = nbrecvp(q))
- sendp(c, w);
- while(w = nbrecvp(c)){
- if(a) m->arg = strdup(a);
- send(w->eventc, m);
+ marker.eventc = nil;
+ sendp(q, &marker);
+ while((w = recvp(q)) != &marker){
+ if(w->eventc == nil){
+ /* somebody else's marker, put it back */
+ sendp(q, w);
+ }else{
+ if(a) m->arg = strdup(a);
+ send(w->eventc, m);
+ }
}
free(a);
- chanfree(c);
m->arg = nil;
}
Add debugfactotum, *norealmode, *noe820scan
[rsc] --rw-rw-r-- M 451989 glenda sys 22077 Nov 6 11:29 sys/man/8/plan9.ini
/n/sourcesdump/2005/1106/plan9/sys/man/8/plan9.ini:515,520 -
/n/sourcesdump/2005/1107/plan9/sys/man/8/plan9.ini:515,526
See
.IR boot (8)
for more.
+ .SS \fLdebugfactotum=\fP
+ Causes
+ .IR boot (8)
+ to start factotum with the
+ .B -p
+ flag, so that it can be debugged.
.SS \fLventi=value\fP
When booting from a local fossil server backed by a local
or remote venti server,
/n/sourcesdump/2005/1106/plan9/sys/man/8/plan9.ini:551,556 -
/n/sourcesdump/2005/1107/plan9/sys/man/8/plan9.ini:557,569
consults only the first table,
.B old
only the second.
+ .SS \fL*norealmode=\fP
+ The kernel switches the processor to 16-bit real mode
+ to run BIOS interrupts, for example to find the memory map or to enable VESA.
+ This variable disables such switches.
+ .SS \fL*noe820scan=\fP
+ When available, the kernel uses the BIOS E820 memory map
+ to size memory. This variable disables the scan.
.SS \fL*maxmem=value\fP
This defines the maximum physical address that the system will scan when sizing memory.
By default the operating system will scan up to 768 megabytes, but setting
/n/sourcesdump/2005/1106/plan9/sys/man/8/plan9.ini:561,566 -
/n/sourcesdump/2005/1107/plan9/sys/man/8/plan9.ini:574,580
for the kernel to find it.
.B *maxmem
must be less than 1.75 gigabytes.
+ This variable is not consulted if using the E820 memory map.
.SS \fL*kernelpercent=value\fP
This defines what percentage of available memory is reserved for the kernel allocation pool.
The remainder is left for user processes. The default
64-bit fixes.
[rsc] --rw-rw-r-- M 451989 glenda sys 275 Nov 6 11:14 sys/src/cmd/9nfs/listalloc.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/9nfs/listalloc.c:6,18 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/9nfs/listalloc.c:6,17
void *
listalloc(long n, long size)
{
- ulong *p, *base;
+ char *p, *base;
- size += sizeof(ulong) - 1;
- size /= sizeof(ulong);
- p = base = malloc(n*size*sizeof(ulong));
+ size = (size+sizeof(ulong)-1)/sizeof(ulong);
+ p = base = malloc(n*size);
while(--n > 0){
- *p = (ulong)(p+size);
+ *(char**)p = p+size;
p += size;
}
*p = 0;
[rsc] --rw-rw-r-- M 451989 glenda sys 9526 Nov 6 11:14 sys/src/cmd/9nfs/nfs.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/9nfs/nfs.c:387,393 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/9nfs/nfs.c:387,393
dataptr[2+n] = 0;
}else{
PLONG(starttime);
- PLONG(xp->s);
+ PLONG((u32int)(uintptr)xp->s);
x = xp->qid.path;
PLONG(x);
x = xp->qid.path>>32;
[rsc] --rw-rw-r-- M 451989 glenda sys 1894 Nov 6 11:14 sys/src/cmd/9nfs/xfile.c
/n/sourcesdump/2005/1106/plan9/sys/src/cmd/9nfs/xfile.c:14,25 -
/n/sourcesdump/2005/1107/plan9/sys/src/cmd/9nfs/xfile.c:14,26
int k;
Xfile **hp, *f, *pf;
- k = ((ulong)qid->path ^ (((ulong)s)<<24))%FIDMOD;
+ k = ((ulong)qid->path ^ (((u32int)(uintptr)s)<<24))%FIDMOD;
hp = &xfiles[k];
lock(&xlocks[k]);
for(f=*hp, pf=0; f; pf=f, f=f->next)
- if(f->qid.path == qid->path && f->s == s)
+ if(f->qid.path == qid->path
+ && (u32int)(uintptr)f->s == (u32int)(uintptr)s)
break;
if(f && pf){
pf->next = f->next;
Describe /dev/vgabios.
[rsc] --rw-rw-r-- M 451989 glenda sys 4957 Nov 6 13:16 sys/man/3/vga
/n/sourcesdump/2005/1106/plan9/sys/man/3/vga:5,15 -
/n/sourcesdump/2005/1107/plan9/sys/man/3/vga:5,14
.nf
.B bind #v /dev
+ .B /dev/vgabios
.B /dev/vgactl
-
- .B /dev/vgaovlctl
-
.B /dev/vgaovl
+ .B /dev/vgaovlctl
.fi
.SH DESCRIPTION
The VGA device allows configuration of a graphics controller
/n/sourcesdump/2005/1106/plan9/sys/man/3/vga:23,28 -
/n/sourcesdump/2005/1107/plan9/sys/man/3/vga:22,31
it is used to implement configuration and setup of VGA controller cards.
This is usually performed by
.IR vga (8).
+ .PP
+ .B Vgabios
+ provides read-only access to the low 640kB of memory,
+ where the VGA and other BIOS ROMs are located.
.PP
Writing strings to
.B vgactl
[rsc] --rw-rw-r-- M 451989 glenda sys 3864 Nov 6 13:16 sys/man/8/vga
/n/sourcesdump/2005/1106/plan9/sys/man/8/vga:59,65 -
/n/sourcesdump/2005/1107/plan9/sys/man/8/vga:59,64
.TP
.B -c
disable the use of the hardware graphics cursor.
- (Since there is no software cursor, this disables the cursor entirely.)
.TP
.B -d
include the color palette in whatever actions are performed,
Rebuild.
[rsc] --rwxrwxr-x M 451989 glenda sys 216948 Nov 6 17:48 386/9load
[rsc] --rwxrwxr-x M 451989 glenda sys 311884 Nov 6 17:48 386/9loaddebug
[rsc] --rwxrwxr-x M 451989 glenda sys 135668 Nov 6 17:48 386/9loadlite
[rsc] --rwxrwxr-x M 451989 glenda sys 200131 Nov 6 17:48 386/9loadlitedebug
[rsc] --rwxrwxr-x M 451989 presotto sys 216948 Nov 6 17:48 386/9pxeload
[rsc] --rwxrwxr-x M 451989 glenda sys 101212 Nov 6 17:48 386/init
[rsc] --rwxrwxr-x M 451989 glenda sys 72524 Nov 6 17:49 386/ld.com
[rsc] --rwxrwxr-x M 451989 glenda sys 407 Nov 6 17:48 386/mbr
[rsc] --rwxrwxr-x M 451989 glenda sys 494 Nov 6 17:48 386/pbs
[rsc] --rwxrwxr-x M 451989 glenda sys 507 Nov 6 17:49 386/pbslba
Fix examples.
[rsc] --rw-rw-r-- M 451989 rsc sys 1251 Nov 6 17:57 sys/man/8/statusbar
/n/sourcesdump/2005/1106/plan9/sys/man/8/statusbar:46,60 -
/n/sourcesdump/2005/1107/plan9/sys/man/8/statusbar:46,63
.PD
.SH EXAMPLE
The
- .B -d
- options to
- .IR hget(1),
- .IR venti/fmtarenas ,
- and
- .I venti/fmtisect
- (see
- .IR ventiaux (8))
- cause them to print status lines suitable for
+ .B -v
+ option to
+ .IR hget(1)
+ .\" and the
+ .\" .B -d
+ .\" option to
+ .\" .IR venti/fmtarenas
+ .\" and
+ .\" .I venti/fmtisect
+ .\" (see
+ ,\" .IR ventiaux (8))
+ causes it to print status lines suitable for
input to
.IR statusbar .
.PP
/n/sourcesdump/2005/1106/plan9/sys/man/8/statusbar:61,67 -
/n/sourcesdump/2005/1107/plan9/sys/man/8/statusbar:64,70
Monitor a long download:
.IP
.EX
- hget -d -o bigfile http://server.com/bigfile |
+ hget -v -o bigfile http://server.com/bigfile |
aux/statusbar 'big file download'
.EE
.SH SOURCE
|