uint32_t -> uint &c
This commit is contained in:
		
							parent
							
								
									bd228a8156
								
							
						
					
					
						commit
						2927081628
					
				
					 17 changed files with 252 additions and 271 deletions
				
			
		
							
								
								
									
										16
									
								
								bootmain.c
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								bootmain.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -33,8 +33,8 @@
 | 
			
		|||
#define SECTSIZE	512
 | 
			
		||||
#define ELFHDR		((struct elfhdr *) 0x10000) // scratch space
 | 
			
		||||
 | 
			
		||||
void readsect(void*, uint32_t);
 | 
			
		||||
void readseg(uint32_t, uint32_t, uint32_t);
 | 
			
		||||
void readsect(void*, uint);
 | 
			
		||||
void readseg(uint, uint, uint);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cmain(void)
 | 
			
		||||
| 
						 | 
				
			
			@ -42,14 +42,14 @@ cmain(void)
 | 
			
		|||
	struct proghdr *ph, *eph;
 | 
			
		||||
 | 
			
		||||
	// read 1st page off disk
 | 
			
		||||
	readseg((uint32_t) ELFHDR, SECTSIZE*8, 0);
 | 
			
		||||
	readseg((uint) ELFHDR, SECTSIZE*8, 0);
 | 
			
		||||
 | 
			
		||||
	// is this a valid ELF?
 | 
			
		||||
	if (ELFHDR->magic != ELF_MAGIC)
 | 
			
		||||
		goto bad;
 | 
			
		||||
 | 
			
		||||
	// load each program segment (ignores ph flags)
 | 
			
		||||
	ph = (struct proghdr *) ((uint8_t *) ELFHDR + ELFHDR->phoff);
 | 
			
		||||
	ph = (struct proghdr *) ((uchar *) ELFHDR + ELFHDR->phoff);
 | 
			
		||||
	eph = ph + ELFHDR->phnum;
 | 
			
		||||
	for (; ph < eph; ph++)
 | 
			
		||||
		readseg(ph->va, ph->memsz, ph->offset);
 | 
			
		||||
| 
						 | 
				
			
			@ -68,9 +68,9 @@ bad:
 | 
			
		|||
// Read 'count' bytes at 'offset' from kernel into virtual address 'va'.
 | 
			
		||||
// Might copy more than asked
 | 
			
		||||
void
 | 
			
		||||
readseg(uint32_t va, uint32_t count, uint32_t offset)
 | 
			
		||||
readseg(uint va, uint count, uint offset)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t end_va;
 | 
			
		||||
	uint end_va;
 | 
			
		||||
 | 
			
		||||
	va &= 0xFFFFFF;
 | 
			
		||||
	end_va = va + count;
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +85,7 @@ readseg(uint32_t va, uint32_t count, uint32_t offset)
 | 
			
		|||
	// We'd write more to memory than asked, but it doesn't matter --
 | 
			
		||||
	// we load in increasing order.
 | 
			
		||||
	while (va < end_va) {
 | 
			
		||||
		readsect((uint8_t*) va, offset);
 | 
			
		||||
		readsect((uchar*) va, offset);
 | 
			
		||||
		va += SECTSIZE;
 | 
			
		||||
		offset++;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ waitdisk(void)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
readsect(void *dst, uint32_t offset)
 | 
			
		||||
readsect(void *dst, uint offset)
 | 
			
		||||
{
 | 
			
		||||
	// wait for disk to be ready
 | 
			
		||||
	waitdisk();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ static void
 | 
			
		|||
cons_putc(int c)
 | 
			
		||||
{
 | 
			
		||||
  int crtport = 0x3d4; // io port of CGA
 | 
			
		||||
  uint16_t *crt = (uint16_t *) 0xB8000; // base of CGA memory
 | 
			
		||||
  ushort *crt = (ushort *) 0xB8000; // base of CGA memory
 | 
			
		||||
  int ind;
 | 
			
		||||
 | 
			
		||||
  if(panicked){
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								defs.h
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								defs.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -40,8 +40,8 @@ int strncmp(const char *p, const char *q, uint n);
 | 
			
		|||
void syscall(void);
 | 
			
		||||
 | 
			
		||||
// picirq.c
 | 
			
		||||
extern uint16_t irq_mask_8259A;
 | 
			
		||||
void irq_setmask_8259A(uint16_t mask);
 | 
			
		||||
extern ushort irq_mask_8259A;
 | 
			
		||||
void irq_setmask_8259A(ushort mask);
 | 
			
		||||
void pic_init(void);
 | 
			
		||||
 | 
			
		||||
// mp.c
 | 
			
		||||
| 
						 | 
				
			
			@ -50,9 +50,9 @@ void mp_startthem(void);
 | 
			
		|||
int mp_bcpu(void);
 | 
			
		||||
 | 
			
		||||
// lapic
 | 
			
		||||
extern uint32_t *lapicaddr;
 | 
			
		||||
extern uint *lapicaddr;
 | 
			
		||||
void lapic_init(int);
 | 
			
		||||
void lapic_startap(uint8_t, int);
 | 
			
		||||
void lapic_startap(uchar, int);
 | 
			
		||||
void lapic_timerinit(void);
 | 
			
		||||
void lapic_timerintr(void);
 | 
			
		||||
void lapic_enableintr(void);
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +66,7 @@ void release(struct spinlock*);
 | 
			
		|||
int holding(struct spinlock*);
 | 
			
		||||
 | 
			
		||||
// main.c
 | 
			
		||||
void load_icode(struct proc *p, uint8_t *binary, uint size);
 | 
			
		||||
void load_icode(struct proc *p, uchar *binary, uint size);
 | 
			
		||||
 | 
			
		||||
// pipe.c
 | 
			
		||||
struct pipe;
 | 
			
		||||
| 
						 | 
				
			
			@ -87,6 +87,6 @@ void fd_incref(struct fd *fd);
 | 
			
		|||
// ide.c
 | 
			
		||||
void ide_init(void);
 | 
			
		||||
void ide_intr(void);
 | 
			
		||||
void* ide_start_read(uint32_t secno, void *dst, uint nsecs);
 | 
			
		||||
void* ide_start_read(uint secno, void *dst, uint nsecs);
 | 
			
		||||
int ide_finish_read(void *);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										46
									
								
								elf.h
									
										
									
									
									
								
							
							
						
						
									
										46
									
								
								elf.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,32 +1,32 @@
 | 
			
		|||
#define ELF_MAGIC 0x464C457FU	/* "\x7FELF" in little endian */
 | 
			
		||||
 | 
			
		||||
struct elfhdr {
 | 
			
		||||
	uint32_t magic;	// must equal ELF_MAGIC
 | 
			
		||||
	uint8_t elf[12];
 | 
			
		||||
	uint16_t type;
 | 
			
		||||
	uint16_t machine;
 | 
			
		||||
	uint32_t version;
 | 
			
		||||
	uint32_t entry;
 | 
			
		||||
	uint32_t phoff;
 | 
			
		||||
	uint32_t shoff;
 | 
			
		||||
	uint32_t flags;
 | 
			
		||||
	uint16_t ehsize;
 | 
			
		||||
	uint16_t phentsize;
 | 
			
		||||
	uint16_t phnum;
 | 
			
		||||
	uint16_t shentsize;
 | 
			
		||||
	uint16_t shnum;
 | 
			
		||||
	uint16_t shstrndx;
 | 
			
		||||
	uint magic;	// must equal ELF_MAGIC
 | 
			
		||||
	uchar elf[12];
 | 
			
		||||
	ushort type;
 | 
			
		||||
	ushort machine;
 | 
			
		||||
	uint version;
 | 
			
		||||
	uint entry;
 | 
			
		||||
	uint phoff;
 | 
			
		||||
	uint shoff;
 | 
			
		||||
	uint flags;
 | 
			
		||||
	ushort ehsize;
 | 
			
		||||
	ushort phentsize;
 | 
			
		||||
	ushort phnum;
 | 
			
		||||
	ushort shentsize;
 | 
			
		||||
	ushort shnum;
 | 
			
		||||
	ushort shstrndx;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct proghdr {
 | 
			
		||||
	uint32_t type;
 | 
			
		||||
	uint32_t offset;
 | 
			
		||||
	uint32_t va;
 | 
			
		||||
	uint32_t pa;
 | 
			
		||||
	uint32_t filesz;
 | 
			
		||||
	uint32_t memsz;
 | 
			
		||||
	uint32_t flags;
 | 
			
		||||
	uint32_t align;
 | 
			
		||||
	uint type;
 | 
			
		||||
	uint offset;
 | 
			
		||||
	uint va;
 | 
			
		||||
	uint pa;
 | 
			
		||||
	uint filesz;
 | 
			
		||||
	uint memsz;
 | 
			
		||||
	uint flags;
 | 
			
		||||
	uint align;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Values for Proghdr type
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										20
									
								
								ide.c
									
										
									
									
									
								
							
							
						
						
									
										20
									
								
								ide.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -18,7 +18,8 @@
 | 
			
		|||
#define IDE_ERR		0x01
 | 
			
		||||
 | 
			
		||||
struct ide_request {
 | 
			
		||||
  uint32_t secno;
 | 
			
		||||
  int diskno;
 | 
			
		||||
  uint secno;
 | 
			
		||||
  void *dst;
 | 
			
		||||
  uint nsecs;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +27,6 @@ struct ide_request request[NREQUEST];
 | 
			
		|||
int head, tail;
 | 
			
		||||
struct spinlock ide_lock;
 | 
			
		||||
 | 
			
		||||
static int diskno = 0;
 | 
			
		||||
int disk_channel;
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
| 
						 | 
				
			
			@ -79,14 +79,6 @@ ide_probe_disk1(void)
 | 
			
		|||
  return (x < 1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ide_set_disk(int d)
 | 
			
		||||
{
 | 
			
		||||
  if (d != 0 && d != 1)
 | 
			
		||||
    panic("bad disk number");
 | 
			
		||||
  diskno = d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ide_start_request (void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -100,13 +92,13 @@ ide_start_request (void)
 | 
			
		|||
    outb(0x1F3, r->secno & 0xFF);
 | 
			
		||||
    outb(0x1F4, (r->secno >> 8) & 0xFF);
 | 
			
		||||
    outb(0x1F5, (r->secno >> 16) & 0xFF);
 | 
			
		||||
    outb(0x1F6, 0xE0 | ((diskno&1)<<4) | ((r->secno>>24)&0x0F));
 | 
			
		||||
    outb(0x1F6, 0xE0 | ((r->diskno&1)<<4) | ((r->secno>>24)&0x0F));
 | 
			
		||||
    outb(0x1F7, 0x20);	// CMD 0x20 means read sector
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *
 | 
			
		||||
ide_start_read(uint32_t secno, void *dst, uint nsecs)
 | 
			
		||||
ide_start_read(uint secno, void *dst, uint nsecs)
 | 
			
		||||
{
 | 
			
		||||
  struct ide_request *r;
 | 
			
		||||
  if(!holding(&ide_lock))
 | 
			
		||||
| 
						 | 
				
			
			@ -122,6 +114,7 @@ ide_start_read(uint32_t secno, void *dst, uint nsecs)
 | 
			
		|||
  r->secno = secno;
 | 
			
		||||
  r->dst = dst;
 | 
			
		||||
  r->nsecs = nsecs;
 | 
			
		||||
  r->diskno = 0;
 | 
			
		||||
 | 
			
		||||
  ide_start_request();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -155,9 +148,10 @@ ide_finish_read(void *c)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
ide_write(uint32_t secno, const void *src, uint nsecs)
 | 
			
		||||
ide_write(uint secno, const void *src, uint nsecs)
 | 
			
		||||
{
 | 
			
		||||
  int r;
 | 
			
		||||
  int diskno = 0;
 | 
			
		||||
	
 | 
			
		||||
  if(nsecs > 256)
 | 
			
		||||
    panic("ide_write");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								lapic.c
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								lapic.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -92,7 +92,7 @@ enum {					/* LAPIC_TDCR */
 | 
			
		|||
  LAPIC_X1 = 0x0000000B,	/* divide by 1 */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
uint32_t *lapicaddr;
 | 
			
		||||
uint *lapicaddr;
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
lapic_read(int r)
 | 
			
		||||
| 
						 | 
				
			
			@ -127,7 +127,7 @@ lapic_timerintr(void)
 | 
			
		|||
void
 | 
			
		||||
lapic_init(int c)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t r, lvt;
 | 
			
		||||
  uint r, lvt;
 | 
			
		||||
 | 
			
		||||
  cprintf("lapic_init %d\n", c);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +180,7 @@ cpu(void)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
lapic_startap(uint8_t apicid, int v)
 | 
			
		||||
lapic_startap(uchar apicid, int v)
 | 
			
		||||
{
 | 
			
		||||
  int crhi, i;
 | 
			
		||||
  volatile int j = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										14
									
								
								main.c
									
										
									
									
									
								
							
							
						
						
									
										14
									
								
								main.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -11,9 +11,9 @@
 | 
			
		|||
#include "spinlock.h"
 | 
			
		||||
 | 
			
		||||
extern char edata[], end[];
 | 
			
		||||
extern uint8_t _binary_user1_start[], _binary_user1_size[];
 | 
			
		||||
extern uint8_t _binary_usertests_start[], _binary_usertests_size[];
 | 
			
		||||
extern uint8_t _binary_userfs_start[], _binary_userfs_size[];
 | 
			
		||||
extern uchar _binary_user1_start[], _binary_user1_size[];
 | 
			
		||||
extern uchar _binary_usertests_start[], _binary_usertests_size[];
 | 
			
		||||
extern uchar _binary_userfs_start[], _binary_userfs_size[];
 | 
			
		||||
 | 
			
		||||
extern int use_console_lock;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -73,7 +73,7 @@ main0(void)
 | 
			
		|||
  lapic_enableintr();
 | 
			
		||||
 | 
			
		||||
  // init disk device
 | 
			
		||||
  //ide_init(); 
 | 
			
		||||
  ide_init(); 
 | 
			
		||||
 | 
			
		||||
  // Enable interrupts on this processor.
 | 
			
		||||
  cpus[cpu()].nlock--;
 | 
			
		||||
| 
						 | 
				
			
			@ -81,8 +81,8 @@ main0(void)
 | 
			
		|||
 | 
			
		||||
  p = copyproc(&proc[0]);
 | 
			
		||||
  
 | 
			
		||||
  load_icode(p, _binary_usertests_start, (uint) _binary_usertests_size);
 | 
			
		||||
  //load_icode(p, _binary_userfs_start, (uint) _binary_userfs_size);
 | 
			
		||||
  //load_icode(p, _binary_usertests_start, (uint) _binary_usertests_size);
 | 
			
		||||
  load_icode(p, _binary_userfs_start, (uint) _binary_userfs_size);
 | 
			
		||||
  p->state = RUNNABLE;
 | 
			
		||||
  cprintf("loaded userfs\n");
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ mpmain(void)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
load_icode(struct proc *p, uint8_t *binary, uint size)
 | 
			
		||||
load_icode(struct proc *p, uchar *binary, uint size)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  struct elfhdr *elf;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										82
									
								
								mmu.h
									
										
									
									
									
								
							
							
						
						
									
										82
									
								
								mmu.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -124,43 +124,43 @@ struct segdesc {
 | 
			
		|||
 | 
			
		||||
// Task state segment format (as described by the Pentium architecture book)
 | 
			
		||||
struct taskstate {
 | 
			
		||||
	uint32_t link;	// Old ts selector
 | 
			
		||||
	uintptr_t esp0;	// Stack pointers and segment selectors
 | 
			
		||||
	uint16_t ss0;	//   after an increase in privilege level
 | 
			
		||||
	uint16_t padding1;
 | 
			
		||||
	uintptr_t esp1;
 | 
			
		||||
	uint16_t ss1;
 | 
			
		||||
	uint16_t padding2;
 | 
			
		||||
	uintptr_t esp2;
 | 
			
		||||
	uint16_t ss2;
 | 
			
		||||
	uint16_t padding3;
 | 
			
		||||
	physaddr_t cr3;	// Page directory base
 | 
			
		||||
	uintptr_t eip;	// Saved state from last task switch
 | 
			
		||||
	uint32_t eflags;
 | 
			
		||||
	uint32_t eax;	// More saved state (registers)
 | 
			
		||||
	uint32_t ecx;
 | 
			
		||||
	uint32_t edx;
 | 
			
		||||
	uint32_t ebx;
 | 
			
		||||
	uintptr_t esp;
 | 
			
		||||
	uintptr_t ebp;
 | 
			
		||||
	uint32_t esi;
 | 
			
		||||
	uint32_t edi;
 | 
			
		||||
	uint16_t es;		// Even more saved state (segment selectors)
 | 
			
		||||
	uint16_t padding4;
 | 
			
		||||
	uint16_t cs;
 | 
			
		||||
	uint16_t padding5;
 | 
			
		||||
	uint16_t ss;
 | 
			
		||||
	uint16_t padding6;
 | 
			
		||||
	uint16_t ds;
 | 
			
		||||
	uint16_t padding7;
 | 
			
		||||
	uint16_t fs;
 | 
			
		||||
	uint16_t padding8;
 | 
			
		||||
	uint16_t gs;
 | 
			
		||||
	uint16_t padding9;
 | 
			
		||||
	uint16_t ldt;
 | 
			
		||||
	uint16_t padding10;
 | 
			
		||||
	uint16_t t;		// Trap on task switch
 | 
			
		||||
	uint16_t iomb;	// I/O map base address
 | 
			
		||||
	uint link;	// Old ts selector
 | 
			
		||||
	uint * esp0;	// Stack pointers and segment selectors
 | 
			
		||||
	ushort ss0;	//   after an increase in privilege level
 | 
			
		||||
	ushort padding1;
 | 
			
		||||
	uint * esp1;
 | 
			
		||||
	ushort ss1;
 | 
			
		||||
	ushort padding2;
 | 
			
		||||
	uint * esp2;
 | 
			
		||||
	ushort ss2;
 | 
			
		||||
	ushort padding3;
 | 
			
		||||
	void * cr3;	// Page directory base
 | 
			
		||||
	uint * eip;	// Saved state from last task switch
 | 
			
		||||
	uint eflags;
 | 
			
		||||
	uint eax;	// More saved state (registers)
 | 
			
		||||
	uint ecx;
 | 
			
		||||
	uint edx;
 | 
			
		||||
	uint ebx;
 | 
			
		||||
	uint * esp;
 | 
			
		||||
	uint * ebp;
 | 
			
		||||
	uint esi;
 | 
			
		||||
	uint edi;
 | 
			
		||||
	ushort es;		// Even more saved state (segment selectors)
 | 
			
		||||
	ushort padding4;
 | 
			
		||||
	ushort cs;
 | 
			
		||||
	ushort padding5;
 | 
			
		||||
	ushort ss;
 | 
			
		||||
	ushort padding6;
 | 
			
		||||
	ushort ds;
 | 
			
		||||
	ushort padding7;
 | 
			
		||||
	ushort fs;
 | 
			
		||||
	ushort padding8;
 | 
			
		||||
	ushort gs;
 | 
			
		||||
	ushort padding9;
 | 
			
		||||
	ushort ldt;
 | 
			
		||||
	ushort padding10;
 | 
			
		||||
	ushort t;		// Trap on task switch
 | 
			
		||||
	ushort iomb;	// I/O map base address
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Gate descriptors for interrupts and traps
 | 
			
		||||
| 
						 | 
				
			
			@ -185,7 +185,7 @@ struct gatedesc {
 | 
			
		|||
//	  this interrupt/trap gate explicitly using an int instruction.
 | 
			
		||||
#define SETGATE(gate, istrap, sel, off, d)			\
 | 
			
		||||
{								\
 | 
			
		||||
	(gate).off_15_0 = (uint32_t) (off) & 0xffff;		\
 | 
			
		||||
	(gate).off_15_0 = (uint) (off) & 0xffff;		\
 | 
			
		||||
	(gate).ss = (sel);					\
 | 
			
		||||
	(gate).args = 0;					\
 | 
			
		||||
	(gate).rsv1 = 0;					\
 | 
			
		||||
| 
						 | 
				
			
			@ -193,13 +193,13 @@ struct gatedesc {
 | 
			
		|||
	(gate).s = 0;					\
 | 
			
		||||
	(gate).dpl = (d);					\
 | 
			
		||||
	(gate).p = 1;					\
 | 
			
		||||
	(gate).off_31_16 = (uint32_t) (off) >> 16;		\
 | 
			
		||||
	(gate).off_31_16 = (uint) (off) >> 16;		\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Set up a call gate descriptor.
 | 
			
		||||
#define SETCALLGATE(gate, ss, off, d)           	        \
 | 
			
		||||
{								\
 | 
			
		||||
	(gate).off_15_0 = (uint32_t) (off) & 0xffff;		\
 | 
			
		||||
	(gate).off_15_0 = (uint) (off) & 0xffff;		\
 | 
			
		||||
	(gate).ss = (ss);					\
 | 
			
		||||
	(gate).args = 0;					\
 | 
			
		||||
	(gate).rsv1 = 0;					\
 | 
			
		||||
| 
						 | 
				
			
			@ -207,7 +207,7 @@ struct gatedesc {
 | 
			
		|||
	(gate).s = 0;					\
 | 
			
		||||
	(gate).dpl = (d);					\
 | 
			
		||||
	(gate).p = 1;					\
 | 
			
		||||
	(gate).off_31_16 = (uint32_t) (off) >> 16;		\
 | 
			
		||||
	(gate).off_31_16 = (uint) (off) >> 16;		\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* !__ASSEMBLER__ */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										38
									
								
								mp.c
									
										
									
									
									
								
							
							
						
						
									
										38
									
								
								mp.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -37,12 +37,12 @@ int ncpu;
 | 
			
		|||
static struct cpu *bcpu;
 | 
			
		||||
 | 
			
		||||
static struct mp*
 | 
			
		||||
mp_scan(uint8_t *addr, int len)
 | 
			
		||||
mp_scan(uchar *addr, int len)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t *e, *p, sum;
 | 
			
		||||
  uchar *e, *p, sum;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  cprintf("scanning: 0x%x\n", (uint32_t)addr);
 | 
			
		||||
  cprintf("scanning: 0x%x\n", (uint)addr);
 | 
			
		||||
  e = addr+len;
 | 
			
		||||
  for(p = addr; p < e; p += sizeof(struct mp)){
 | 
			
		||||
    if(memcmp(p, "_MP_", 4))
 | 
			
		||||
| 
						 | 
				
			
			@ -59,8 +59,8 @@ mp_scan(uint8_t *addr, int len)
 | 
			
		|||
static struct mp*
 | 
			
		||||
mp_search(void)
 | 
			
		||||
{
 | 
			
		||||
  uint8_t *bda;
 | 
			
		||||
  uint32_t p;
 | 
			
		||||
  uchar *bda;
 | 
			
		||||
  uint p;
 | 
			
		||||
  struct mp *mp;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
| 
						 | 
				
			
			@ -70,25 +70,25 @@ mp_search(void)
 | 
			
		|||
   * 2) in the last KB of system base memory;
 | 
			
		||||
   * 3) in the BIOS ROM between 0xE0000 and 0xFFFFF.
 | 
			
		||||
   */
 | 
			
		||||
  bda = (uint8_t*) 0x400;
 | 
			
		||||
  bda = (uchar*) 0x400;
 | 
			
		||||
  if((p = (bda[0x0F]<<8)|bda[0x0E])){
 | 
			
		||||
    if((mp = mp_scan((uint8_t*) p, 1024)))
 | 
			
		||||
    if((mp = mp_scan((uchar*) p, 1024)))
 | 
			
		||||
      return mp;
 | 
			
		||||
  }
 | 
			
		||||
  else{
 | 
			
		||||
    p = ((bda[0x14]<<8)|bda[0x13])*1024;
 | 
			
		||||
    if((mp = mp_scan((uint8_t*)p-1024, 1024)))
 | 
			
		||||
    if((mp = mp_scan((uchar*)p-1024, 1024)))
 | 
			
		||||
      return mp;
 | 
			
		||||
  }
 | 
			
		||||
  return mp_scan((uint8_t*)0xF0000, 0x10000);
 | 
			
		||||
  return mp_scan((uchar*)0xF0000, 0x10000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int 
 | 
			
		||||
mp_detect(void)
 | 
			
		||||
{
 | 
			
		||||
  struct mpctb *pcmp;
 | 
			
		||||
  uint8_t *p, sum;
 | 
			
		||||
  uint32_t length;
 | 
			
		||||
  uchar *p, sum;
 | 
			
		||||
  uint length;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Search for an MP configuration table. For now,
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +106,7 @@ mp_detect(void)
 | 
			
		|||
 | 
			
		||||
  length = pcmp->length;
 | 
			
		||||
  sum = 0;
 | 
			
		||||
  for(p = (uint8_t*)pcmp; length; length--)
 | 
			
		||||
  for(p = (uchar*)pcmp; length; length--)
 | 
			
		||||
    sum += *p++;
 | 
			
		||||
 | 
			
		||||
  if(sum || (pcmp->version != 1 && pcmp->version != 4))
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ void
 | 
			
		|||
mp_init(void)
 | 
			
		||||
{ 
 | 
			
		||||
  int r;
 | 
			
		||||
  uint8_t *p, *e;
 | 
			
		||||
  uchar *p, *e;
 | 
			
		||||
  struct mpctb *mpctb;
 | 
			
		||||
  struct mppe *proc;
 | 
			
		||||
  struct mpbe *bus;
 | 
			
		||||
| 
						 | 
				
			
			@ -137,10 +137,10 @@ mp_init(void)
 | 
			
		|||
   * is guaranteed to be in order such that only one pass is necessary.
 | 
			
		||||
   */
 | 
			
		||||
  mpctb = (struct mpctb *) mp->physaddr;
 | 
			
		||||
  lapicaddr = (uint32_t *) mpctb->lapicaddr;
 | 
			
		||||
  lapicaddr = (uint *) mpctb->lapicaddr;
 | 
			
		||||
  cprintf("apicaddr: %x\n", lapicaddr);
 | 
			
		||||
  p = ((uint8_t*)mpctb)+sizeof(struct mpctb);
 | 
			
		||||
  e = ((uint8_t*)mpctb)+mpctb->length;
 | 
			
		||||
  p = ((uchar*)mpctb)+sizeof(struct mpctb);
 | 
			
		||||
  e = ((uchar*)mpctb)+mpctb->length;
 | 
			
		||||
 | 
			
		||||
  while(p < e) {
 | 
			
		||||
    switch(*p){
 | 
			
		||||
| 
						 | 
				
			
			@ -195,18 +195,18 @@ extern void mpmain(void);
 | 
			
		|||
void
 | 
			
		||||
mp_startthem(void)
 | 
			
		||||
{
 | 
			
		||||
  extern uint8_t _binary_bootother_start[], _binary_bootother_size[];
 | 
			
		||||
  extern uchar _binary_bootother_start[], _binary_bootother_size[];
 | 
			
		||||
  extern int main();
 | 
			
		||||
  int c;
 | 
			
		||||
 | 
			
		||||
  memmove((void *) APBOOTCODE,_binary_bootother_start, 
 | 
			
		||||
	  (uint32_t) _binary_bootother_size);
 | 
			
		||||
	  (uint) _binary_bootother_size);
 | 
			
		||||
 | 
			
		||||
  for(c = 0; c < ncpu; c++){
 | 
			
		||||
    if (c == cpu()) continue;
 | 
			
		||||
    cprintf ("starting processor %d\n", c);
 | 
			
		||||
    *(uint *)(APBOOTCODE-4) = (uint) (cpus[c].mpstack) + MPSTACK; // tell it what to use for %esp
 | 
			
		||||
    *(uint *)(APBOOTCODE-8) = (uint)mpmain; // tell it where to jump to
 | 
			
		||||
    lapic_startap(cpus[c].apicid, (uint32_t) APBOOTCODE);
 | 
			
		||||
    lapic_startap(cpus[c].apicid, (uint) APBOOTCODE);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										82
									
								
								mp.h
									
										
									
									
									
								
							
							
						
						
									
										82
									
								
								mp.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -5,63 +5,63 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
struct mp {			/* floating pointer */
 | 
			
		||||
  uint8_t signature[4];		/* "_MP_" */
 | 
			
		||||
  physaddr_t physaddr;	        /* physical address of MP configuration table */
 | 
			
		||||
  uint8_t length;		/* 1 */
 | 
			
		||||
  uint8_t specrev;		/* [14] */
 | 
			
		||||
  uint8_t checksum;		/* all bytes must add up to 0 */
 | 
			
		||||
  uint8_t type;			/* MP system configuration type */
 | 
			
		||||
  uint8_t imcrp;
 | 
			
		||||
  uint8_t reserved[3];
 | 
			
		||||
  uchar signature[4];		/* "_MP_" */
 | 
			
		||||
  void* physaddr;	        /* physical address of MP configuration table */
 | 
			
		||||
  uchar length;		/* 1 */
 | 
			
		||||
  uchar specrev;		/* [14] */
 | 
			
		||||
  uchar checksum;		/* all bytes must add up to 0 */
 | 
			
		||||
  uchar type;			/* MP system configuration type */
 | 
			
		||||
  uchar imcrp;
 | 
			
		||||
  uchar reserved[3];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mpctb {			/* configuration table header */
 | 
			
		||||
  uint8_t signature[4];		/* "PCMP" */
 | 
			
		||||
  uint16_t length;		/* total table length */
 | 
			
		||||
  uint8_t version;		/* [14] */
 | 
			
		||||
  uint8_t checksum;		/* all bytes must add up to 0 */
 | 
			
		||||
  uint8_t product[20];		/* product id */
 | 
			
		||||
  uintptr_t oemtable;		/* OEM table pointer */
 | 
			
		||||
  uint16_t oemlength;		/* OEM table length */
 | 
			
		||||
  uint16_t entry;		/* entry count */
 | 
			
		||||
  uintptr_t lapicaddr;		/* address of local APIC */
 | 
			
		||||
  uint16_t xlength;		/* extended table length */
 | 
			
		||||
  uint8_t xchecksum;		/* extended table checksum */
 | 
			
		||||
  uint8_t reserved;
 | 
			
		||||
  uchar signature[4];		/* "PCMP" */
 | 
			
		||||
  ushort length;		/* total table length */
 | 
			
		||||
  uchar version;		/* [14] */
 | 
			
		||||
  uchar checksum;		/* all bytes must add up to 0 */
 | 
			
		||||
  uchar product[20];		/* product id */
 | 
			
		||||
  uint * oemtable;		/* OEM table pointer */
 | 
			
		||||
  ushort oemlength;		/* OEM table length */
 | 
			
		||||
  ushort entry;		/* entry count */
 | 
			
		||||
  uint * lapicaddr;		/* address of local APIC */
 | 
			
		||||
  ushort xlength;		/* extended table length */
 | 
			
		||||
  uchar xchecksum;		/* extended table checksum */
 | 
			
		||||
  uchar reserved;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mppe {		/* processor table entry */
 | 
			
		||||
  uint8_t type;			/* entry type (0) */
 | 
			
		||||
  uint8_t apicid;		/* local APIC id */
 | 
			
		||||
  uint8_t version;		/* local APIC verison */
 | 
			
		||||
  uint8_t flags;		/* CPU flags */
 | 
			
		||||
  uint8_t signature[4];		/* CPU signature */
 | 
			
		||||
  uint32_t feature;		/* feature flags from CPUID instruction */
 | 
			
		||||
  uint8_t reserved[8];
 | 
			
		||||
  uchar type;			/* entry type (0) */
 | 
			
		||||
  uchar apicid;		/* local APIC id */
 | 
			
		||||
  uchar version;		/* local APIC verison */
 | 
			
		||||
  uchar flags;		/* CPU flags */
 | 
			
		||||
  uchar signature[4];		/* CPU signature */
 | 
			
		||||
  uint feature;		/* feature flags from CPUID instruction */
 | 
			
		||||
  uchar reserved[8];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mpbe {		/* bus table entry */
 | 
			
		||||
  uint8_t type;			/* entry type (1) */
 | 
			
		||||
  uint8_t busno;		/* bus id */
 | 
			
		||||
  uchar type;			/* entry type (1) */
 | 
			
		||||
  uchar busno;		/* bus id */
 | 
			
		||||
  char string[6];		/* bus type string */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mpioapic {	/* I/O APIC table entry */
 | 
			
		||||
  uint8_t type;			/* entry type (2) */
 | 
			
		||||
  uint8_t apicno;		/* I/O APIC id */
 | 
			
		||||
  uint8_t version;		/* I/O APIC version */
 | 
			
		||||
  uint8_t flags;		/* I/O APIC flags */
 | 
			
		||||
  uintptr_t addr;		/* I/O APIC address */
 | 
			
		||||
  uchar type;			/* entry type (2) */
 | 
			
		||||
  uchar apicno;		/* I/O APIC id */
 | 
			
		||||
  uchar version;		/* I/O APIC version */
 | 
			
		||||
  uchar flags;		/* I/O APIC flags */
 | 
			
		||||
  uint * addr;		/* I/O APIC address */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mpie {		/* interrupt table entry */
 | 
			
		||||
  uint8_t type;			/* entry type ([34]) */
 | 
			
		||||
  uint8_t intr;			/* interrupt type */
 | 
			
		||||
  uint16_t flags;		/* interrupt flag */
 | 
			
		||||
  uint8_t busno;		/* source bus id */
 | 
			
		||||
  uint8_t irq;			/* source bus irq */
 | 
			
		||||
  uint8_t apicno;		/* destination APIC id */
 | 
			
		||||
  uint8_t intin;		/* destination APIC [L]INTIN# */
 | 
			
		||||
  uchar type;			/* entry type ([34]) */
 | 
			
		||||
  uchar intr;			/* interrupt type */
 | 
			
		||||
  ushort flags;		/* interrupt flag */
 | 
			
		||||
  uchar busno;		/* source bus id */
 | 
			
		||||
  uchar irq;			/* source bus irq */
 | 
			
		||||
  uchar apicno;		/* destination APIC id */
 | 
			
		||||
  uchar intin;		/* destination APIC [L]INTIN# */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum {			/* table entry types */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								picirq.c
									
										
									
									
									
								
							
							
						
						
									
										4
									
								
								picirq.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -12,7 +12,7 @@
 | 
			
		|||
 | 
			
		||||
// Current IRQ mask.
 | 
			
		||||
// Initial IRQ mask has interrupt 2 enabled (for slave 8259A).
 | 
			
		||||
uint16_t irq_mask_8259A = 0xFFFF & ~(1<<IRQ_SLAVE);
 | 
			
		||||
ushort irq_mask_8259A = 0xFFFF & ~(1<<IRQ_SLAVE);
 | 
			
		||||
 | 
			
		||||
/* Initialize the 8259A interrupt controllers. */
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +71,7 @@ pic_init(void)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
irq_setmask_8259A(uint16_t mask)
 | 
			
		||||
irq_setmask_8259A(ushort mask)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  irq_mask_8259A = mask;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								proc.h
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								proc.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -65,7 +65,7 @@ extern struct proc *curproc[NCPU];  // can be NULL if no proc running.
 | 
			
		|||
#define MPSTACK 512
 | 
			
		||||
 | 
			
		||||
struct cpu {
 | 
			
		||||
  uint8_t apicid;       // Local APIC ID
 | 
			
		||||
  uchar apicid;       // Local APIC ID
 | 
			
		||||
  struct jmpbuf jmpbuf;
 | 
			
		||||
  char mpstack[MPSTACK]; // per-cpu start-up stack, only used to get into main()
 | 
			
		||||
  struct proc *lastproc;  // last proc scheduled on this cpu (never NULL)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
struct spinlock {
 | 
			
		||||
  uint locked;
 | 
			
		||||
  uint32_t pc;
 | 
			
		||||
  uint pc;
 | 
			
		||||
  int cpu;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								string.c
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								string.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -15,8 +15,8 @@ memset(void *dst, int c, uint n)
 | 
			
		|||
int
 | 
			
		||||
memcmp(const void *v1, const void *v2, uint n)
 | 
			
		||||
{
 | 
			
		||||
  const uint8_t *s1 = (const uint8_t *) v1;
 | 
			
		||||
  const uint8_t *s2 = (const uint8_t *) v2;
 | 
			
		||||
  const uchar *s1 = (const uchar *) v1;
 | 
			
		||||
  const uchar *s2 = (const uchar *) v2;
 | 
			
		||||
 | 
			
		||||
  while (n-- > 0) {
 | 
			
		||||
    if (*s1 != *s2)
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ strncmp(const char *p, const char *q, uint n)
 | 
			
		|||
	if (n == 0)
 | 
			
		||||
		return 0;
 | 
			
		||||
	else
 | 
			
		||||
		return (int) ((uint8_t) *p - (uint8_t) *q);
 | 
			
		||||
		return (int) ((uchar) *p - (uchar) *q);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Memcpy is deprecated and should NOT be called.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -235,8 +235,10 @@ sys_block(void)
 | 
			
		|||
    if ((c = ide_start_read(i, buf, 1)) == 0) {
 | 
			
		||||
      panic("couldn't start read\n");
 | 
			
		||||
    }
 | 
			
		||||
#if 0
 | 
			
		||||
    cprintf("call sleep\n");
 | 
			
		||||
    sleep (c, &ide_lock);
 | 
			
		||||
#endif
 | 
			
		||||
    if (ide_finish_read(c)) {
 | 
			
		||||
      panic("couldn't do read\n");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								types.h
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								types.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,9 +1,3 @@
 | 
			
		|||
typedef unsigned int       uint;
 | 
			
		||||
 | 
			
		||||
typedef unsigned long long uint64_t;
 | 
			
		||||
typedef unsigned int       uint32_t;
 | 
			
		||||
typedef unsigned short     uint16_t;
 | 
			
		||||
typedef unsigned char      uint8_t;
 | 
			
		||||
 | 
			
		||||
typedef uint32_t           uintptr_t;
 | 
			
		||||
typedef uint32_t           physaddr_t;
 | 
			
		||||
typedef unsigned int uint;
 | 
			
		||||
typedef unsigned short ushort;
 | 
			
		||||
typedef unsigned char uchar;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										177
									
								
								x86.h
									
										
									
									
									
								
							
							
						
						
									
										177
									
								
								x86.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,37 +1,36 @@
 | 
			
		|||
static __inline void breakpoint(void) __attribute__((always_inline));
 | 
			
		||||
static __inline uint8_t inb(int port) __attribute__((always_inline));
 | 
			
		||||
static __inline uchar inb(int port) __attribute__((always_inline));
 | 
			
		||||
static __inline void insb(int port, void *addr, int cnt) __attribute__((always_inline));
 | 
			
		||||
static __inline uint16_t inw(int port) __attribute__((always_inline));
 | 
			
		||||
static __inline ushort inw(int port) __attribute__((always_inline));
 | 
			
		||||
static __inline void insw(int port, void *addr, int cnt) __attribute__((always_inline));
 | 
			
		||||
static __inline uint32_t inl(int port) __attribute__((always_inline));
 | 
			
		||||
static __inline uint inl(int port) __attribute__((always_inline));
 | 
			
		||||
static __inline void insl(int port, void *addr, int cnt) __attribute__((always_inline));
 | 
			
		||||
static __inline void outb(int port, uint8_t data) __attribute__((always_inline));
 | 
			
		||||
static __inline void outb(int port, uchar data) __attribute__((always_inline));
 | 
			
		||||
static __inline void outsb(int port, const void *addr, int cnt) __attribute__((always_inline));
 | 
			
		||||
static __inline void outw(int port, uint16_t data) __attribute__((always_inline));
 | 
			
		||||
static __inline void outw(int port, ushort data) __attribute__((always_inline));
 | 
			
		||||
static __inline void outsw(int port, const void *addr, int cnt) __attribute__((always_inline));
 | 
			
		||||
static __inline void outsl(int port, const void *addr, int cnt) __attribute__((always_inline));
 | 
			
		||||
static __inline void outl(int port, uint32_t data) __attribute__((always_inline));
 | 
			
		||||
static __inline void outl(int port, uint data) __attribute__((always_inline));
 | 
			
		||||
static __inline void invlpg(void *addr) __attribute__((always_inline));
 | 
			
		||||
struct segdesc;
 | 
			
		||||
static __inline void lgdt(struct segdesc *p, int) __attribute__((always_inline));
 | 
			
		||||
struct gatedesc;
 | 
			
		||||
static __inline void lidt(struct gatedesc *p, int) __attribute__((always_inline));
 | 
			
		||||
static __inline void lldt(uint16_t sel) __attribute__((always_inline));
 | 
			
		||||
static __inline void ltr(uint16_t sel) __attribute__((always_inline));
 | 
			
		||||
static __inline void lcr0(uint32_t val) __attribute__((always_inline));
 | 
			
		||||
static __inline uint32_t rcr0(void) __attribute__((always_inline));
 | 
			
		||||
static __inline uint32_t rcr2(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void lcr3(uint32_t val) __attribute__((always_inline));
 | 
			
		||||
static __inline uint32_t rcr3(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void lcr4(uint32_t val) __attribute__((always_inline));
 | 
			
		||||
static __inline uint32_t rcr4(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void lldt(ushort sel) __attribute__((always_inline));
 | 
			
		||||
static __inline void ltr(ushort sel) __attribute__((always_inline));
 | 
			
		||||
static __inline void lcr0(uint val) __attribute__((always_inline));
 | 
			
		||||
static __inline uint rcr0(void) __attribute__((always_inline));
 | 
			
		||||
static __inline uint rcr2(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void lcr3(uint val) __attribute__((always_inline));
 | 
			
		||||
static __inline uint rcr3(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void lcr4(uint val) __attribute__((always_inline));
 | 
			
		||||
static __inline uint rcr4(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void tlbflush(void) __attribute__((always_inline));
 | 
			
		||||
static __inline uint32_t read_eflags(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void write_eflags(uint32_t eflags) __attribute__((always_inline));
 | 
			
		||||
static __inline uint32_t read_ebp(void) __attribute__((always_inline));
 | 
			
		||||
static __inline uint32_t read_esp(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void cpuid(uint32_t info, uint32_t *eaxp, uint32_t *ebxp, uint32_t *ecxp, uint32_t *edxp);
 | 
			
		||||
static __inline uint64_t read_tsc(void) __attribute__((always_inline));
 | 
			
		||||
static __inline uint read_eflags(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void write_eflags(uint eflags) __attribute__((always_inline));
 | 
			
		||||
static __inline uint read_ebp(void) __attribute__((always_inline));
 | 
			
		||||
static __inline uint read_esp(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void cpuid(uint info, uint *eaxp, uint *ebxp, uint *ecxp, uint *edxp);
 | 
			
		||||
static __inline void cli(void) __attribute__((always_inline));
 | 
			
		||||
static __inline void sti(void) __attribute__((always_inline));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -41,10 +40,10 @@ breakpoint(void)
 | 
			
		|||
	__asm __volatile("int3");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint8_t
 | 
			
		||||
static __inline uchar
 | 
			
		||||
inb(int port)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t data;
 | 
			
		||||
	uchar data;
 | 
			
		||||
	__asm __volatile("inb %w1,%0" : "=a" (data) : "d" (port));
 | 
			
		||||
	return data;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -58,10 +57,10 @@ insb(int port, void *addr, int cnt)
 | 
			
		|||
			 "memory", "cc");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint16_t
 | 
			
		||||
static __inline ushort
 | 
			
		||||
inw(int port)
 | 
			
		||||
{
 | 
			
		||||
	uint16_t data;
 | 
			
		||||
	ushort data;
 | 
			
		||||
	__asm __volatile("inw %w1,%0" : "=a" (data) : "d" (port));
 | 
			
		||||
	return data;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -75,10 +74,10 @@ insw(int port, void *addr, int cnt)
 | 
			
		|||
			 "memory", "cc");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
inl(int port)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t data;
 | 
			
		||||
	uint data;
 | 
			
		||||
	__asm __volatile("inl %w1,%0" : "=a" (data) : "d" (port));
 | 
			
		||||
	return data;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -93,7 +92,7 @@ insl(int port, void *addr, int cnt)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
outb(int port, uint8_t data)
 | 
			
		||||
outb(int port, uchar data)
 | 
			
		||||
{
 | 
			
		||||
	__asm __volatile("outb %0,%w1" : : "a" (data), "d" (port));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +107,7 @@ outsb(int port, const void *addr, int cnt)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
outw(int port, uint16_t data)
 | 
			
		||||
outw(int port, ushort data)
 | 
			
		||||
{
 | 
			
		||||
	__asm __volatile("outw %0,%w1" : : "a" (data), "d" (port));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -132,7 +131,7 @@ outsl(int port, const void *addr, int cnt)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
outl(int port, uint32_t data)
 | 
			
		||||
outl(int port, uint data)
 | 
			
		||||
{
 | 
			
		||||
	__asm __volatile("outl %0,%w1" : : "a" (data), "d" (port));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -146,7 +145,7 @@ invlpg(void *addr)
 | 
			
		|||
static __inline void
 | 
			
		||||
lgdt(struct segdesc *p, int size)
 | 
			
		||||
{
 | 
			
		||||
	volatile uint16_t pd[3];
 | 
			
		||||
	volatile ushort pd[3];
 | 
			
		||||
  
 | 
			
		||||
	pd[0] = size-1;
 | 
			
		||||
	pd[1] = (uint)p;
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +157,7 @@ lgdt(struct segdesc *p, int size)
 | 
			
		|||
static __inline void
 | 
			
		||||
lidt(struct gatedesc *p, int size)
 | 
			
		||||
{
 | 
			
		||||
	volatile uint16_t pd[3];
 | 
			
		||||
	volatile ushort pd[3];
 | 
			
		||||
  
 | 
			
		||||
	pd[0] = size-1;
 | 
			
		||||
	pd[1] = (uint)p;
 | 
			
		||||
| 
						 | 
				
			
			@ -168,63 +167,63 @@ lidt(struct gatedesc *p, int size)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
lldt(uint16_t sel)
 | 
			
		||||
lldt(ushort sel)
 | 
			
		||||
{
 | 
			
		||||
	__asm __volatile("lldt %0" : : "r" (sel));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
ltr(uint16_t sel)
 | 
			
		||||
ltr(ushort sel)
 | 
			
		||||
{
 | 
			
		||||
	__asm __volatile("ltr %0" : : "r" (sel));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
lcr0(uint32_t val)
 | 
			
		||||
lcr0(uint val)
 | 
			
		||||
{
 | 
			
		||||
	__asm __volatile("movl %0,%%cr0" : : "r" (val));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
rcr0(void)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t val;
 | 
			
		||||
	uint val;
 | 
			
		||||
	__asm __volatile("movl %%cr0,%0" : "=r" (val));
 | 
			
		||||
	return val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
rcr2(void)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t val;
 | 
			
		||||
	uint val;
 | 
			
		||||
	__asm __volatile("movl %%cr2,%0" : "=r" (val));
 | 
			
		||||
	return val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
lcr3(uint32_t val)
 | 
			
		||||
lcr3(uint val)
 | 
			
		||||
{
 | 
			
		||||
	__asm __volatile("movl %0,%%cr3" : : "r" (val));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
rcr3(void)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t val;
 | 
			
		||||
	uint val;
 | 
			
		||||
	__asm __volatile("movl %%cr3,%0" : "=r" (val));
 | 
			
		||||
	return val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
lcr4(uint32_t val)
 | 
			
		||||
lcr4(uint val)
 | 
			
		||||
{
 | 
			
		||||
	__asm __volatile("movl %0,%%cr4" : : "r" (val));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
rcr4(void)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t cr4;
 | 
			
		||||
	uint cr4;
 | 
			
		||||
	__asm __volatile("movl %%cr4,%0" : "=r" (cr4));
 | 
			
		||||
	return cr4;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -232,69 +231,69 @@ rcr4(void)
 | 
			
		|||
static __inline void
 | 
			
		||||
tlbflush(void)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t cr3;
 | 
			
		||||
	uint cr3;
 | 
			
		||||
	__asm __volatile("movl %%cr3,%0" : "=r" (cr3));
 | 
			
		||||
	__asm __volatile("movl %0,%%cr3" : : "r" (cr3));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
read_eflags(void)
 | 
			
		||||
{
 | 
			
		||||
        uint32_t eflags;
 | 
			
		||||
        uint eflags;
 | 
			
		||||
        __asm __volatile("pushfl; popl %0" : "=r" (eflags));
 | 
			
		||||
        return eflags;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
write_eflags(uint32_t eflags)
 | 
			
		||||
write_eflags(uint eflags)
 | 
			
		||||
{
 | 
			
		||||
        __asm __volatile("pushl %0; popfl" : : "r" (eflags));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
read_ebp(void)
 | 
			
		||||
{
 | 
			
		||||
        uint32_t ebp;
 | 
			
		||||
        uint ebp;
 | 
			
		||||
        __asm __volatile("movl %%ebp,%0" : "=r" (ebp));
 | 
			
		||||
        return ebp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
read_esp(void)
 | 
			
		||||
{
 | 
			
		||||
        uint32_t esp;
 | 
			
		||||
        uint esp;
 | 
			
		||||
        __asm __volatile("movl %%esp,%0" : "=r" (esp));
 | 
			
		||||
        return esp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
read_esi(void)
 | 
			
		||||
{
 | 
			
		||||
        uint32_t esi;
 | 
			
		||||
        uint esi;
 | 
			
		||||
        __asm __volatile("movl %%esi,%0" : "=r" (esi));
 | 
			
		||||
        return esi;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
read_edi(void)
 | 
			
		||||
{
 | 
			
		||||
        uint32_t edi;
 | 
			
		||||
        uint edi;
 | 
			
		||||
        __asm __volatile("movl %%edi,%0" : "=r" (edi));
 | 
			
		||||
        return edi;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
static __inline uint
 | 
			
		||||
read_ebx(void)
 | 
			
		||||
{
 | 
			
		||||
        uint32_t ebx;
 | 
			
		||||
        uint ebx;
 | 
			
		||||
        __asm __volatile("movl %%ebx,%0" : "=r" (ebx));
 | 
			
		||||
        return ebx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
cpuid(uint32_t info, uint32_t *eaxp, uint32_t *ebxp, uint32_t *ecxp, uint32_t *edxp)
 | 
			
		||||
cpuid(uint info, uint *eaxp, uint *ebxp, uint *ecxp, uint *edxp)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t eax, ebx, ecx, edx;
 | 
			
		||||
	uint eax, ebx, ecx, edx;
 | 
			
		||||
	asm volatile("cpuid" 
 | 
			
		||||
		: "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
 | 
			
		||||
		: "a" (info));
 | 
			
		||||
| 
						 | 
				
			
			@ -308,10 +307,10 @@ cpuid(uint32_t info, uint32_t *eaxp, uint32_t *ebxp, uint32_t *ecxp, uint32_t *e
 | 
			
		|||
		*edxp = edx;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint32_t
 | 
			
		||||
cmpxchg(uint32_t oldval, uint32_t newval, volatile uint32_t* lock_addr)
 | 
			
		||||
static __inline uint
 | 
			
		||||
cmpxchg(uint oldval, uint newval, volatile uint* lock_addr)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t result;
 | 
			
		||||
  uint result;
 | 
			
		||||
  __asm__ __volatile__(
 | 
			
		||||
		       "lock; cmpxchgl %2, %0"
 | 
			
		||||
		       :"+m" (*lock_addr), "=a" (result) : "r"(newval), "1"(oldval) : "cc"
 | 
			
		||||
| 
						 | 
				
			
			@ -319,14 +318,6 @@ cmpxchg(uint32_t oldval, uint32_t newval, volatile uint32_t* lock_addr)
 | 
			
		|||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline uint64_t
 | 
			
		||||
read_tsc(void)
 | 
			
		||||
{
 | 
			
		||||
        uint64_t tsc;
 | 
			
		||||
        __asm __volatile("rdtsc" : "=A" (tsc));
 | 
			
		||||
        return tsc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __inline void
 | 
			
		||||
cli(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -341,30 +332,30 @@ sti(void)
 | 
			
		|||
 | 
			
		||||
struct trapframe {
 | 
			
		||||
    /* registers as pushed by pusha */
 | 
			
		||||
    uint32_t edi;
 | 
			
		||||
    uint32_t esi;
 | 
			
		||||
    uint32_t ebp;
 | 
			
		||||
    uint32_t oesp;      /* Useless */
 | 
			
		||||
    uint32_t ebx;
 | 
			
		||||
    uint32_t edx;
 | 
			
		||||
    uint32_t ecx;
 | 
			
		||||
    uint32_t eax;
 | 
			
		||||
    uint edi;
 | 
			
		||||
    uint esi;
 | 
			
		||||
    uint ebp;
 | 
			
		||||
    uint oesp;      /* Useless */
 | 
			
		||||
    uint ebx;
 | 
			
		||||
    uint edx;
 | 
			
		||||
    uint ecx;
 | 
			
		||||
    uint eax;
 | 
			
		||||
    /* rest of trap frame */
 | 
			
		||||
    uint16_t es;
 | 
			
		||||
    uint16_t padding1;
 | 
			
		||||
    uint16_t ds;
 | 
			
		||||
    uint16_t padding2;
 | 
			
		||||
    uint32_t trapno;
 | 
			
		||||
    ushort es;
 | 
			
		||||
    ushort padding1;
 | 
			
		||||
    ushort ds;
 | 
			
		||||
    ushort padding2;
 | 
			
		||||
    uint trapno;
 | 
			
		||||
    /* below here defined by x86 hardware */
 | 
			
		||||
    uint32_t err;
 | 
			
		||||
    uintptr_t eip;
 | 
			
		||||
    uint16_t cs;
 | 
			
		||||
    uint16_t padding3;
 | 
			
		||||
    uint32_t eflags;
 | 
			
		||||
    uint err;
 | 
			
		||||
    uint eip;
 | 
			
		||||
    ushort cs;
 | 
			
		||||
    ushort padding3;
 | 
			
		||||
    uint eflags;
 | 
			
		||||
    /* below here only when crossing rings, such as from user to kernel */
 | 
			
		||||
    uintptr_t esp;
 | 
			
		||||
    uint16_t ss;
 | 
			
		||||
    uint16_t padding4;
 | 
			
		||||
    uint esp;
 | 
			
		||||
    ushort ss;
 | 
			
		||||
    ushort padding4;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define MAX_IRQS	16	// Number of IRQs
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue