Kevin's changes and some Ivy.
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Jan 2009 03:54:44 +0000 (19:54 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Jan 2009 03:54:44 +0000 (19:54 -0800)
Some ivy work, but does not compile with deputy yet (due also to my
changes to monitor.c).

Most of kevin's changes from lab1 made it too.  Anything missing is
cosmetic or didn't fit with the end of lab1 things I did.

14 files changed:
GNUmakefile
boot/main.c
inc/assert.h
inc/elf.h
inc/memlayout.h
inc/stdarg.h
inc/stdio.h
kern/Makefrag
kern/console.c
kern/entry.S
kern/init.c
kern/monitor.c
kern/monitor.h
kern/printf.c

index b223c43..2227725 100644 (file)
@@ -70,7 +70,7 @@ PERL  := perl
 # Compiler flags
 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
-CFLAGS := $(CFLAGS) $(DEFS) $(LABDEFS) -O -fno-builtin -I$(TOP) -MD -Wall -Wno-format -Wno-unused -Werror -gstabs
+CFLAGS := $(CFLAGS) $(DEFS) $(LABDEFS) -O -fno-builtin -I$(TOP) -MD -Wall -Wno-format -Wno-unused -gstabs
 
 # Linker flags for JOS user programs
 ULDFLAGS := -T user/user.ld
index d828a04..5a48ca3 100644 (file)
@@ -93,7 +93,7 @@ readseg(uint32_t va, uint32_t count, uint32_t offset)
 void
 waitdisk(void)
 {
-       // wait for disk reaady
+       // wait for disk ready
        while ((inb(0x1F7) & 0xC0) != 0x40)
                /* do nothing */;
 }
@@ -104,12 +104,21 @@ readsect(void *dst, uint32_t offset)
        // wait for disk to be ready
        waitdisk();
 
-       outb(0x1F2, 1);         // count = 1
-       outb(0x1F3, offset);
-       outb(0x1F4, offset >> 8);
-       outb(0x1F5, offset >> 16);
-       outb(0x1F6, (offset >> 24) | 0xE0);
-       outb(0x1F7, 0x20);      // cmd 0x20 - read sectors
+       /* the ISA uses a specified block of memory, 
+          addresses 0x1F0-0x1F7, that can use the special 
+          instructions inb/outb, as demonstrated in the 
+          following code in order to access the disk
+          Offset is 28 bytes long
+       */
+
+       outb(0x1F2, 1);                         // number of sectors to read
+       outb(0x1F3, offset);                    // bits 0-7 (low bits) of 28-bit offset
+       outb(0x1F4, offset >> 8);               // bits 8-15 of 28-bit offset
+       outb(0x1F5, offset >> 16);              // bits 16-23 of 28-bit offset
+       outb(0x1F6, (offset >> 24) | 0xE0);     // bits 24-27 of 28-bit offset
+                                               // bit 28 (= 0) means Disk 0
+                                               // other bits (29-31) must be set to one
+       outb(0x1F7, 0x20);                      // cmd 0x20 - read sectors
 
        // wait for disk to be ready
        waitdisk();
index aba04de..3d9656e 100644 (file)
@@ -5,8 +5,8 @@
 
 #include <inc/stdio.h>
 
-void _warn(const char*, int, const char*, ...);
-void _panic(const char*, int, const char*, ...) __attribute__((noreturn));
+void _warn(const char* NTS, int, const char* NTS, ...);
+void _panic(const char* NTS, int, const char* NTS, ...) __attribute__((noreturn));
 
 #define warn(...) _warn(__FILE__, __LINE__, __VA_ARGS__)
 #define panic(...) _panic(__FILE__, __LINE__, __VA_ARGS__)
index 7fbe294..2fb4257 100644 (file)
--- a/inc/elf.h
+++ b/inc/elf.h
@@ -5,12 +5,6 @@
 
 #include <inc/types.h>
 
-typedef uint32_t Elf32_Addr;
-typedef uint16_t Elf32_Half;
-typedef uint32_t Elf32_Off;
-typedef int32_t Elf32_Sword;
-typedef uint32_t Elf32_Word;
-
 struct Elf {
        uint32_t e_magic;       // must equal ELF_MAGIC
        uint8_t e_elf[12];
index fa5d8ef..08a80cc 100644 (file)
@@ -33,7 +33,7 @@
  *                     |                              | RW/--
  *                     |   Remapped Physical Memory   | RW/--
  *                     |                              | RW/--
- *    KERNBASE ----->  +------------------------------+ 0xf0000000
+ *    KERNBASE ----->  +------------------------------+ 0xC0000000
  *                     |  Cur. Page Table (Kern. RW)  | RW/--  PTSIZE
  *    VPT,KSTACKTOP--> +------------------------------+ 0xefc00000      --+
  *                     |         Kernel Stack         | RW/--  KSTKSIZE   |
index 9fc067e..7e7c451 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef JOS_INC_STDARG_H
 #define        JOS_INC_STDARG_H
 
-typedef char *va_list;
+typedef void * TRUSTED va_list;
 
 #define        __va_size(type) \
        (((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long))
index e7b4a35..9792bf9 100644 (file)
@@ -13,16 +13,16 @@ int getchar(void);
 int    iscons(int fd);
 
 // lib/printfmt.c
-void   printfmt(void (*putch)(int, void*), void *putdat, const char *fmt, ...);
-void   vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list);
+void   printfmt(void (*putch)(int, void*), void *putdat, const char *NTS fmt, ...);
+void   vprintfmt(void (*putch)(int, TV(t)), TV(t) putdat, const char *NTS fmt, va_list);
 
 // lib/printf.c
-int    cprintf(const char *fmt, ...);
-int    vcprintf(const char *fmt, va_list);
+int    cprintf(const char * NTS fmt, ...);
+int    vcprintf(const char * NTS fmt, va_list);
 
 // lib/sprintf.c
 int    snprintf(char *str, int size, const char *fmt, ...);
-int    vsnprintf(char *str, int size, const char *fmt, va_list);
+int    vsnprintf(char *COUNT(size) str, int size, const char *fmt, va_list);
 
 // lib/fprintf.c
 int    printf(const char *fmt, ...);
@@ -30,6 +30,6 @@ int   fprintf(int fd, const char *fmt, ...);
 int    vfprintf(int fd, const char *fmt, va_list);
 
 // lib/readline.c
-char*  readline(const char *prompt);
+char *NTS readline(const char *NTS prompt);
 
 #endif /* !JOS_INC_STDIO_H */
index f0f675d..7a05eee 100644 (file)
@@ -6,6 +6,8 @@
 #
 
 OBJDIRS += kern
+#CC=ivycc --save-temps --trace --deputy 
+CC=ivycc 
 
 KERN_LDFLAGS := $(LDFLAGS) -T kern/kernel.ld -nostdlib
 
index b28ef83..2509fa7 100644 (file)
@@ -111,21 +111,21 @@ lpt_putc(int c)
 /***** Text-mode CGA/VGA display output *****/
 
 static unsigned addr_6845;
-static uint16_t *crt_buf;
+static uint16_t *COUNT(CRT_SIZE) crt_buf;
 static uint16_t crt_pos;
 
 void
 cga_init(void)
 {
-       volatile uint16_t *cp;
+       volatile uint16_t *COUNT(CRT_SIZE) cp;
        uint16_t was;
        unsigned pos;
 
-       cp = (uint16_t*) (KERNBASE + CGA_BUF);
+       cp = (uint16_t *COUNT(CRT_SIZE)) TC(KERNBASE + CGA_BUF);
        was = *cp;
        *cp = (uint16_t) 0xA55A;
        if (*cp != 0xA55A) {
-               cp = (uint16_t*) (KERNBASE + MONO_BUF);
+               cp = (uint16_t *COUNT(CRT_SIZE)) TC(KERNBASE + MONO_BUF);
                addr_6845 = MONO_BASE;
        } else {
                *cp = was;
@@ -138,7 +138,7 @@ cga_init(void)
        outb(addr_6845, 15);
        pos |= inb(addr_6845 + 1);
 
-       crt_buf = (uint16_t*) cp;
+       crt_buf = (uint16_t *COUNT(CRT_SIZE)) cp;
        crt_pos = pos;
 }
 
@@ -177,6 +177,9 @@ cga_putc(int c)
        }
 
        // What is the purpose of this?
+       // The purpose of this is to allow the screen to appear as if it is scrolling as
+       // more lines are added beyond the size of the monitor.  The top line is removed, 
+       // everything is shifted up by one.
        if (crt_pos >= CRT_SIZE) {
                int i;
 
@@ -286,7 +289,7 @@ static uint8_t ctlmap[256] =
        [0xD2] KEY_INS,         [0xD3] KEY_DEL
 };
 
-static uint8_t *charcode[4] = {
+static uint8_t * COUNT(256) charcode[4] = {
        normalmap,
        shiftmap,
        ctlmap,
index 27e5e23..54da2f6 100644 (file)
@@ -8,14 +8,17 @@
 
 
 ###################################################################
-# The kernel (this code) is linked at address (KERNBASE + 1 Meg), 
-# but the bootloader loads it at address 1 Meg.
-# Kernbase is set for a 3g/1g split
-#      
+# The kernel (this code) is linked at address (KERNBASE + 0x00100000 (1MB)), 
+# but we tell the bootloader to load it at physical address 
+# 0x00100000 (1MB), which is the start of extended memory.
+# (See kernel.ld)
+###################################################################
+
+
+###################################################################
 # RELOC(x) maps a symbol x from its link address to its actual
 # location in physical memory (its load address).       
 ###################################################################
-
 #define        RELOC(x) ((x) - KERNBASE)
 
 
index 9846556..86c25bd 100644 (file)
 #include <kern/pmap.h>
 #include <kern/kclock.h>
 
-void
-kernel_init(multiboot_info_t *mboot_info)
+void kernel_init(multiboot_info_t *mboot_info)
 {
-       extern char edata[], end[];
+       extern char (BND(__this, end) edata)[], (SNT end)[];
 
        // Before doing anything else, complete the ELF loading process.
        // Clear the uninitialized global data (BSS) section of our program.
@@ -41,14 +40,13 @@ kernel_init(multiboot_info_t *mboot_info)
  * Variable panicstr contains argument to first call to panic; used as flag
  * to indicate that the kernel has already called panic.
  */
-static const char *panicstr;
+static const char *NTS panicstr;
 
 /*
  * Panic is called on unresolvable fatal errors.
  * It prints "panic: mesg", and then enters the kernel monitor.
  */
-void
-_panic(const char *file, int line, const char *fmt,...)
+void _panic(const char *file, int line, const char *fmt,...)
 {
        va_list ap;
 
@@ -69,8 +67,7 @@ dead:
 }
 
 /* like panic, but don't */
-void
-_warn(const char *file, int line, const char *fmt,...)
+void _warn(const char *file, int line, const char *fmt,...) 
 {
        va_list ap;
 
index 213f9b0..d571f9b 100644 (file)
 
 #define CMDBUF_SIZE    80      // enough for one VGA text line
 
-
-struct Command {
-       const char *name;
-       const char *desc;
+typedef struct command {
+       const char *NTS name;
+       const char *NTS desc;
        // return -1 to force monitor to exit
-       int (*func)(int argc, char** argv, struct Trapframe* tf);
-};
+       int (*func)(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t* tf);
+} command_t;
 
-static struct Command commands[] = {
+static command_t commands[] = {
        { "help", "Display this list of commands", mon_help },
        { "kerninfo", "Display information about the kernel", mon_kerninfo },
        { "backtrace", "Dump a backtrace", mon_backtrace },
@@ -30,12 +29,9 @@ static struct Command commands[] = {
 };
 #define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))
 
-unsigned read_eip();
-
 /***** Implementations of basic kernel monitor commands *****/
 
-int
-mon_help(int argc, char **argv, struct Trapframe *tf)
+int mon_help(int argc, char **argv, trapframe_t *tf)
 {
        int i;
 
@@ -44,18 +40,17 @@ mon_help(int argc, char **argv, struct Trapframe *tf)
        return 0;
 }
 
-int
-mon_kerninfo(int argc, char **argv, struct Trapframe *tf)
+int mon_kerninfo(int argc, char **argv, trapframe_t *tf)
 {
-       extern char _start[], etext[], edata[], end[];
+       extern char (SNT _start)[], (SNT etext)[], (SNT edata)[], (SNT end)[];
 
        cprintf("Special kernel symbols:\n");
-       cprintf("  _start %08x (virt)  %08x (phys)\n", _start, _start - KERNBASE);
-       cprintf("  etext  %08x (virt)  %08x (phys)\n", etext, etext - KERNBASE);
-       cprintf("  edata  %08x (virt)  %08x (phys)\n", edata, edata - KERNBASE);
-       cprintf("  end    %08x (virt)  %08x (phys)\n", end, end - KERNBASE);
+       cprintf("  _start %08x (virt)  %08x (phys)\n", _start, (uint32_t)(_start - KERNBASE));
+       cprintf("  etext  %08x (virt)  %08x (phys)\n", etext, (uint32_t)(etext - KERNBASE));
+       cprintf("  edata  %08x (virt)  %08x (phys)\n", edata, (uint32_t)(edata - KERNBASE));
+       cprintf("  end    %08x (virt)  %08x (phys)\n", end, (uint32_t)(end - KERNBASE));
        cprintf("Kernel executable memory footprint: %dKB\n",
-               (end-_start+1023)/1024);
+               (uint32_t)(end-_start+1023)/1024);
        return 0;
 }
 
@@ -83,8 +78,7 @@ static char* function_of(uint32_t address)
        return stabstr + best_symtab->n_strx;
 }
 
-int
-mon_backtrace(int argc, char **argv, struct Trapframe *tf)
+int mon_backtrace(int argc, char **argv, trapframe_t *tf)
 {
        uint32_t* ebp, eip;
        int i = 1;
@@ -110,12 +104,10 @@ mon_backtrace(int argc, char **argv, struct Trapframe *tf)
                eip = *(ebp + 1);
                ebp = (uint32_t*)(*ebp);
        }
-
        return 0;
 }
 
-int
-mon_reboot(int argc, char **argv, struct Trapframe *tf)
+int mon_reboot(int argc, char **argv, trapframe_t *tf)
 {
        cprintf("[Irish Accent]: She's goin' down, Cap'n!\n");
        outb(0x92, 0x3);
@@ -124,17 +116,15 @@ mon_reboot(int argc, char **argv, struct Trapframe *tf)
 }
 
 
-
 /***** Kernel monitor command interpreter *****/
 
 #define WHITESPACE "\t\r\n "
 #define MAXARGS 16
 
-static int
-runcmd(char *buf, struct Trapframe *tf)
-{
+static int runcmd(char *COUNT(CMDBUF_SIZE) real_buf, trapframe_t* tf) {
+       char *BND(real_buf, real_buf+CMDBUF_SIZE) buf = real_buf;
        int argc;
-       char *argv[MAXARGS];
+       char *NTS argv[MAXARGS];
        int i;
 
        // Parse the command buffer into whitespace-separated arguments
@@ -152,7 +142,8 @@ runcmd(char *buf, struct Trapframe *tf)
                        cprintf("Too many arguments (max %d)\n", MAXARGS);
                        return 0;
                }
-               argv[argc++] = buf;
+               //This will get fucked at runtime..... in the ASS
+               argv[argc++] = (char *NTS) TC(buf);
                while (*buf && !strchr(WHITESPACE, *buf))
                        buf++;
        }
@@ -169,15 +160,12 @@ runcmd(char *buf, struct Trapframe *tf)
        return 0;
 }
 
-void
-monitor(struct Trapframe *tf)
-{
+void monitor(trapframe_t* tf) {
        char *buf;
 
        cprintf("Welcome to the JOS kernel monitor!\n");
        cprintf("Type 'help' for a list of commands.\n");
 
-
        while (1) {
                buf = readline("K> ");
                if (buf != NULL)
index 5dde6ac..26475c6 100644 (file)
@@ -4,17 +4,18 @@
 # error "This is a JOS kernel header; user programs should not #include it"
 #endif
 
-struct Trapframe;
+typedef struct trapframe {
+} trapframe_t;
 
 // Activate the kernel monitor,
 // optionally providing a trap frame indicating the current state
 // (NULL if none).
-void monitor(struct Trapframe *tf);
+void monitor(trapframe_t *tf);
 
 // Functions implementing monitor commands.
-int mon_help(int argc, char **argv, struct Trapframe *tf);
-int mon_kerninfo(int argc, char **argv, struct Trapframe *tf);
-int mon_backtrace(int argc, char **argv, struct Trapframe *tf);
-int mon_reboot(int argc, char **argv, struct Trapframe *tf);
+int mon_help(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
+int mon_kerninfo(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
+int mon_backtrace(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
+int mon_reboot(int argc, char *NTS *NT COUNT(argc) argv, trapframe_t *tf);
 
 #endif // !JOS_KERN_MONITOR_H
index 6932ca5..fef65ac 100644 (file)
@@ -10,7 +10,7 @@ static void
 putch(int ch, int *cnt)
 {
        cputchar(ch);
-       *cnt++;
+       *cnt = *cnt + 1;
 }
 
 int
@@ -18,7 +18,7 @@ vcprintf(const char *fmt, va_list ap)
 {
        int cnt = 0;
 
-       vprintfmt((void*)putch, &cnt, fmt, ap);
+       vprintfmt(putch, &cnt, fmt, ap);
        return cnt;
 }