plan 9 kernel history: overview | file list | diff list

1991/0802/port/page.c (diff list | history)

1991/0801/sys/src/9/port/page.c:51,821991/0802/sys/src/9/port/page.c:51,101 (short | long | prev | next)
1991/0705    
} 
1991/0425    
 
1990/0227    
/* 
 * Called to allocate permanent data structures, before calling pageinit(). 
1991/0802    
 *  Called to allocate permanent data structures, before calling pageinit(). 
 *  We assume all of text+data+bss is in the first memory bank. 
1990/0227    
 */ 
void* 
ialloc(ulong n, int align) 
{ 
	ulong p; 
1991/0802    
	ulong *ap; 
1990/0227    
 
1990/1212    
	if(palloc.active && n!=0) 
1990/0227    
		print("ialloc bad\n"); 
	if(palloc.addr == 0) 
		palloc.addr = ((ulong)&end)&~KZERO; 
1991/0606    
	if(align) 
		palloc.addr = PGROUND(palloc.addr); 
 
1991/0801    
	if(palloc.addr+n > conf.base0 + conf.npage0*BY2PG) 
		palloc.addr = conf.base1; 
1991/0802    
	if(palloc.addr0 == 0){ 
		palloc.addr0 = ((ulong)&end)&~KZERO; 
		palloc.addr1 = conf.base1; 
	} 
1991/0801    
 
1990/0227    
	memset((void*)(palloc.addr|KZERO), 0, n); 
	p = palloc.addr; 
	palloc.addr += n; 
1991/0606    
	if(align) 
		palloc.addr = PGROUND(palloc.addr); 
1991/0802    
	/* 
	 *  try first bank 
	 */ 
	p = align ? PGROUND(palloc.addr0) : palloc.addr0; 
	if(p+n > conf.base0 + (conf.npage0<<PGSHIFT)){ 
		/* 
		 *  no room in first bank, try second bank 
		 */ 
		if(conf.npage1 <= 0) 
			panic("keep bill joy away 1"); 
		p = align ? PGROUND(palloc.addr1) : palloc.addr1; 
		ap = &palloc.addr1; 
	} else 
		ap = &palloc.addr0; 
1991/0606    
 
1990/1211    
	if(palloc.addr >= conf.maxialloc) 
		panic("keep bill joy away"); 
1991/0802    
	if(p >= conf.maxialloc) 
		panic("keep bill joy away 2"); 
1991/0705    
 
1991/0802    
	/* 
	 *  zero it 
	 */ 
	memset((void*)(p|KZERO), 0, n); 
 
	/* 
	 *  don't put anything else into a page aligned ialloc 
	 */ 
	*ap = align ? PGROUND(p+n) : (p+n); 
 
1990/0227    
	return (void*)(p|KZERO); 
} 
 
1991/0801/sys/src/9/port/page.c:83,1261991/0802/sys/src/9/port/page.c:102,156
1990/0227    
void 
pageinit(void) 
{ 
	ulong pa, nb, ppn; 
1991/0802    
	ulong np, addr, lim; 
1991/0705    
	ulong i, vmem, pmem; 
1990/0227    
	Page *p; 
 
	palloc.active = 1; 
1991/0802    
	/* 
	 *  calculate an upper bound to the number of pages structures 
	 *  we'll need (np). 
	 */ 
	np = (conf.npage0<<PGSHIFT) - (palloc.addr0 - conf.base0); 
	np += (conf.npage1<<PGSHIFT) - (palloc.addr1 - conf.base1); 
	np = np>>PGSHIFT; 
1990/0227    
 
	nb = (conf.npage<<PGSHIFT) - palloc.addr; 
	nb -= ((nb+(BY2PG-1))>>PGSHIFT)*sizeof(Page);	/* safe overestimate */ 
	nb &= ~(BY2PG-1); 
1991/0705    
	pa = (conf.npage<<PGSHIFT) - nb; /* physical addr of first free page */ 
	ppn = pa >> PGSHIFT;		 /* physical page number of first free page */ 
1990/0227    
	palloc.page = (Page *)((palloc.addr - ppn*sizeof(Page))|KZERO); 
	/* 
	 * Now palloc.page[ppn] describes first free page 
1991/0802    
	 *  allocate Page structs (no more ialloc's allowed after this). 
	 *  np is useless after this ialloc since we've just eaten up 
	 *  some pages for the Page structures. 
1990/0227    
	 */ 
	palloc.minppn = ppn; 
	palloc.addr = ppn<<PGSHIFT; 
1991/0802    
	palloc.head = ialloc(np*sizeof(Page), 0); 
	palloc.active = 1; 
1990/0227    
 
	palloc.head = &palloc.page[ppn]; 
	palloc.tail = &palloc.page[conf.npage-1]; 
	memset(palloc.head, 0, (conf.npage-ppn)*sizeof(Page)); 
1991/0705    
                 
	pmem = ((conf.npage-ppn)*BY2PG)/1024; 
	vmem = pmem + ((conf.nswap)*BY2PG)/1024; 
	palloc.user = conf.npage-ppn; 
	print("%lud free pages, %dK bytes, swap %dK bytes\n", palloc.user, pmem, vmem); 
                 
1990/0227    
	for(p=palloc.head; p<=palloc.tail; p++,ppn++){ 
1991/0802    
	/* 
 	 *  for each page in each bank, point a page structure to 
	 *  the page and chain it into the free list 
	 */ 
	p = palloc.head; 
	addr = palloc.addr0 = PGROUND(palloc.addr0); 
	lim = conf.base0 + (conf.npage0<<PGSHIFT); 
	for(; addr < lim; addr += BY2PG){ 
1990/0227    
		p->next = p+1; 
		p->prev = p-1; 
1990/1211    
		if(ppn < conf.npage0) 
			p->pa = conf.base0+(ppn<<PGSHIFT); 
		else 
			p->pa = conf.base1+((ppn-conf.npage0)<<PGSHIFT); 
1991/0705    
		palloc.freecount++; 
1991/0802    
		p->pa = addr; 
		p++; 
1990/0227    
	} 
1991/0802    
	addr = palloc.addr1 = PGROUND(palloc.addr1); 
	lim = conf.base1 + (conf.npage1<<PGSHIFT); 
	for(; addr < lim; addr += BY2PG){ 
		p->next = p+1; 
		p->prev = p-1; 
		p->pa = addr; 
		p++; 
	} 
	palloc.tail = p - 1; 
1990/0227    
	palloc.head->prev = 0; 
	palloc.tail->next = 0; 
1991/0802    
 
	palloc.user = palloc.freecount = p - palloc.head; 
	pmem = palloc.user*BY2PG/1024; 
	vmem = pmem + ((conf.nswap)*BY2PG)/1024; 
	print("%lud free pages, %dK bytes, swap %dK bytes\n", palloc.user, pmem, vmem); 
1990/0227    
} 
 
Page* 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)