Merge branch 'lab1' into lab2
This commit is contained in:
		
						commit
						d7a96eb60f
					
				@ -17,6 +17,7 @@ KERN_SRCFILES :=	kern/entry.S \
 | 
			
		||||
			kern/entrypgdir.c \
 | 
			
		||||
			kern/init.c \
 | 
			
		||||
			kern/console.c \
 | 
			
		||||
			kern/ansi.c \
 | 
			
		||||
			kern/monitor.c \
 | 
			
		||||
			kern/pmap.c \
 | 
			
		||||
			kern/env.c \
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										49
									
								
								kern/ansi.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								kern/ansi.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
			
		||||
#include <kern/ansi.h>
 | 
			
		||||
 | 
			
		||||
uint8_t vga_colors[8] = {
 | 
			
		||||
	[0] = 0,
 | 
			
		||||
	[1] = 4,
 | 
			
		||||
	[2] = 2,
 | 
			
		||||
	[3] = 6,
 | 
			
		||||
	[4] = 1,
 | 
			
		||||
	[5] = 5,
 | 
			
		||||
	[6] = 3,
 | 
			
		||||
	[7] = 7
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ansi_step(void (*putcf)(int), int c, struct AttrState* s) {
 | 
			
		||||
	switch(s->state) {
 | 
			
		||||
		case NORMAL:
 | 
			
		||||
			if(c != 27) putcf(c | (s->cattrs << 8));
 | 
			
		||||
			else s->state = ESC;
 | 
			
		||||
			return;
 | 
			
		||||
		case ESC:
 | 
			
		||||
			s->state = (c == '[') ? BRACKET : NORMAL;
 | 
			
		||||
			return;
 | 
			
		||||
		case BRACKET:
 | 
			
		||||
			if(c == '3') {
 | 
			
		||||
				s->state = COLOR_FG;
 | 
			
		||||
			} else if(c == '0') {
 | 
			
		||||
				s->state = COLOR;
 | 
			
		||||
				s->attrs = 0;
 | 
			
		||||
			} else {
 | 
			
		||||
				s->state = NORMAL;
 | 
			
		||||
			}
 | 
			
		||||
			return;
 | 
			
		||||
		case COLOR_FG:
 | 
			
		||||
			if(c >= '0' && c <= '9') {
 | 
			
		||||
				s->attrs = (s->attrs & ~(0x07)) | vga_colors[c - '0'];
 | 
			
		||||
				c |= ((c - '0') << 8);
 | 
			
		||||
				s->state = COLOR;
 | 
			
		||||
			} else {
 | 
			
		||||
				s->state = NORMAL;
 | 
			
		||||
			}
 | 
			
		||||
			return;
 | 
			
		||||
		case COLOR:
 | 
			
		||||
			s->state = (c == ';') ? BRACKET : NORMAL;
 | 
			
		||||
			if(c == 'm') s->cattrs = s->attrs;
 | 
			
		||||
			return;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								kern/ansi.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								kern/ansi.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
#ifndef _ANSI_H_
 | 
			
		||||
#define _ANSI_H_
 | 
			
		||||
 | 
			
		||||
#include <inc/types.h>
 | 
			
		||||
 | 
			
		||||
struct AttrState {
 | 
			
		||||
	uint8_t cattrs;
 | 
			
		||||
	uint8_t attrs;
 | 
			
		||||
	enum {
 | 
			
		||||
		NORMAL,
 | 
			
		||||
		ESC,
 | 
			
		||||
		BRACKET,
 | 
			
		||||
		COLOR_FG,
 | 
			
		||||
		COLOR
 | 
			
		||||
	} state;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void ansi_step(void (*putcf)(int), int c, struct AttrState* s);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@ -7,6 +7,7 @@
 | 
			
		||||
#include <inc/assert.h>
 | 
			
		||||
 | 
			
		||||
#include <kern/console.h>
 | 
			
		||||
#include <kern/ansi.h>
 | 
			
		||||
 | 
			
		||||
static void cons_intr(int (*proc)(void));
 | 
			
		||||
static void cons_putc(int c);
 | 
			
		||||
@ -128,6 +129,7 @@ lpt_putc(int c)
 | 
			
		||||
static unsigned addr_6845;
 | 
			
		||||
static uint16_t *crt_buf;
 | 
			
		||||
static uint16_t crt_pos;
 | 
			
		||||
static struct AttrState attst;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cga_init(void)
 | 
			
		||||
@ -136,6 +138,10 @@ cga_init(void)
 | 
			
		||||
	uint16_t was;
 | 
			
		||||
	unsigned pos;
 | 
			
		||||
 | 
			
		||||
	attst.cattrs = 0;
 | 
			
		||||
	attst.attrs = 0;
 | 
			
		||||
	attst.state = NORMAL;
 | 
			
		||||
 | 
			
		||||
	cp = (uint16_t*) (KERNBASE + CGA_BUF);
 | 
			
		||||
	was = *cp;
 | 
			
		||||
	*cp = (uint16_t) 0xA55A;
 | 
			
		||||
@ -157,10 +163,15 @@ cga_init(void)
 | 
			
		||||
	crt_pos = pos;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void cga_putc_internal(int c);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cga_putc(int c)
 | 
			
		||||
cga_putc(int c){
 | 
			
		||||
	ansi_step(cga_putc_internal, c, &attst);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
cga_putc_internal(int c)
 | 
			
		||||
{
 | 
			
		||||
	// if no attribute given, then use black on white
 | 
			
		||||
	if (!(c & ~0xFF))
 | 
			
		||||
 | 
			
		||||
@ -29,6 +29,14 @@ i386_init(void)
 | 
			
		||||
	// Lab 2 memory management initialization functions
 | 
			
		||||
	mem_init();
 | 
			
		||||
 | 
			
		||||
	// Test ANSI color escape codes
 | 
			
		||||
	cprintf("\33[31m" "C"
 | 
			
		||||
		"\33[33m" "o"
 | 
			
		||||
		"\33[32m" "l"
 | 
			
		||||
		"\33[36m" "o"
 | 
			
		||||
		"\33[34m" "r"
 | 
			
		||||
		"\33[0m"  " Works!" "\n");
 | 
			
		||||
 | 
			
		||||
	// Drop into the kernel monitor.
 | 
			
		||||
	while (1)
 | 
			
		||||
		monitor(NULL);
 | 
			
		||||
 | 
			
		||||
@ -171,7 +171,8 @@ debuginfo_eip(uintptr_t addr, struct Eipdebuginfo *info)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// Search within [lline, rline] for the line number stab.
 | 
			
		||||
	// If found, set info->eip_line to the right line number.
 | 
			
		||||
	// If found, set info->eip_line to the correct line number.
 | 
			
		||||
    // e.g., info->eip_line = stabs[lline].n_desc
 | 
			
		||||
	// If not found, return -1.
 | 
			
		||||
	//
 | 
			
		||||
	// Hint:
 | 
			
		||||
@ -179,6 +180,12 @@ debuginfo_eip(uintptr_t addr, struct Eipdebuginfo *info)
 | 
			
		||||
	//	Look at the STABS documentation and <inc/stab.h> to find
 | 
			
		||||
	//	which one.
 | 
			
		||||
	// Your code here.
 | 
			
		||||
	stab_binsearch(stabs, &lline, &rline, N_SLINE, addr);
 | 
			
		||||
	if(lline <= rline) {
 | 
			
		||||
		info->eip_line = stabs[lline].n_desc;
 | 
			
		||||
	} else {
 | 
			
		||||
		info->eip_line = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// Search backwards from the line number for the relevant filename
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@ struct Command {
 | 
			
		||||
static struct Command commands[] = {
 | 
			
		||||
	{ "help", "Display this list of commands", mon_help },
 | 
			
		||||
	{ "kerninfo", "Display information about the kernel", mon_kerninfo },
 | 
			
		||||
	{ "backtrace", "Display current backtrace", mon_backtrace }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/***** Implementations of basic kernel monitor commands *****/
 | 
			
		||||
@ -61,6 +62,25 @@ mon_backtrace(int argc, char **argv, struct Trapframe *tf)
 | 
			
		||||
	// LAB 1: Your code here.
 | 
			
		||||
    // HINT 1: use read_ebp().
 | 
			
		||||
    // HINT 2: print the current ebp on the first line (not current_ebp[0])
 | 
			
		||||
	uint32_t* ebp;
 | 
			
		||||
	uint32_t eip;
 | 
			
		||||
	struct Eipdebuginfo info;
 | 
			
		||||
 | 
			
		||||
	ebp = (uint32_t*) read_ebp();
 | 
			
		||||
	cprintf("Stack backtrace:\n");
 | 
			
		||||
	while(ebp) {
 | 
			
		||||
		eip = ebp[1];
 | 
			
		||||
		cprintf("  ebp %08x  eip %08x  args %08x %08x %08x %08x %08x\n",
 | 
			
		||||
			ebp, eip, ebp[2], ebp[3], ebp[4], ebp[5], ebp[6]);
 | 
			
		||||
		ebp = (uint32_t*) ebp[0];
 | 
			
		||||
		
 | 
			
		||||
		debuginfo_eip(eip, &info);
 | 
			
		||||
		cprintf("           %s:%d: %.*s+%d\n",
 | 
			
		||||
			info.eip_file, info.eip_line,
 | 
			
		||||
			info.eip_fn_namelen, info.eip_fn_name,
 | 
			
		||||
			eip - info.eip_fn_addr);
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -205,11 +205,9 @@ vprintfmt(void (*putch)(int, void*), void *putdat, const char *fmt, va_list ap)
 | 
			
		||||
 | 
			
		||||
		// (unsigned) octal
 | 
			
		||||
		case 'o':
 | 
			
		||||
			// LAB 1: Replace this with your code.
 | 
			
		||||
			putch('X', putdat);
 | 
			
		||||
			putch('X', putdat);
 | 
			
		||||
			putch('X', putdat);
 | 
			
		||||
			break;
 | 
			
		||||
			num = getuint(&ap, lflag);
 | 
			
		||||
			base = 8;
 | 
			
		||||
			goto number;
 | 
			
		||||
 | 
			
		||||
		// pointer
 | 
			
		||||
		case 'p':
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
OSU  ID  (xxx-yyy-zzz)  : 933456789
 | 
			
		||||
FLIP ID (e.g., jangye)  : jangye
 | 
			
		||||
Name                    : Yeongjin Jang
 | 
			
		||||
OSU  ID  (xxx-yyy-zzz)  : 932700867
 | 
			
		||||
FLIP ID (e.g., jangye)  : fedorind
 | 
			
		||||
Name                    : Danila Fedorin
 | 
			
		||||
CS 444/544 ?            : 444
 | 
			
		||||
Lab Class #             : Lab 1
 | 
			
		||||
Lab Class #             : Lab 2
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user