~crm/os

7dc87eb0921c8cf455acdef80edaa27632270d73 — Christos Margiolis 8 months ago 99e45b4
improve build system (still bad)
8 files changed, 76 insertions(+), 68 deletions(-)

M Makefile
M kern/Makefile
M kern/boot.s
M kern/idt.c
M kern/kbd.c
M kern/link.ld
M kern/vm_page.h
A mk/kern.mk
M Makefile => Makefile +3 -3
@@ 1,11 1,11 @@
TGTDIR=		build
BINDIR=		build

all:
	cd kern && make install clean && cd -

run:
	qemu-system-i386 -hda ${TGTDIR}/os.bin -d cpu -monitor stdio
	qemu-system-i386 -hda ${BINDIR}/os.img -d cpu -monitor stdio

clean:
	rm -rf ${TGTDIR}
	rm -rf ${BINDIR}
	cd kern && make clean && cd -

M kern/Makefile => kern/Makefile +4 -46
@@ 1,23 1,11 @@
BIN= 		os.bin
BIN= 		os.img
BINDIR= 	../build
PREFIX=		..	# base dir

CC= 		cc
ASM= 		nasm
LD= 		ld
ARCH= 		i386 # FIXME: make this automatic
ARCHINCDIR= 	../${ARCH}
INCDIR=		../include
LINKSCRIPT=	link.ld
CFLAGS= 	-g -m32 -Wall -Wextra -Werror -std=c99 -O2 \
		-nostdlib -nodefaultlibs \
		-ffreestanding -fno-stack-protector -fno-builtin \
		-I${ARCHINCDIR} -I${INCDIR}
LDFLAGS= 	-T${LINKSCRIPT} --oformat binary -melf_${ARCH}

BOOTFILE= 	boot.s
BOOT_FILE= 	boot.s
BOOT_BIN= 	boot.bin
KERNEL_BIN= 	kernel.bin
SRC= 		*.c *.s
OBJ= 		kern_main.o \
		libk.o \
		idt.o \


@@ 28,34 16,4 @@ OBJ= 		kern_main.o \
		timer.o \
		vm_page.o

all: options ${BIN}

options:
	@echo ${BIN} build options
	@echo ARCH	= ${ARCH}
	@echo CC	= ${CC}
	@echo ASM	= ${ASM}
	@echo LD	= ${LD}
	@echo CFLAGS	= ${CFLAGS}
	@echo LDFLAGS	= ${LDFLAGS}

${BIN}: ${OBJ}
	mkdir -p ${BINDIR}
	${ASM} -fbin ${BOOTFILE} -o ${BOOT_BIN}
	${LD} ${LDFLAGS} ${OBJ} -o ${KERNEL_BIN}
	dd if=/dev/zero bs=1000000 count=1 >> ${KERNEL_BIN}
	cat ${BOOT_BIN} ${KERNEL_BIN} > $@

.c.o:
	${CC} -c ${CFLAGS} $<

.s.o:
	${ASM} -felf $<

install: all
	mv ${BIN} ${BINDIR}

clean:
	rm -rf *.bin *.o

.PHONY: all options install clean
include	../mk/kern.mk

M kern/boot.s => kern/boot.s +12 -3
@@ 13,6 13,8 @@ section .text
; Entry point.
_start:
	cli			; Disable interrupts.
	jmp	0x0000:zeroseg
zeroseg:
	xor	ax, ax		; Clear segment registers.
	mov	ds, ax
	mov	es, ax


@@ 64,10 66,10 @@ a20_test:
	pop	bx
	
	mov	bx, 0x7e0e
	mov	dx, [es:bx]	; If the A20 line is disabled we get 0xaa55.
	mov	dx, [es:bx]

	cmp	ax, dx
	je	cont		; If they're equal, the A20 line might be disabled.
	je	cont		; If 0xaa55, the A20 line might be disabled.
	popa
	mov	ax, 0x01	; Success code 1.
	ret


@@ 265,10 267,17 @@ pm_init:
	mov	gs, ax
	mov	ss, ax

	xor	eax, eax
	mov	ebx, eax
	mov	ecx, eax
	mov	edx, eax
	mov	esi, eax
	mov	edi, eax
	mov	ebp, kern_stack_bottom
	mov	esp, kern_stack_top

	; Hand control over to the C kernel. Godspeed! You Black Emperor.
	call	KERNOFF
	jmp	GDT_CODESEG:KERNOFF
	jmp	$

; Print a null-terminated string.

M kern/idt.c => kern/idt.c +10 -6
@@ 19,12 19,16 @@ idt_set_gate(struct gate_desc *gd, void *func, u_int sel, u_int dpl, u_int type)
	gd->gd_lo = (sel << 16) | (addr & 0xffff);
}

extern void INTVEC(div), INTVEC(dbg), INTVEC(nmsk), INTVEC(bpt), INTVEC(ofl),
/*
 * u_char so `-pedantic` won't complain about taking the
 * address of `void`.
 */
extern u_char INTVEC(div), INTVEC(dbg), INTVEC(nmsk), INTVEC(bpt), INTVEC(ofl),
    INTVEC(bnd), INTVEC(ill), INTVEC(dna), INTVEC(dbl), INTVEC(fpusegm),
    INTVEC(tss), INTVEC(missing), INTVEC(stk), INTVEC(prot), INTVEC(page),
    INTVEC(rsvd), INTVEC(fpu), INTVEC(align), INTVEC(mchk), INTVEC(simd);

extern void INTVEC(irq0), INTVEC(irq1), INTVEC(irq2), INTVEC(irq3),
extern u_char INTVEC(irq0), INTVEC(irq1), INTVEC(irq2), INTVEC(irq3),
    INTVEC(irq4), INTVEC(irq5), INTVEC(irq6), INTVEC(irq7), INTVEC(irq8),
    INTVEC(irq9), INTVEC(irq10), INTVEC(irq11), INTVEC(irq12), INTVEC(irq13),
    INTVEC(irq14), INTVEC(irq15);


@@ 150,10 154,10 @@ dump_regs(struct reg *r)
	    r->r_eax, r->r_ebx, r->r_ecx, r->r_edx);
	printf("esi=%#08x\tedi=%#08x\tebp=%#08x\tesp=%#08x\n",
	    r->r_esi, r->r_edi, r->r_ebp, r->r_esp);
	printf("ds=%#08x \tes=%#08x \tfs=%#08x \tgs=%#08x\n",
	    r->r_ds, r->r_es, r->r_fs, r->r_gs);
	printf("eip=%#08x\tcs=%#08x \tss=%#08x \teflags=%#08x\n",
	    r->r_eip, r->r_cs, r->r_ss, r->r_eflags);
	printf("ds=%#04x \t\tes=%#04x \t\tfs=%#04x \t\tgs=%#04x\n",
	    (u_short)r->r_ds, (u_short)r->r_es, (u_short)r->r_fs, (u_short)r->r_gs);
	printf("cs=%#04x \t\tss=%#04x \t\teip=%#08x\teflags=%#08x\n",
	    (u_short)r->r_cs, (u_short)r->r_ss, r->r_eip, r->r_eflags);
	printf("int=%#08x\terr=%#08x\tuesp=%#08x\n",
	    r->r_intrno, r->r_err, r->r_uesp);
}

M kern/kbd.c => kern/kbd.c +4 -0
@@ 99,6 99,10 @@ kbd_callback(struct reg *r)
	if ((sc = inb(KBD_CMD)) & KBD_PRESSED) {
	} else {
		/* TODO: shift */
		if (kbdus_lower[sc] == 'r') {
			dump_regs(r);
			return;
		}
		vga_putc(shift ? kbdus_upper[sc] : kbdus_lower[sc]);
	}
	UNUSED(r);

M kern/link.ld => kern/link.ld +0 -1
@@ 2,7 2,6 @@ ENTRY(_start)
SECTIONS
{
	.text 0x1000 : {
		*(text.prologue)
		*(.text)
		. = ALIGN(4096);
	}

M kern/vm_page.h => kern/vm_page.h +0 -9
@@ 1,15 1,6 @@
#ifndef _VM_PAGE_H_
#define _VM_PAGE_H_

struct vm_page_entry {
};

struct vm_page_table {
};

struct vm_page_dir {
};

void vm_page_init(void);

#endif /* _VM_PAGE_H_ */

A mk/kern.mk => mk/kern.mk +43 -0
@@ 0,0 1,43 @@
CC= 		cc
AS= 		nasm
LD= 		ld
ARCH= 		i386 # FIXME: make this automatic
ARCHINCDIR+= 	${PREFIX}/${ARCH}
INCDIR+=	${PREFIX}/include
CFLAGS+= 	-g -m32 -Wall -Wextra -Werror -pedantic -std=c99 -O2 \
		-nostdlib -nodefaultlibs \
		-ffreestanding -fno-stack-protector -fno-builtin \
		-I${ARCHINCDIR} -I${INCDIR}
LDFLAGS+= 	-T${LINKSCRIPT} --oformat binary -melf_${ARCH} # FIXME: elf sig osdev

all: options ${BIN}

options:
	@echo ${BIN} build options
	@echo "ARCH	= ${ARCH}"
	@echo "CC	= ${CC}"
	@echo "AS	= ${AS}"
	@echo "LD	= ${LD}"
	@echo "CFLAGS	= ${CFLAGS}"
	@echo "LDFLAGS	= ${LDFLAGS}"

${BIN}: ${OBJ}
	mkdir -p ${BINDIR}
	${AS} -fbin ${BOOT_FILE} -o ${BOOT_BIN}
	${LD} ${LDFLAGS} ${OBJ} -o ${KERNEL_BIN}
	dd if=/dev/zero bs=1000000 count=1 >> ${KERNEL_BIN}
	cat ${BOOT_BIN} ${KERNEL_BIN} > $@

.c.o:
	${CC} -c ${CFLAGS} $<

.s.o:
	${AS} -felf $<

install: all
	mv ${BIN} ${BINDIR}

clean:
	rm -rf *.bin *.img *.o

.PHONY: all options install clean