From f1c608288ff76b2b67b0383fe4f603adcdfdcc30 Mon Sep 17 00:00:00 2001 From: Bas Wijnen Date: Mon, 18 Jan 2010 05:01:59 +0100 Subject: [PATCH] almost working --- alloc.ccp | 10 +++ boot-programs/init.ccp | 15 ++-- invoke.ccp | 27 +++++-- kernel.hhp | 3 +- mips/arch.ccp | 4 + mips/nanonote/Makefile.arch | 2 +- mips/nanonote/board.ccp | 2 +- mips/nanonote/server/usb-server.ccp | 25 +++--- panic.ccp | 81 ++++++++++++------- source/{buzzer.ccp => #buzzer.ccp} | 2 +- source/{gpio.ccp => #gpio.ccp} | 1 - source/{lcd.ccp => #lcd.ccp} | 0 .../{nanonote-gpio.ccp => #nanonote-gpio.ccp} | 1 - source/crt0.ccp | 3 +- source/metronome.ccp | 1 - 15 files changed, 114 insertions(+), 63 deletions(-) rename source/{buzzer.ccp => #buzzer.ccp} (99%) rename source/{gpio.ccp => #gpio.ccp} (99%) rename source/{lcd.ccp => #lcd.ccp} (100%) rename source/{nanonote-gpio.ccp => #nanonote-gpio.ccp} (99%) diff --git a/alloc.ccp b/alloc.ccp index 0694486..00c3b47 100644 --- a/alloc.ccp +++ b/alloc.ccp @@ -177,6 +177,9 @@ kPage *kMemory::alloc_page (): ret->frame = 0 ret->flags = 0 ret->mapping = ~0 + ret->share_prev = NULL + ret->share_next = NULL + kPage_arch_init (ret) return ret kThread *kMemory::alloc_thread (unsigned size): @@ -196,6 +199,9 @@ kThread *kMemory::alloc_thread (unsigned size): ret->slot[i].prev.thread = NULL ret->slot[i].next.thread = NULL ret->slot[i].caps = NULL + //dbg_log ("new thread: ") + //dbg_log_num ((unsigned)ret) + //dbg_log ("\n") return ret void kCaps::init (unsigned s): @@ -466,6 +472,10 @@ void kMemory::free_memory (kMemory *mem): free_obj (mem, (void **)&memories) void kPage::forget (): + //dbg_log ("forget ") + //dbg_log_num ((unsigned)this) + //dbg_log ("\n") + dbg_code.l = (unsigned)old_current if share_prev || share_next: if share_prev: share_prev->share_next = share_next diff --git a/boot-programs/init.ccp b/boot-programs/init.ccp index 5ec237c..9d33f23 100644 --- a/boot-programs/init.ccp +++ b/boot-programs/init.ccp @@ -133,11 +133,6 @@ static void list_files (Directory root): for unsigned i = 0; i < num_files; ++i: String n = root.get_name (i) n.get_chars (0, files[i].name) - kdebug ("file: ") - for unsigned j = 0; j < 16; ++j: - if files[i].name[j] != 0: - kdebug_char (files[i].name[j]) - kdebug_char ('\n') Kernel::free_cap (n) Kernel::set_recv_arg (Kernel::Cap (slot, i)) files[i].string = root.get_file_ro (i) @@ -326,6 +321,13 @@ static void run (file *f, bool priv): Kernel::free_cap (parent) Kernel::free_cap (caps) +static void kdebug_name (char const *t, file *f): + kdebug (t) + for unsigned j = 0; j < 16; ++j: + if f->name[j] != 0: + kdebug_char (f->name[j]) + kdebug ("...") + Kernel::Num start (): // Wait for the debugging device to be active, in case there is one. Kernel::schedule () @@ -339,7 +341,10 @@ Kernel::Num start (): slot = caps.use () mapping = alloc_space (max_pages) for unsigned i = 0; i < num_files; ++i: + kdebug_name ("loading ", &files[index[i]]) run (&files[index[i]], files[index[i]].name[0] == '#') + kdebug ("running\n") + Kernel::schedule () root.unlock_ro () Kernel::free_slot (slot) Kernel::my_memory.destroy (caps) diff --git a/invoke.ccp b/invoke.ccp index a135784..dc408aa 100644 --- a/invoke.ccp +++ b/invoke.ccp @@ -48,7 +48,10 @@ static void log_message (char const *prefix, unsigned target, unsigned pdata, kC void kThread::raise (unsigned code, unsigned data): dbg_log ("raise ") - dbg_log_num (old_current->id, 2) + if old_current: + dbg_log_num (old_current->id, 2) + else: + dbg_log ("xx") dbg_log_char (':') dbg_log_num ((unsigned)old_current) dbg_log_char ('/') @@ -400,7 +403,7 @@ static void thread_invoke (unsigned cmd, unsigned target, Kernel::Num protected_ return case Kernel::Thread::SET_INFO & REQUEST_MASK: unsigned *value - switch c->data[1].l: + switch c->data[0].h: case Kernel::Thread::PC: value = &thread->pc break @@ -422,11 +425,11 @@ static void thread_invoke (unsigned cmd, unsigned target, Kernel::Num protected_ if (v & Kernel::Thread::RUNNING) != (*value & Kernel::Thread::RUNNING): if v & Kernel::Thread::RUNNING: thread->run () - else + else: thread->unrun () break default: - value = kThread_arch_info (thread, c->data[1].l) + value = kThread_arch_info (thread, c->data[0].h) break if value: *value = (*value & ~c->data[1].h) | (c->data[1].l & c->data[1].h) @@ -479,6 +482,7 @@ static void thread_invoke (unsigned cmd, unsigned target, Kernel::Num protected_ return case Kernel::Thread::PRIV_MAKE_PRIV & REQUEST_MASK: if !c->arg.valid () || ((unsigned)c->arg->target) & ~REQUEST_MASK != CAPTYPE_THREAD: + dpanic (0, "not a thread argument for make priv") reply_num (Kernel::ERR_INVALID_ARGUMENT) return ((kThread *)c->arg->protected_data.l)->flags |= Kernel::Thread::PRIV @@ -556,7 +560,7 @@ static void thread_invoke (unsigned cmd, unsigned target, Kernel::Num protected_ static void page_check_payment (kPage *page): kPage *p - for p = page->share_prev; p; p = p->share_prev: + for p = page; p; p = p->share_prev: if p->flags & Kernel::Page::PAYING: return for p = page->share_next; p; p = p->share_next: @@ -565,7 +569,7 @@ static void page_check_payment (kPage *page): // No kPage is paying for this frame anymore. raw_pfree (page->frame) kPage *next - for p = page->share_prev, next = p->share_prev; p; p = next, next = p->share_prev: + for p = page->share_prev, next = (p ? p->share_prev : NULL); p; p = next, next = p->share_prev: p->frame = NULL p->share_prev = NULL p->share_next = NULL @@ -593,7 +597,8 @@ static void page_invoke (unsigned cmd, unsigned target, Kernel::Num protected_da reply_num (Kernel::ERR_INVALID_ARGUMENT) return kPage *t = (kPage *)c->arg->protected_data.l - t->forget () + if t != page: + t->forget () if c->data[0].h & Kernel::Page::READONLY || cmd & Kernel::Page::READONLY: t->flags |= Kernel::Page::READONLY if !(page->flags & Kernel::Page::FRAME): @@ -623,6 +628,10 @@ static void page_invoke (unsigned cmd, unsigned target, Kernel::Num protected_da t->frame = raw_zalloc () for unsigned i = 0; i < PAGE_SIZE; i += 4: ((unsigned *)t->frame)[i >> 2] = d[i >> 2] + if c->data[0].h & Kernel::Page::FORGET: + page->frame = NULL + page->flags &= ~Kernel::Page::FRAME + kPage_arch_update_mapping (page) else: if t != page: t->frame = page->frame @@ -630,6 +639,8 @@ static void page_invoke (unsigned cmd, unsigned target, Kernel::Num protected_da page->frame = NULL page->flags &= ~Kernel::Page::FRAME kPage_arch_update_mapping (page) + else: + dpanic (0, "sharing page with itself...") else: if t == page: dpanic (0, "sharing page with itself") @@ -640,6 +651,8 @@ static void page_invoke (unsigned cmd, unsigned target, Kernel::Num protected_da if t->flags & Kernel::Page::PAYING: t->frame = page->frame t->flags |= Kernel::Page::FRAME + else: + dpanic (0, "move page failed because target is not paying") page->frame = NULL page->flags &= ~Kernel::Page::FRAME kPage_arch_update_mapping (page) diff --git a/kernel.hhp b/kernel.hhp index d57364f..f449d4f 100644 --- a/kernel.hhp +++ b/kernel.hhp @@ -170,7 +170,6 @@ struct kPage : public kObject: unsigned frame unsigned flags unsigned mapping - kPageP share_first kPageP share_prev, share_next kPage_arch arch void forget () @@ -306,6 +305,7 @@ void kMemory_arch_free (kMemory *mem) bool kMemory_arch_map (kMemory *mem, kPage *page, unsigned address) void kMemory_arch_unmap (kMemory *mem, kPage *page) kPage *kMemory_arch_get_mapping (kMemory *mem, unsigned address) +void kPage_arch_init (kPage *page) void kPage_arch_update_mapping (kPage *page) void arch_register_interrupt (unsigned num, kReceiverP r) void arch_reboot () @@ -314,6 +314,7 @@ void arch_uncache_page (unsigned page) bool kMemory::map (kPage *page, unsigned address): return kMemory_arch_map (this, page, address) void kMemory::unmap (kPage *page): + page->forget () kMemory_arch_unmap (this, page) kPage *kMemory::get_mapping (unsigned address): return kMemory_arch_get_mapping (this, address) diff --git a/mips/arch.ccp b/mips/arch.ccp index afbf642..bc19169 100644 --- a/mips/arch.ccp +++ b/mips/arch.ccp @@ -34,6 +34,10 @@ void kThread_arch_init (kThread *thread): thread->arch.hi = 0 thread->arch.lo = 0 +void kPage_arch_init (kPage *page): + page->arch.prev_mapped = NULL + page->arch.next_mapped = NULL + void kThread_arch_receive (kThread *thread, Kernel::Num protected_data, Kernel::Num *data): thread->arch.a[0] = data[0].l thread->arch.a[1] = data[0].h diff --git a/mips/nanonote/Makefile.arch b/mips/nanonote/Makefile.arch index 68946b4..630c511 100644 --- a/mips/nanonote/Makefile.arch +++ b/mips/nanonote/Makefile.arch @@ -29,7 +29,7 @@ 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 metronome lcd +programs = \#nanonote-gpio \#buzzer \#lcd all: test diff --git a/mips/nanonote/board.ccp b/mips/nanonote/board.ccp index c62bd1e..5c76a82 100644 --- a/mips/nanonote/board.ccp +++ b/mips/nanonote/board.ccp @@ -72,7 +72,7 @@ void board_init (): UART0_DLLR = uart_div UART0_LCR = UARTLCR_WLEN_8 | UARTLCR_STOP1 UART0_FCR = UARTFCR_UUE | UARTFCR_FE | UARTFCR_RFLS | UARTFCR_TFLS - dbg_log ("Serial port initialized\n") + dbg_log ("\n\nSerial port initialized\n") #endif void arch_reboot (): diff --git a/mips/nanonote/server/usb-server.ccp b/mips/nanonote/server/usb-server.ccp index 9519f02..a124a01 100644 --- a/mips/nanonote/server/usb-server.ccp +++ b/mips/nanonote/server/usb-server.ccp @@ -39,7 +39,7 @@ struct data: static int const boot_product = 0x4740 static int const run_vendor = 0xfffe static int const run_product = 0x0002 - static unsigned const timeout = 1000 + static unsigned const timeout = 10000 void boot (unsigned entry) data (std::string const &port): handle = NULL @@ -75,10 +75,15 @@ static std::string files ("fs") struct Name: char name[16] std::string full + std::string content Name (std::string const &n): full = files + '/' + n memset (name, 0, 16) memcpy (name, n.data (), n.size () > 16 ? 16 : n.size ()) + std::ifstream f (full.c_str ()) + std::ostringstream s + s << f.rdbuf () + content = s.str () static std::vector dir unsigned lock (0) @@ -160,15 +165,13 @@ void data::poll (): return unsigned pos = buffer[0] >> 16 std::cerr << "getting data from " << pos << '\n' - std::ifstream file (dir[buffer[1]].full.c_str ()) - file.seekg (pos << 12) - char page[1 << 12] - memset (page, 0, 1 << 12) - file.read (page, 1 << 12) - shevek::dump (std::string (page, 32), std::cerr) - std::cerr << "sending bulk\n" + std::string page + if dir[buffer[1]].content.size () <= pos << 12: + page = std::string (1 << 12, 0) + else: + page = (dir[buffer[1]].content.substr (pos << 12, 1 << 12) + std::string (1 << 12, 0)).substr (0, 1 << 12) for unsigned i = 0; i < (1 << 12); i += 64: - if usb_bulk_write (handle, 1 | USB_ENDPOINT_OUT, &page[i], 64, timeout) != 64: + if usb_bulk_write (handle, 1 | USB_ENDPOINT_OUT, &page.data ()[i], 64, timeout) != 64: std::cerr << "unable to send file to device: " << usb_strerror () << std::endl usb_release_interface (handle, 0) usb_close (handle) @@ -182,9 +185,7 @@ void data::poll (): usb_close (handle) handle = NULL return - std::ifstream file (dir[buffer[1]].full.c_str ()) - file.seekg (0, std::ios_base::end) - unsigned long long size = file.tellg () + unsigned long long size = dir[buffer[1]].content.size () std::cerr << "sending file size " << size << "\n" if usb_control_msg (handle, USB_ENDPOINT_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, String::GET_SIZE, 0, 0, (char *)&size, 8, timeout) != 8: std::cerr << "unable to send size to device: " << usb_strerror () << std::endl diff --git a/panic.ccp b/panic.ccp index b397572..4ac0ad6 100644 --- a/panic.ccp +++ b/panic.ccp @@ -45,30 +45,54 @@ void dbg_log_num (unsigned num, unsigned digits): return #if 1 || defined (NDEBUG) +static void print_addr (char const *t, unsigned addr): + dbg_log (t) + dbg_log_num (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") + 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: ") + if idx & (1 << 31): + dbg_log ("none") + else: + dbg_log_num (idx, 2) + dbg_log ("; EntryLo = ") + unsigned lo + cp0_get (CP0_ENTRY_LO0, lo) + dbg_log_num (lo) + dbg_log (":") + cp0_get (CP0_ENTRY_LO1, lo) + dbg_log_num (lo) + dbg_log ("\n") + if addr >= 0x80000000: + for int i = -4; i < 4; ++i: + dbg_log (" ") + dbg_log_num (((unsigned *)addr)[i]) + dbg_log ("\n") + static void panic_message (unsigned n, const char *line, char const *name, char const *message): - //unsigned addr - //cp0_get (CP0_BAD_V_ADDR, addr) - //unsigned de = addr >> 21 - //unsigned te = (addr >> 12) & ((1 << 9) - 1) - //dbg_log_num ((unsigned)old_current->address_space->arch.directory[de]->page[te]) - //dbg_log (":") - //dbg_log_num (old_current->address_space->arch.directory[de]->entrylo[te]) - //dbg_log ("\n") - //__asm__ volatile ("tlbp") - //unsigned idx, hi - //cp0_get (CP0_INDEX, idx) - //dbg_log_num (idx) - //dbg_log (":") - //cp0_get (CP0_ENTRY_HI, hi) - //dbg_log_num (hi) - //dbg_log (":") - //unsigned lo - //cp0_get (CP0_ENTRY_LO0, lo) - //dbg_log_num (lo) - //dbg_log (":") - //cp0_get (CP0_ENTRY_LO1, lo) - //dbg_log_num (lo) - //dbg_log ("\n") + unsigned vaddr, epc + cp0_get (CP0_BAD_V_ADDR, vaddr) + cp0_get (CP0_EPC, epc) + #if 1 + unsigned addr + print_addr ("BadVAddr: ", vaddr) + if old_current: + print_addr ("PC: ", old_current->pc) + print_addr ("epc: ", epc) + #endif dbg_log ("Panic: caller = ") if old_current: dbg_log_num (old_current->id, 2) @@ -85,15 +109,10 @@ static void panic_message (unsigned n, const char *line, char const *name, char dbg_log (message) dbg_log_char ('/') dbg_log_num (n) - dbg_log_char (';') + dbg_log ("; debug: ") dbg_log_num (dbg_code.h) - dbg_log (" bad vaddr = ") - unsigned a - cp0_get (CP0_BAD_V_ADDR, a) - dbg_log_num (a) - dbg_log (" epc = ") - cp0_get (CP0_EPC, a) - dbg_log_num (a) + dbg_log_char (':') + dbg_log_num (dbg_code.l) dbg_log_char ('\n') void panic_impl (unsigned n, const char *line, char const *name, char const *message): diff --git a/source/buzzer.ccp b/source/#buzzer.ccp similarity index 99% rename from source/buzzer.ccp rename to source/#buzzer.ccp index 7fdcef4..7837a94 100644 --- a/source/buzzer.ccp +++ b/source/#buzzer.ccp @@ -53,7 +53,7 @@ enum codes: BUZZER = 32 Kernel::Num start (): - Kernel::schedule () + kdebug ("buzzer started.\n") map_tcu () DevBuzzer buzzer diff --git a/source/gpio.ccp b/source/#gpio.ccp similarity index 99% rename from source/gpio.ccp rename to source/#gpio.ccp index b46815d..d89ddf2 100644 --- a/source/gpio.ccp +++ b/source/#gpio.ccp @@ -253,7 +253,6 @@ enum codes: PWM Kernel::Num start (): - Kernel::schedule () map_gpio () map_pwm0 () diff --git a/source/lcd.ccp b/source/#lcd.ccp similarity index 100% rename from source/lcd.ccp rename to source/#lcd.ccp diff --git a/source/nanonote-gpio.ccp b/source/#nanonote-gpio.ccp similarity index 99% rename from source/nanonote-gpio.ccp rename to source/#nanonote-gpio.ccp index f747150..521bdfb 100644 --- a/source/nanonote-gpio.ccp +++ b/source/#nanonote-gpio.ccp @@ -195,7 +195,6 @@ enum codes: PWR Kernel::Num start (): - Kernel::schedule () map_gpio () DevKbd kbd diff --git a/source/crt0.ccp b/source/crt0.ccp index 70e0c12..3ae67fb 100644 --- a/source/crt0.ccp +++ b/source/crt0.ccp @@ -122,7 +122,8 @@ extern "C": while true: *(volatile unsigned *)~0 -__asm__ volatile ("\t.globl __start\n" +__asm__ volatile ("\t.text\n" + "\t.globl __start\n" "\t.set noreorder\n" "__start:\n" "\tbal 1f\n" diff --git a/source/metronome.ccp b/source/metronome.ccp index f02eb64..6bde23f 100644 --- a/source/metronome.ccp +++ b/source/metronome.ccp @@ -20,7 +20,6 @@ #include "keys.hh" Kernel::Num start (): - Kernel::schedule () Buzzer buzzer = Kernel::my_parent.get_device () Keyboard kbd = Kernel::my_parent.get_device () Kernel::Cap key = Kernel::my_receiver.create_capability (0)