diff --git a/alloc.ccp b/alloc.ccp index 00c3b47..2935864 100644 --- a/alloc.ccp +++ b/alloc.ccp @@ -377,6 +377,8 @@ void kCapability::invalidate (): return if sibling_prev.valid (): sibling_prev->sibling_next = sibling_next + else if parent.valid (): + parent->children = sibling_next else if (unsigned)target & ~KERNEL_MASK: target->capabilities = sibling_next else: @@ -497,19 +499,19 @@ static void check_receiver (kReceiver *r, kCapRef cap, unsigned line): dpanic (line, "consistency bug in capabilities") else: if cap->protected_data.l != (unsigned)r: - dbg_log ("Buggy: ") + dbg_log ("Buggy: receiver=") dbg_log_num ((unsigned)r) - dbg_log (" ") + dbg_log ("; caps=") dbg_log_num ((unsigned)cap.caps) - dbg_log (" ") + dbg_log ("; caps mem=") dbg_log_num ((unsigned)cap.caps->address_space) - dbg_log (" ") + dbg_log ("; cap=") dbg_log_num ((unsigned)cap.deref ()) - dbg_log (" ") + dbg_log ("; cap target=") dbg_log_num ((unsigned)cap->target) - dbg_log ("/") + dbg_log ("; protected=") dbg_log_num (cap->protected_data.l) - dbg_log ("\n") + dbg_log ("!= receiver\n") dpanic (line, "consistency bug in kernel capabilities") for kCapRef c = cap->children; c.valid (); c = c->sibling_next: check_receiver (r, c, line) diff --git a/boot-programs/init.ccp b/boot-programs/init.ccp index 9d33f23..89eb44a 100644 --- a/boot-programs/init.ccp +++ b/boot-programs/init.ccp @@ -53,6 +53,9 @@ void *operator new[] (unsigned size): //kdebug ("\n") return ret +void *operator new (unsigned size): + return new char[size] + struct file: unsigned size // Only the first 16 characters of the name are used, because that's much easier. @@ -328,9 +331,80 @@ static void kdebug_name (char const *t, file *f): kdebug_char (f->name[j]) kdebug ("...") +struct Dev: + static Dev *devs + Dev *next + unsigned code, idx + Device dev + static Dev *find (unsigned c, unsigned i): + for Dev *d = devs; d; d = d->next: + if d->code == c && d->idx == i: + return d + return NULL + static void add (unsigned c, unsigned i, Kernel::Cap cap): + while find (c, i): + ++i + Dev *d = new Dev () + d->next = devs + d->code = c + d->idx = i + d->dev = cap + devs = d + static void kdebug_list (): + for Dev *d = devs; d; d = d->next: + kdebug (">") + kdebug_num (d->code) + kdebug (":") + kdebug_num (d->idx) + +Dev *Dev::devs + +void handle_init (): + while true: + Kernel::wait () + switch Kernel::recv.data[0].l: + case Parent::PROVIDE_DEVICE: + Dev::add (Kernel::recv.data[1].l, Kernel::recv.data[0].h, Kernel::get_arg ()) + kdebug ("added dev ") + kdebug_num (Kernel::recv.data[1].l) + kdebug (":") + kdebug_num (Kernel::recv.data[0].h) + kdebug ("\n") + Kernel::recv.reply.invoke () + break + case Parent::GET_DEVICE: + Dev *d = Dev::find (Kernel::recv.data[1].l, Kernel::recv.data[0].h) + if d: + kdebug ("given dev ") + kdebug_num (Kernel::recv.data[1].l) + kdebug (":") + kdebug_num (Kernel::recv.data[0].h) + kdebug ("\n") + Kernel::Cap cap = d->dev.create_user (Kernel::my_memory) + d->dev.use (cap) + Kernel::recv.reply.invoke (0, 0, cap.copy ()) + Kernel::free_cap (cap) + else: + kdebug ("device not found: ") + kdebug_num (Kernel::recv.data[1].l) + kdebug (":") + kdebug_num (Kernel::recv.data[0].h) + Dev::kdebug_list () + kdebug ("\n") + Kernel::recv.reply.invoke (~0, ~0) + Kernel::panic (0) + break + case Parent::INIT_DONE: + kdebug ("init done\n") + return + default: + kdebug ("unknown init request\n") + Kernel::panic (0) + Kernel::Num start (): // Wait for the debugging device to be active, in case there is one. Kernel::schedule () + //Dev::devs = NULL init_alloc () top_memory = Kernel::get_top_memory () Directory root = receive_devices () @@ -344,10 +418,11 @@ Kernel::Num start (): kdebug_name ("loading ", &files[index[i]]) run (&files[index[i]], files[index[i]].name[0] == '#') kdebug ("running\n") - Kernel::schedule () + handle_init () root.unlock_ro () Kernel::free_slot (slot) Kernel::my_memory.destroy (caps) while true: - Kernel::wait () - kdebug ("request!\n") + handle_init () + //Kernel::wait () + //kdebug ("request!\n") diff --git a/devices.hhp b/devices.hhp index 262edcc..fceefba 100644 --- a/devices.hhp +++ b/devices.hhp @@ -141,6 +141,7 @@ struct Parent : public Kernel::Cap: PROVIDE_DEVICE GET_MEMORY PROVIDE_MEMORY + INIT_DONE EXIT ID // Get a device handle. @@ -158,6 +159,9 @@ struct Parent : public Kernel::Cap: Kernel::Cap provide_memory (unsigned limit): icall (CAP_MASTER_DIRECT | PROVIDE_MEMORY, limit) return Kernel::get_arg () + // Signal the parent that the initialisation phase is over. + void init_done (): + invoke (CAP_MASTER_DIRECT | INIT_DONE) // Exit the program. The parent does not reply, but kills the process. void exit (Kernel::Num code): call (CAP_MASTER_DIRECT | EXIT, code) diff --git a/invoke.ccp b/invoke.ccp index dc408aa..254eff2 100644 --- a/invoke.ccp +++ b/invoke.ccp @@ -602,6 +602,9 @@ static void page_invoke (unsigned cmd, unsigned target, Kernel::Num protected_da if c->data[0].h & Kernel::Page::READONLY || cmd & Kernel::Page::READONLY: t->flags |= Kernel::Page::READONLY if !(page->flags & Kernel::Page::FRAME): + dbg_log ("share problem: ") + dbg_log_num (page->flags) + dbg_log ("\n") dpanic (0, "sharing nothing results in lost page") kPage_arch_update_mapping (t) break @@ -718,6 +721,8 @@ static void page_invoke (unsigned cmd, unsigned target, Kernel::Num protected_da dpanic (0, "invalid page operation") reply_num (Kernel::ERR_INVALID_OPERATION) return + if page->flags > 0x7f: + dpanic (page->flags, "weird output from page operation") reply_num (0) static void print_cap (kCapRef cap, kCapRef self): diff --git a/mips/arch.ccp b/mips/arch.ccp index bc19169..80cb3c3 100644 --- a/mips/arch.ccp +++ b/mips/arch.ccp @@ -138,6 +138,19 @@ static void tlb_reset (kMemory *mem, unsigned address, unsigned value): else: cp0_set (CP0_ENTRY_LO0, value) __asm__ volatile ("tlbwi") + #if 0 + dbg_log ("tlb reset ") + unsigned hi, lo0, lo1 + cp0_get (CP0_ENTRY_LO0, lo0) + cp0_get (CP0_ENTRY_LO1, lo1) + cp0_get (CP0_ENTRY_HI, hi) + dbg_log_num (lo0) + dbg_log (":") + dbg_log_num (lo1) + dbg_log (" for ") + dbg_log_num (hi) + dbg_log ("\n") + #endif static unsigned make_entry_lo (kPage *page): //dbg_log_line () diff --git a/mips/interrupts.ccp b/mips/interrupts.ccp index 99da592..87919df 100644 --- a/mips/interrupts.ccp +++ b/mips/interrupts.ccp @@ -84,13 +84,15 @@ kThread *tlb_refill (): cp0_set (CP0_ENTRY_LO0, t->entrylo[idx]) cp0_set (CP0_ENTRY_LO1, t->entrylo[idx + 1]) __asm__ volatile ("tlbwr") - //dbg_log ("tlb refill ") - //dbg_log_num (t->entrylo[idx]) - //dbg_log (":") - //dbg_log_num (t->entrylo[idx + 1]) - //dbg_log (" for ") - //dbg_log_num (EntryHi) - //dbg_log ("\n") + #if 0 + dbg_log ("tlb refill ") + dbg_log_num (t->entrylo[idx]) + dbg_log (":") + dbg_log_num (t->entrylo[idx + 1]) + dbg_log (" for ") + dbg_log_num (EntryHi) + dbg_log ("\n") + #endif handle_exit () return current diff --git a/mips/nanonote/Makefile.arch b/mips/nanonote/Makefile.arch index 630c511..9324f01 100644 --- a/mips/nanonote/Makefile.arch +++ b/mips/nanonote/Makefile.arch @@ -29,14 +29,14 @@ arch_iris_sources = mips/interrupts.cc mips/arch.cc boot_sources = mips/init.cc mips/nanonote/board.cc arch_headers = mips/arch.hh mips/nanonote/jz4740.hh mips/nanonote/board.hh boot_threads = init udc -programs = \#nanonote-gpio \#buzzer \#lcd +programs = \#nanonote-gpio \#buzzer \#lcd metronome all: test test: iris.raw mips/nanonote/server/usb-server mips/nanonote/sdram-setup.raw $(addsuffix .elf,$(addprefix fs/,$(programs))) echo "reboot 0xa$(shell /bin/sh -c '$(OBJDUMP) -t iris.elf | grep __start$$ | cut -b2-8')" | nc localhost 5050 -mips/nanonote/server/usb-server: mips/nanonote/server/usb-server.ccp mips/nanonote/server/Makefile.am mips/nanonote/server/configure.ac +mips/nanonote/server/usb-server: mips/nanonote/server/usb-server.ccp mips/nanonote/server/Makefile.am mips/nanonote/server/configure.ac devices.hh $(MAKE) -C mips/nanonote/server echo "shutdown" | nc localhost 5050 sleep 1 @@ -60,7 +60,7 @@ $(addsuffix .elf,$(boot_threads)): TARGET_FLAGS = -I. $(addsuffix .elf,$(boot_threads)): LDFLAGS = -EL $(addprefix fs/,$(addsuffix .elf,$(programs))): LDFLAGS = -EL $(addprefix boot-programs/,$(addsuffix .cc,$(boot_threads))): devices.hh keys.hh -source/lcd.o: source/charset.data +source/\#lcd.o: source/charset.data source/charset.data: source/charset $< > $@ diff --git a/panic.ccp b/panic.ccp index 4ac0ad6..6c640c0 100644 --- a/panic.ccp +++ b/panic.ccp @@ -51,22 +51,20 @@ static void print_addr (char const *t, unsigned addr): unsigned de = addr >> 21 unsigned te = (addr >> 12) & ((1 << 9) - 1) if de < 0x400 && old_current && old_current->address_space->arch.directory && old_current->address_space->arch.directory[de]: - dbg_log ("; page = ") - dbg_log_num ((unsigned)old_current->address_space->arch.directory[de]->page[te]) dbg_log ("; EntryLo = ") dbg_log_num (old_current->address_space->arch.directory[de]->entrylo[te]) - dbg_log ("\n") else: - dbg_log ("; no directory or page table\n") + dbg_log ("; no directory or page table") if old_current: cp0_set (CP0_ENTRY_HI, (addr & (PAGE_MASK << 1)) | old_current->address_space->arch.asid) __asm__ volatile ("tlbp") unsigned idx, hi cp0_get (CP0_INDEX, idx) - dbg_log ("tlb index: ") + dbg_log ("; tlb index: ") if idx & (1 << 31): - dbg_log ("none") + dbg_log ("none\n") else: + __asm__ volatile ("tlbr") dbg_log_num (idx, 2) dbg_log ("; EntryLo = ") unsigned lo @@ -80,7 +78,7 @@ static void print_addr (char const *t, unsigned addr): for int i = -4; i < 4; ++i: dbg_log (" ") dbg_log_num (((unsigned *)addr)[i]) - dbg_log ("\n") + dbg_log ("\n") static void panic_message (unsigned n, const char *line, char const *name, char const *message): unsigned vaddr, epc diff --git a/source/#buzzer.ccp b/source/#buzzer.ccp index 7837a94..fa29cf2 100644 --- a/source/#buzzer.ccp +++ b/source/#buzzer.ccp @@ -53,7 +53,6 @@ enum codes: BUZZER = 32 Kernel::Num start (): - kdebug ("buzzer started.\n") map_tcu () DevBuzzer buzzer @@ -63,6 +62,7 @@ Kernel::Num start (): Kernel::free_cap (dev) unsigned user (~0) unsigned next_user (0) + Kernel::my_parent.init_done () while true: Kernel::wait () switch Kernel::recv.protected_data.h: diff --git a/source/#gpio.ccp b/source/#gpio.ccp index d89ddf2..e316d6f 100644 --- a/source/#gpio.ccp +++ b/source/#gpio.ccp @@ -278,6 +278,7 @@ Kernel::Num start (): GPIO_GPIER (GPIO_KBD_ROW_PORT) = (1 << GPIO_TP_LEFT) | (1 << GPIO_TP_RIGHT) | GPIO_KBD_ROW_MASK Kernel::register_interrupt (IRQ_GPIO0) + Kernel::my_parent.init_done () while true: Kernel::schedule () Kernel::wait () diff --git a/source/#lcd.ccp b/source/#lcd.ccp index f69ecb2..f5314af 100644 --- a/source/#lcd.ccp +++ b/source/#lcd.ccp @@ -312,8 +312,8 @@ Kernel::Num start (): bool is_on = true unsigned backlight_user = 0 Kernel::Num current_backlight = 0 + Kernel::my_parent.init_done () while true: - //log_str ("Wachten...\n") Kernel::wait () //log_msg () switch Kernel::recv.protected_data.h: diff --git a/source/#nanonote-gpio.ccp b/source/#nanonote-gpio.ccp index 521bdfb..fc8dd8a 100644 --- a/source/#nanonote-gpio.ccp +++ b/source/#nanonote-gpio.ccp @@ -211,6 +211,7 @@ Kernel::Num start (): unsigned user (~0) unsigned next_user (0) Kernel::register_interrupt (IRQ_GPIO3) + Kernel::my_parent.init_done () while true: Kernel::wait () switch Kernel::recv.protected_data.h: diff --git a/source/metronome.ccp b/source/metronome.ccp index 6bde23f..c9fa6b2 100644 --- a/source/metronome.ccp +++ b/source/metronome.ccp @@ -29,6 +29,7 @@ Kernel::Num start (): // Frequency of single pulses in hertz. unsigned freq = 1000 bool running (false) + Kernel::my_parent.init_done () while true: Kernel::wait () switch Kernel::recv.protected_data.l: