libn64: Reorganize headers/files.
authorTyler J. Stachecki <stachecki.tyler@gmail.com>
Sun, 4 Jun 2017 02:17:31 +0000 (22:17 -0400)
committerTyler J. Stachecki <stachecki.tyler@gmail.com>
Sun, 9 Jul 2017 15:04:41 +0000 (11:04 -0400)
Split private headers away from the include directory taht
the user touches. We don't need to expose the definitions
for threads and stuff to the user.

Signed-off-by: Tyler J. Stachecki <stachecki.tyler@gmail.com>
24 files changed:
libn64/Makefile
libn64/include/fbtext.h [new file with mode: 0644]
libn64/include/os/fbtext.h [deleted file]
libn64/include/os/kthread.h [deleted file]
libn64/include/os/mm.h [deleted file]
libn64/include/os/panic.h [deleted file]
libn64/include/os/syscall.h [deleted file]
libn64/include/os/thread.h [deleted file]
libn64/include/os/thread_queue.h [deleted file]
libn64/include/os/thread_table.h [deleted file]
libn64/include/syscall.h [new file with mode: 0644]
libn64/os/asm/exception.s
libn64/os/asm/syscall.s
libn64/os/asm/thread.s [deleted file]
libn64/os/fbtext.c
libn64/os/main.c
libn64/os/panic.c
libn64/priv_include/os/kthread.h [new file with mode: 0644]
libn64/priv_include/os/mm.h [new file with mode: 0644]
libn64/priv_include/os/panic.h [new file with mode: 0644]
libn64/priv_include/os/thread.h [new file with mode: 0644]
libn64/priv_include/os/thread_queue.h [new file with mode: 0644]
libn64/priv_include/os/thread_table.h [new file with mode: 0644]
threadtest/src/main.c

index c5c136d..69dcf89 100644 (file)
@@ -20,7 +20,7 @@ AS = $(call FIXPATH,$(CURDIR)/../tools/bin/mips64-elf-as)
 AR = $(call FIXPATH,$(CURDIR)/../tools/bin/mips64-elf-gcc-ar)
 CC = $(call FIXPATH,$(CURDIR)/../tools/bin/mips64-elf-gcc)
 
-CFLAGS = -Wall -Wextra -pedantic -std=c99 -I. -Iinclude
+CFLAGS = -Wall -Wextra -pedantic -std=c99 -I. -Iinclude -Ipriv_include
 OPTFLAGS = -Os -march=vr4300 -mabi=eabi -mgp32 -mlong32 \
        -flto -ffat-lto-objects -ffunction-sections -fdata-sections \
        -G4 -mno-extern-sdata -mgpopt
@@ -30,7 +30,6 @@ ASMFILES = $(call FIXPATH,\
        os/asm/context.s \
        os/asm/exception.s \
        os/asm/syscall.s \
-       os/asm/thread.s \
 )
 
 CFILES = $(call FIXPATH,\
diff --git a/libn64/include/fbtext.h b/libn64/include/fbtext.h
new file mode 100644 (file)
index 0000000..015c00a
--- /dev/null
@@ -0,0 +1,59 @@
+//
+// libn64/include/fbtext.h: Framebuffer text routines.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#ifndef LIBN64_FBTEXT_H
+#define LIBN64_FBTEXT_H
+
+#include <libn64.h>
+#include <stdint.h>
+
+#define LIBN64_FBTEXT_COLOR_BG 0
+#define LIBN64_FBTEXT_COLOR_FG 1
+
+#define LIBN64_FBTEXT_COLOR_BLACK (0)
+#define LIBN64_FBTEXT_COLOR_WHITE (~0)
+
+enum libn64_fbtext_mode {
+  LIBN64_FBTEXT_16BPP,
+  LIBN64_FBTEXT_32BPP
+};
+
+struct libn64_fbtext_context {
+  unsigned (*render_char)(const struct libn64_fbtext_context *, uint32_t, char);
+
+  uint32_t colors[2];
+  uint32_t fb_origin;
+  uint16_t fb_width;
+  uint8_t x, y;
+};
+
+// Initializes a framebuffer text rendering component.
+//
+// The framebuffer origin must be in the form of a physical
+// address and aligned to 16 bytes (i.e., 0x100000 = FB @ 1MiB)
+// The framebuffer width should be specified in terms of pixels.
+libn64func
+void libn64_fbtext_init(struct libn64_fbtext_context *context,
+    uint32_t fb_origin, uint32_t fg_color, uint32_t bg_color,
+    uint16_t fb_width, enum libn64_fbtext_mode mode);
+
+// Methods for rendering values to the framebuffer at the context's current
+// x and y position. Handles escape characters. Currently will write past the
+// end of the framebuffer instead of scrolling it up (as probably expected).
+libn64func
+void libn64_fbtext_puts(struct libn64_fbtext_context *context,
+    const char *string);
+
+libn64func
+void libn64_fbtext_putu32(struct libn64_fbtext_context *context,
+    uint32_t u32);
+
+#endif
+
diff --git a/libn64/include/os/fbtext.h b/libn64/include/os/fbtext.h
deleted file mode 100644 (file)
index b63701f..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-//
-// libn64/include/os/fbtext.h: Framebuffer text routines.
-//
-// n64chain: A (free) open-source N64 development toolchain.
-// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-//
-// This file is subject to the terms and conditions defined in
-// 'LICENSE', which is part of this source code package.
-//
-
-#ifndef LIBN64_INCLUDE_OS_FBTEXT_H
-#define LIBN64_INCLUDE_OS_FBTEXT_H
-
-#include <libn64.h>
-#include <stdint.h>
-
-#define LIBN64_FBTEXT_COLOR_BG 0
-#define LIBN64_FBTEXT_COLOR_FG 1
-
-#define LIBN64_FBTEXT_COLOR_BLACK (0)
-#define LIBN64_FBTEXT_COLOR_WHITE (~0)
-
-enum libn64_fbtext_mode {
-  LIBN64_FBTEXT_16BPP,
-  LIBN64_FBTEXT_32BPP
-};
-
-struct libn64_fbtext_context {
-  unsigned (*render_char)(const struct libn64_fbtext_context *, uint32_t, char);
-
-  uint32_t colors[2];
-  uint32_t fb_origin;
-  uint16_t fb_width;
-  uint8_t x, y;
-};
-
-// Initializes a framebuffer text rendering component.
-//
-// The framebuffer origin must be in the form of a physical
-// address and aligned to 16 bytes (i.e., 0x100000 = FB @ 1MiB)
-// The framebuffer width should be specified in terms of pixels.
-libn64func
-void libn64_fbtext_init(struct libn64_fbtext_context *context,
-    uint32_t fb_origin, uint32_t fg_color, uint32_t bg_color,
-    uint16_t fb_width, enum libn64_fbtext_mode mode);
-
-// Methods for rendering values to the framebuffer at the context's current
-// x and y position. Handles escape characters. Currently will write past the
-// end of the framebuffer instead of scrolling it up (as probably expected).
-libn64func
-void libn64_fbtext_puts(struct libn64_fbtext_context *context,
-    const char *string);
-
-libn64func
-void libn64_fbtext_putu32(struct libn64_fbtext_context *context,
-    uint32_t u32);
-
-#endif
-
diff --git a/libn64/include/os/kthread.h b/libn64/include/os/kthread.h
deleted file mode 100644 (file)
index 730cceb..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// libn64/include/os/kthread.h: libn64 kernel thread.
-//
-// n64chain: A (free) open-source N64 development toolchain.
-// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-//
-// This file is subject to the terms and conditions defined in
-// 'LICENSE', which is part of this source code package.
-//
-
-#include <libn64.h>
-
-#ifndef LIBN64_INCLUDE_OS_KTHREAD_H
-#define LIBN64_INCLUDE_OS_KTHREAD_H
-
-libn64func __attribute__((noreturn))
-void libn64_kthread(void);
-
-#endif
-
diff --git a/libn64/include/os/mm.h b/libn64/include/os/mm.h
deleted file mode 100644 (file)
index a0afc5f..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-//
-// libn64/include/os/mm.h: OS memory manager definitions.
-//
-// n64chain: A (free) open-source N64 development toolchain.
-// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-//
-// This file is subject to the terms and conditions defined in
-// 'LICENSE', which is part of this source code package.
-//
-
-#ifndef LIBN64_INCLUDE_OS_MM_H
-#define LIBN64_INCLUDE_OS_MM_H
-
-#include <stdint.h>
-
-// The RDRAM modules are organized as (up to) 8 banks of 1MB each.
-// The smallest 'block' of memory that libn64 works on is a 4kB page.
-// This makes for about 256 * 4KB pages per bank of RDRAM.
-typedef uint16_t libn64_mm_page_list[8][256];
-
-struct libn64_mm {
-  uint16_t free_page_idxs[8];
-} __attribute__((aligned(16)));
-
-// Initializes the memory management (mm) subsystem.
-libn64func
-void libn64_mm_init(uint32_t physmem_bottom, uint32_t physmem_top);
-
-#endif
-
diff --git a/libn64/include/os/panic.h b/libn64/include/os/panic.h
deleted file mode 100644 (file)
index 681d882..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-//
-// libn64/include/os/panic.h: Fatal crash handler.
-//
-// n64chain: A (free) open-source N64 development toolchain.
-// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-//
-// This file is subject to the terms and conditions defined in
-// 'LICENSE', which is part of this source code package.
-//
-
-#ifndef LIBN64_INCLUDE_OS_PANIC_H
-#define LIBN64_INCLUDE_OS_PANIC_H
-
-#include <libn64.h>
-#include <os/thread.h>
-
-libn64func __attribute__((noreturn))
-void libn64_panic_from_isr(void);
-
-#endif
-
diff --git a/libn64/include/os/syscall.h b/libn64/include/os/syscall.h
deleted file mode 100644 (file)
index 03ca9d3..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// libn64/include/os/syscall.h: System call definitions.
-//
-// n64chain: A (free) open-source N64 development toolchain.
-// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-//
-// This file is subject to the terms and conditions defined in
-// 'LICENSE', which is part of this source code package.
-//
-
-#ifndef LIBN64_INCLUDE_OS_SYSCALL_H
-#define LIBN64_INCLUDE_OS_SYSCALL_H
-
-// Syscall numbers.
-#define LIBN64_SYSCALL_CREATE_THREAD 0
-#define LIBN64_SYSCALL_EXIT_THREAD   1
-#define LIBN64_SYSCALL_PAGE_ALLOC    2
-#define LIBN64_SYSCALL_PAGE_FREE     3
-#define LIBN64_SYSCALL_INVALID       4
-
-#ifndef __ASSEMBLER__
-
-// Spawns a new thread with a given priority (which receives arg). If
-// the new thread has a higher priority than the current thread, a
-// context switch will result from this function call.
-//
-// If an insufficient number of threads are available (due to a hard
-// limit, or if too many threads are waiting to be reaped), a non-zero
-// value is returned. Otherwise, zero is returned to indicate success.
-libn64func __attribute__((always_inline))
-static inline int libn64_thread_create(void (*entrypoint)(void *),
-    void *arg, unsigned priority) {
-  register uint32_t rv __asm__("$v0");
-  register void (*a0)(void *) __asm__("$a0") = entrypoint;
-  register void *a1 __asm__("$a1") = arg;
-  register unsigned a2 __asm__("$a2") = priority;
-
-  __asm__ __volatile__(
-    ".set noreorder\n\t"
-    ".set noat\n\t"
-    "li $at, %4\n\t"
-    "syscall\n\t"
-    ".set reorder\n\t"
-    ".set at\n\t"
-
-    : "=r" (rv)
-    : "r" (a0), "r" (a1), "r" (a2), "K" (LIBN64_SYSCALL_CREATE_THREAD)
-    : "memory"
-  );
-
-  return rv;
-}
-
-// Terminates the currently running thread.
-libn64func __attribute__((always_inline)) __attribute__((noreturn))
-static inline void libn64_thread_exit(void) {
-  __asm__ __volatile__(
-    ".set noreorder\n\t"
-    ".set noat\n\t"
-    "li $at, %0\n\t"
-    "syscall\n\t"
-    ".set reorder\n\t"
-    ".set at\n\t"
-
-    :: "K" (LIBN64_SYSCALL_EXIT_THREAD)
-    : "memory"
-  );
-
-  __builtin_unreachable();
-}
-
-// Allocates a page (4kB) of memory. If there are no available/free pages in
-// the page allocator, then a fatal exception is raised as a result.
-libn64func __attribute__((always_inline))
-static inline void *libn64_page_alloc(void) {
-  void *p;
-
-  __asm__ __volatile__(
-    ".set noreorder\n\t"
-    ".set noat\n\t"
-    "li $at, %1\n\t"
-    "syscall\n\t"
-    "addu %0, $at, $zero\n\t"
-    ".set reorder\n\t"
-    ".set at\n\t"
-
-    : "=r"(p)
-    : "K" (LIBN64_SYSCALL_PAGE_ALLOC)
-    : "memory"
-  );
-
-  return p;
-}
-
-// Frees a page of memory allocated with libn64_page_alloc().
-libn64func __attribute__((always_inline))
-static inline void libn64_page_free(void *p) {
-  register void *a0 __asm__("$a0") = p;
-
-  __asm__ __volatile__(
-    ".set noreorder\n\t"
-    ".set noat\n\t"
-    "li $at, %1\n\t"
-    "syscall\n\t"
-    ".set reorder\n\t"
-    ".set at\n\t"
-
-    :: "r" (a0), "K" (LIBN64_SYSCALL_PAGE_FREE)
-    : "memory"
-  );
-}
-
-#endif
-#endif
-
diff --git a/libn64/include/os/thread.h b/libn64/include/os/thread.h
deleted file mode 100644 (file)
index 8d0062d..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// libn64/include/os/thread.h: OS thread definitions.
-//
-// n64chain: A (free) open-source N64 development toolchain.
-// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-//
-// This file is subject to the terms and conditions defined in
-// 'LICENSE', which is part of this source code package.
-//
-
-#ifndef LIBN64_INCLUDE_OS_THREAD_H
-#define LIBN64_INCLUDE_OS_THREAD_H
-
-#include <stdint.h>
-
-#define LIBN64_THREAD_MIN_PRIORITY 0
-
-struct libn64_thread_state {
-  uint32_t regs[32];
-
-  uint32_t cp0_status;
-  uint32_t cp0_entryhi;
-  uint32_t cp1_control;
-  uint32_t mi_intr_reg;
-
-  uint64_t fp_regs[32];
-} __attribute__((aligned(16)));
-
-struct libn64_thread {
-  struct libn64_thread_state state;
-
-  unsigned priority;
-  uint32_t unused[11];
-
-  uint16_t stack_pte[32];
-};
-
-// Initializes the threading subsystem.
-libn64func
-void libn64_thread_early_init(uint32_t ram_top);
-
-#endif
-
diff --git a/libn64/include/os/thread_queue.h b/libn64/include/os/thread_queue.h
deleted file mode 100644 (file)
index b8ab5fb..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// libn64/include/os/thread_queue.h: OS thread queue definitions.
-//
-// n64chain: A (free) open-source N64 development toolchain.
-// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-//
-// This file is subject to the terms and conditions defined in
-// 'LICENSE', which is part of this source code package.
-//
-
-#ifndef LIBN64_INCLUDE_OS_THREAD_QUEUE_H
-#define LIBN64_INCLUDE_OS_THREAD_QUEUE_H
-
-#include <libn64.h>
-#include <os/thread.h>
-
-struct libn64_thread_queue_entry {
-  struct libn64_thread *thread;
-  unsigned priority;
-} __attribute__((aligned(8)));
-
-// Metadata for the queue is kept in the first 8 bytes.
-// The root of the tree also sits in the same cache line.
-struct libn64_thread_queue {
-  uint32_t count;
-
-  // This field is volatile/reserved for use by the ISR.
-  uint32_t isr_temp;
-
-  // Each queue entry is 8b and each cache line is 16b. Make
-  // sure the root is at +8b offset into the cache line so the
-  // left/right children are wholly contained within a cache
-  // line (to reduce the # of cache misses during dequeues).
-  struct libn64_thread_queue_entry heap[LIBN64_THREADS_MAX];
-} __attribute__((aligned(16)));
-
-#endif
-
diff --git a/libn64/include/os/thread_table.h b/libn64/include/os/thread_table.h
deleted file mode 100644 (file)
index cf226da..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// libn64/include/os/thread_table.h: OS thread table definitions.
-//
-// n64chain: A (free) open-source N64 development toolchain.
-// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-//
-// This file is subject to the terms and conditions defined in
-// 'LICENSE', which is part of this source code package.
-//
-
-#ifndef LIBN64_INCLUDE_OS_THREAD_TABLE_H
-#define LIBN64_INCLUDE_OS_THREAD_TABLE_H
-
-#include <libn64.h>
-#include <os/thread.h>
-#include <os/thread_queue.h>
-
-struct libn64_thread_table {
-  struct libn64_thread_queue ready_queue;
-  unsigned free_threads;
-
-  struct libn64_thread *free_list[LIBN64_THREADS_MAX];
-};
-
-#endif
-
diff --git a/libn64/include/syscall.h b/libn64/include/syscall.h
new file mode 100644 (file)
index 0000000..fde5b01
--- /dev/null
@@ -0,0 +1,116 @@
+//
+// libn64/include/syscall.h: System call definitions.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#ifndef LIBN64_INCLUDE_OS_SYSCALL_H
+#define LIBN64_INCLUDE_OS_SYSCALL_H
+
+// Syscall numbers.
+#define LIBN64_SYSCALL_CREATE_THREAD 0
+#define LIBN64_SYSCALL_EXIT_THREAD   1
+#define LIBN64_SYSCALL_PAGE_ALLOC    2
+#define LIBN64_SYSCALL_PAGE_FREE     3
+#define LIBN64_SYSCALL_INVALID       4
+
+#ifndef __ASSEMBLER__
+#include <stdint.h>
+
+// Spawns a new thread with a given priority (which receives arg). If
+// the new thread has a higher priority than the current thread, a
+// context switch will result from this function call.
+//
+// If an insufficient number of threads are available (due to a hard
+// limit, or if too many threads are waiting to be reaped), a non-zero
+// value is returned. Otherwise, zero is returned to indicate success.
+libn64func __attribute__((always_inline))
+static inline int libn64_thread_create(void (*entrypoint)(void *),
+    void *arg, unsigned priority) {
+  register uint32_t rv __asm__("$v0");
+  register void (*a0)(void *) __asm__("$a0") = entrypoint;
+  register void *a1 __asm__("$a1") = arg;
+  register unsigned a2 __asm__("$a2") = priority;
+
+  __asm__ __volatile__(
+    ".set noreorder\n\t"
+    ".set noat\n\t"
+    "li $at, %4\n\t"
+    "syscall\n\t"
+    ".set reorder\n\t"
+    ".set at\n\t"
+
+    : "=r" (rv)
+    : "r" (a0), "r" (a1), "r" (a2), "K" (LIBN64_SYSCALL_CREATE_THREAD)
+    : "memory"
+  );
+
+  return rv;
+}
+
+// Terminates the currently running thread.
+libn64func __attribute__((always_inline)) __attribute__((noreturn))
+static inline void libn64_thread_exit(void) {
+  __asm__ __volatile__(
+    ".set noreorder\n\t"
+    ".set noat\n\t"
+    "li $at, %0\n\t"
+    "syscall\n\t"
+    ".set reorder\n\t"
+    ".set at\n\t"
+
+    :: "K" (LIBN64_SYSCALL_EXIT_THREAD)
+    : "memory"
+  );
+
+  __builtin_unreachable();
+}
+
+// Allocates a page (4kB) of memory. If there are no available/free pages in
+// the page allocator, then a fatal exception is raised as a result.
+libn64func __attribute__((always_inline))
+static inline void *libn64_page_alloc(void) {
+  void *p;
+
+  __asm__ __volatile__(
+    ".set noreorder\n\t"
+    ".set noat\n\t"
+    "li $at, %1\n\t"
+    "syscall\n\t"
+    "addu %0, $at, $zero\n\t"
+    ".set reorder\n\t"
+    ".set at\n\t"
+
+    : "=r"(p)
+    : "K" (LIBN64_SYSCALL_PAGE_ALLOC)
+    : "memory"
+  );
+
+  return p;
+}
+
+// Frees a page of memory allocated with libn64_page_alloc().
+libn64func __attribute__((always_inline))
+static inline void libn64_page_free(void *p) {
+  register void *a0 __asm__("$a0") = p;
+
+  __asm__ __volatile__(
+    ".set noreorder\n\t"
+    ".set noat\n\t"
+    "li $at, %1\n\t"
+    "syscall\n\t"
+    ".set reorder\n\t"
+    ".set at\n\t"
+
+    :: "r" (a0), "K" (LIBN64_SYSCALL_PAGE_FREE)
+    : "memory"
+  );
+}
+
+#endif
+#endif
+
index 91a8d1d..fde68b0 100644 (file)
@@ -8,7 +8,7 @@
 # 'LICENSE', which is part of this source code package.
 #
 
-#include <os/syscall.h>
+#include <syscall.h>
 
 .section .text.libn64, "ax", @progbits
 
index 74bc507..d5df6b6 100644 (file)
@@ -120,6 +120,10 @@ libn64_syscall_thread_create_start_new:
   la $ra, libn64_thread_exit
   eret
 
+libn64_thread_exit:
+  addiu $at, $zero, 0x1
+  syscall
+
 .size libn64_syscall_thread_create,.-libn64_syscall_thread_create
 
 # -------------------------------------------------------------------
diff --git a/libn64/os/asm/thread.s b/libn64/os/asm/thread.s
deleted file mode 100644 (file)
index c1a17d4..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# libn64/os/asm/thread.s: libn64 thread syscalls.
-#
-# n64chain: A (free) open-source N64 development toolchain.
-# Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
-#
-# This file is subject to the terms and conditions defined in
-# 'LICENSE', which is part of this source code package.
-#
-
-#include <libn64.h>
-
-.section .text.libn64, "ax", @progbits
-
-.set noat
-.set noreorder
-
-# -------------------------------------------------------------------
-#  Terminates the actively running thread.
-# -------------------------------------------------------------------
-.global libn64_thread_exit
-.type libn64_thread_exit, @function
-.align 1
-libn64_thread_exit:
-  addiu $at, $zero, 0x1
-  syscall
-
-.size libn64_thread_exit,.-libn64_thread_exit
-
-.set at
-.set reorder
-
index 51ceaff..7d806da 100644 (file)
@@ -8,8 +8,8 @@
 // 'LICENSE', which is part of this source code package.
 //
 
+#include <fbtext.h>
 #include <libn64.h>
-#include <os/fbtext.h>
 #include <stdint.h>
 
 // Methods for rendering a character to a 16 or 32-bit RGBA framebuffer.
index 78a1164..6058f53 100644 (file)
@@ -13,8 +13,8 @@
 #include <os/mm.h>
 #include <os/thread.h>
 #include <os/thread_table.h>
-#include <os/syscall.h>
 #include <stddef.h>
+#include <syscall.h>
 
 void main(void *);
 
index 28480a1..353443f 100644 (file)
@@ -8,8 +8,8 @@
 // 'LICENSE', which is part of this source code package.
 //
 
+#include <fbtext.h>
 #include <libn64.h>
-#include <os/fbtext.h>
 #include <os/panic.h>
 #include <rcp/vi.h>
 
diff --git a/libn64/priv_include/os/kthread.h b/libn64/priv_include/os/kthread.h
new file mode 100644 (file)
index 0000000..000a9f9
--- /dev/null
@@ -0,0 +1,20 @@
+//
+// libn64/priv_include/os/kthread.h: libn64 kernel thread.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#include <libn64.h>
+
+#ifndef LIBN64_PRIV_INCLUDE_OS_KTHREAD_H
+#define LIBN64_PRIV_INCLUDE_OS_KTHREAD_H
+
+libn64func __attribute__((noreturn))
+void libn64_kthread(void);
+
+#endif
+
diff --git a/libn64/priv_include/os/mm.h b/libn64/priv_include/os/mm.h
new file mode 100644 (file)
index 0000000..7ae527b
--- /dev/null
@@ -0,0 +1,30 @@
+//
+// libn64/priv_include/os/mm.h: OS memory manager definitions.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#ifndef LIBN64_PRIV_INCLUDE_OS_MM_H
+#define LIBN64_PRIV_INCLUDE_OS_MM_H
+
+#include <stdint.h>
+
+// The RDRAM modules are organized as (up to) 8 banks of 1MB each.
+// The smallest 'block' of memory that libn64 works on is a 4kB page.
+// This makes for about 256 * 4KB pages per bank of RDRAM.
+typedef uint16_t libn64_mm_page_list[8][256];
+
+struct libn64_mm {
+  uint16_t free_page_idxs[8];
+} __attribute__((aligned(16)));
+
+// Initializes the memory management (mm) subsystem.
+libn64func
+void libn64_mm_init(uint32_t physmem_bottom, uint32_t physmem_top);
+
+#endif
+
diff --git a/libn64/priv_include/os/panic.h b/libn64/priv_include/os/panic.h
new file mode 100644 (file)
index 0000000..3140278
--- /dev/null
@@ -0,0 +1,21 @@
+//
+// libn64/priv_include/os/panic.h: Fatal crash handler.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#ifndef LIBN64_PRIV_INCLUDE_OS_PANIC_H
+#define LIBN64_PRIV_INCLUDE_OS_PANIC_H
+
+#include <libn64.h>
+#include <os/thread.h>
+
+libn64func __attribute__((noreturn))
+void libn64_panic_from_isr(void);
+
+#endif
+
diff --git a/libn64/priv_include/os/thread.h b/libn64/priv_include/os/thread.h
new file mode 100644 (file)
index 0000000..0ac4c0a
--- /dev/null
@@ -0,0 +1,43 @@
+//
+// libn64/priv_include/os/thread.h: OS thread definitions.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#ifndef LIBN64_PRIV_INCLUDE_OS_THREAD_H
+#define LIBN64_PRIV_INCLUDE_OS_THREAD_H
+
+#include <stdint.h>
+
+#define LIBN64_THREAD_MIN_PRIORITY 0
+
+struct libn64_thread_state {
+  uint32_t regs[32];
+
+  uint32_t cp0_status;
+  uint32_t cp0_entryhi;
+  uint32_t cp1_control;
+  uint32_t mi_intr_reg;
+
+  uint64_t fp_regs[32];
+} __attribute__((aligned(16)));
+
+struct libn64_thread {
+  struct libn64_thread_state state;
+
+  unsigned priority;
+  uint32_t unused[11];
+
+  uint16_t stack_pte[32];
+};
+
+// Initializes the threading subsystem.
+libn64func
+void libn64_thread_early_init(uint32_t ram_top);
+
+#endif
+
diff --git a/libn64/priv_include/os/thread_queue.h b/libn64/priv_include/os/thread_queue.h
new file mode 100644 (file)
index 0000000..6676019
--- /dev/null
@@ -0,0 +1,38 @@
+//
+// libn64/priv_include/os/thread_queue.h: OS thread queue definitions.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#ifndef LIBN64_PRIV_INCLUDE_OS_THREAD_QUEUE_H
+#define LIBN64_PRIV_INCLUDE_OS_THREAD_QUEUE_H
+
+#include <libn64.h>
+#include <os/thread.h>
+
+struct libn64_thread_queue_entry {
+  struct libn64_thread *thread;
+  unsigned priority;
+} __attribute__((aligned(8)));
+
+// Metadata for the queue is kept in the first 8 bytes.
+// The root of the tree also sits in the same cache line.
+struct libn64_thread_queue {
+  uint32_t count;
+
+  // This field is volatile/reserved for use by the ISR.
+  uint32_t isr_temp;
+
+  // Each queue entry is 8b and each cache line is 16b. Make
+  // sure the root is at +8b offset into the cache line so the
+  // left/right children are wholly contained within a cache
+  // line (to reduce the # of cache misses during dequeues).
+  struct libn64_thread_queue_entry heap[LIBN64_THREADS_MAX];
+} __attribute__((aligned(16)));
+
+#endif
+
diff --git a/libn64/priv_include/os/thread_table.h b/libn64/priv_include/os/thread_table.h
new file mode 100644 (file)
index 0000000..b6b5bc0
--- /dev/null
@@ -0,0 +1,26 @@
+//
+// libn64/priv_include/os/thread_table.h: OS thread table definitions.
+//
+// n64chain: A (free) open-source N64 development toolchain.
+// Copyright 2014-16 Tyler J. Stachecki <stachecki.tyler@gmail.com>
+//
+// This file is subject to the terms and conditions defined in
+// 'LICENSE', which is part of this source code package.
+//
+
+#ifndef LIBN64_PRIV_INCLUDE_OS_THREAD_TABLE_H
+#define LIBN64_PRIV_INCLUDE_OS_THREAD_TABLE_H
+
+#include <libn64.h>
+#include <os/thread.h>
+#include <os/thread_queue.h>
+
+struct libn64_thread_table {
+  struct libn64_thread_queue ready_queue;
+  unsigned free_threads;
+
+  struct libn64_thread *free_list[LIBN64_THREADS_MAX];
+};
+
+#endif
+
index 4ecc4df..9ec6686 100644 (file)
@@ -8,10 +8,10 @@
 // 'LICENSE', which is part of this source code package.
 //
 
-#include <os/fbtext.h>
-#include <os/syscall.h>
+#include <fbtext.h>
 #include <rcp/vi.h>
 #include <stdint.h>
+#include <syscall.h>
 
 // These pre-defined values are suitable for NTSC.
 // TODO: Add support for PAL and PAL-M televisions.