#ifdef LAB_MMAP typedef unsigned long size_t; typedef long int off_t; #endif struct buf; struct context; struct file; struct inode; struct pipe; struct proc; struct spinlock; struct sleeplock; struct stat; struct superblock; #ifdef LAB_NET struct mbuf; struct sock; #endif struct sysinfo; // bio.c void binit(void); struct buf* bread(uint, uint); void brelse(struct buf*); void bwrite(struct buf*); void bpin(struct buf*); void bunpin(struct buf*); // console.c void consoleinit(void); void consoleintr(int); void consputc(int); // cow.c int cow_handler(pagetable_t, uint64); // exec.c int exec(char*, char**); // file.c struct file* filealloc(void); void fileclose(struct file*); struct file* filedup(struct file*); void fileinit(void); int fileread(struct file*, uint64, int n); int filestat(struct file*, uint64 addr); int filewrite(struct file*, uint64, int n); int fileperm(struct file*); int mmap_read(struct file*, uint64, uint64, int); int munmap_write(struct file*, uint64, uint64, int); // fs.c void fsinit(int); int dirlink(struct inode*, char*, uint); struct inode* dirlookup(struct inode*, char*, uint*); struct inode* ialloc(uint, short); struct inode* idup(struct inode*); void iinit(); void ilock(struct inode*); void iput(struct inode*); void iunlock(struct inode*); void iunlockput(struct inode*); void iupdate(struct inode*); int namecmp(const char*, const char*); struct inode* namei(char*); struct inode* nameiparent(char*, char*); int readi(struct inode*, int, uint64, uint, uint); void stati(struct inode*, struct stat*); int writei(struct inode*, int, uint64, uint, uint); void itrunc(struct inode*); // ramdisk.c void ramdiskinit(void); void ramdiskintr(void); void ramdiskrw(struct buf*); // kalloc.c int refcnt_inc(uint64); int refcnt_dec(uint64); void* kalloc(void); void kfree(void *); void kinit(void); int get_freemem(void); // log.c void initlog(int, struct superblock*); void log_write(struct buf*); void begin_op(void); void end_op(void); // pipe.c int pipealloc(struct file**, struct file**); void pipeclose(struct pipe*, int); int piperead(struct pipe*, uint64, int); int pipewrite(struct pipe*, uint64, int); // printf.c void printf(char*, ...); void panic(char*) __attribute__((noreturn)); void printfinit(void); void backtrace(void); // proc.c int cpuid(void); void exit(int); int fork(void); int growproc(int); void proc_mapstacks(pagetable_t); pagetable_t proc_pagetable(struct proc *); void proc_freepagetable(pagetable_t, uint64); int kill(int); int killed(struct proc*); void setkilled(struct proc*); struct cpu* mycpu(void); struct cpu* getmycpu(void); struct proc* myproc(); void procinit(void); void scheduler(void) __attribute__((noreturn)); void sched(void); void sleep(void*, struct spinlock*); void userinit(void); int wait(uint64); void wakeup(void*); void yield(void); int either_copyout(int user_dst, uint64 dst, void *src, uint64 len); int either_copyin(void *dst, int user_src, uint64 src, uint64 len); void procdump(void); int get_nproc(void); int pgaccess(uint64 base, int len, uint64 mask); uint64 mmap(uint64 addr, uint64 len, int prot, int flags, int fd, struct file* file, uint64 offset); int munmap(uint64 addr, uint64 len); // swtch.S void swtch(struct context*, struct context*); // spinlock.c void acquire(struct spinlock*); int holding(struct spinlock*); void initlock(struct spinlock*, char*); void release(struct spinlock*); void push_off(void); void pop_off(void); int atomic_read4(int *addr); #ifdef LAB_LOCK void freelock(struct spinlock*); #endif // sleeplock.c void acquiresleep(struct sleeplock*); void releasesleep(struct sleeplock*); int holdingsleep(struct sleeplock*); void initsleeplock(struct sleeplock*, char*); // string.c int memcmp(const void*, const void*, uint); void* memmove(void*, const void*, uint); void* memset(void*, int, uint); char* safestrcpy(char*, const char*, int); int strlen(const char*); int strncmp(const char*, const char*, uint); char* strncpy(char*, const char*, int); // syscall.c void argint(int, int*); int argstr(int, char*, int); void argaddr(int, uint64 *); int fetchstr(uint64, char*, int); int fetchaddr(uint64, uint64*); void syscall(); // sysfile.c int argfd(int n, int *pfd, struct file **pf); // sysinfo.c int sys_info(uint64); // trap.c extern uint ticks; void trapinit(void); void trapinithart(void); extern struct spinlock tickslock; void usertrapret(void); // uart.c void uartinit(void); void uartintr(void); void uartputc(int); void uartputc_sync(int); int uartgetc(void); // vm.c void kvminit(void); void kvminithart(void); void kvmmap(pagetable_t, uint64, uint64, uint64, int); int mappages(pagetable_t, uint64, uint64, uint64, int); pagetable_t uvmcreate(void); void uvmfirst(pagetable_t, uchar *, uint); uint64 uvmalloc(pagetable_t, uint64, uint64, int); uint64 uvmdealloc(pagetable_t, uint64, uint64); int uvmcopy(pagetable_t, pagetable_t, uint64, uint64); void uvmfree(pagetable_t, uint64); void uvmunmap(pagetable_t, uint64, uint64, int); void uvmclear(pagetable_t, uint64); pte_t * walk(pagetable_t, uint64, int); uint64 walkaddr(pagetable_t, uint64); int copyout(pagetable_t, uint64, char *, uint64); int copyin(pagetable_t, char *, uint64, uint64); int copyinstr(pagetable_t, char *, uint64, uint64); void vmprint(pagetable_t); // plic.c void plicinit(void); void plicinithart(void); int plic_claim(void); void plic_complete(int); // virtio_disk.c void virtio_disk_init(void); void virtio_disk_rw(struct buf *, int); void virtio_disk_intr(void); // number of elements in fixed-size array #define NELEM(x) (sizeof(x)/sizeof((x)[0])) #ifdef LAB_PGTBL // vmcopyin.c int copyin_new(pagetable_t, char *, uint64, uint64); int copyinstr_new(pagetable_t, char *, uint64, uint64); #endif // stats.c void statsinit(void); void statsinc(void); // sprintf.c int snprintf(char*, int, char*, ...); #ifdef KCSAN void kcsaninit(); #endif #ifdef LAB_NET // pci.c void pci_init(); // e1000.c void e1000_init(uint32 *); void e1000_intr(void); int e1000_transmit(struct mbuf*); // net.c void net_rx(struct mbuf*); void net_tx_udp(struct mbuf*, uint32, uint16, uint16); // sysnet.c void sockinit(void); int sockalloc(struct file **, uint32, uint16, uint16); void sockclose(struct sock *); int sockread(struct sock *, uint64, int); int sockwrite(struct sock *, uint64, int); void sockrecvudp(struct mbuf*, uint32, uint16, uint16); #endif