Changeset bee37cf in mainline for kernel/arch
- Timestamp:
- 2011-07-05T21:21:36Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5e2aa83, eb66f236
- Parents:
- 3714e79 (diff), f7a55f9 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- kernel/arch
- Files:
-
- 48 added
- 3 deleted
- 21 edited
- 3 moved
-
amd64/Makefile.inc (modified) (2 diffs)
-
arm32/src/mach/gta02/gta02.c (modified) (2 diffs)
-
arm32/src/mach/integratorcp/integratorcp.c (modified) (2 diffs)
-
ia32/src/boot/vesa_real.inc (modified) (1 diff)
-
ia64/src/drivers/ski.c (modified) (5 diffs)
-
mips32/Makefile.inc (modified) (1 diff)
-
mips32/include/cycle.h (modified) (1 diff)
-
mips32/include/debug.h (modified) (1 diff)
-
mips32/include/mm/frame.h (modified) (1 diff)
-
mips32/include/stack.h (modified) (1 diff)
-
mips32/src/cache.c (modified) (1 diff)
-
mips32/src/cpu/cpu.c (modified) (1 diff)
-
mips32/src/fpu_context.c (modified) (2 diffs)
-
mips32/src/mm/as.c (modified) (1 diff)
-
mips32/src/mm/tlb.c (modified) (2 diffs)
-
mips32/src/start.S (modified) (1 diff)
-
mips64/Makefile.inc (added)
-
mips64/_link.ld.in (added)
-
mips64/include/arch.h (added)
-
mips64/include/asm.h (added)
-
mips64/include/asm/boot.h (added)
-
mips64/include/asm/regname.h (added)
-
mips64/include/atomic.h (added)
-
mips64/include/barrier.h (added)
-
mips64/include/cache.h (added)
-
mips64/include/context.h (added)
-
mips64/include/context_offset.h (added)
-
mips64/include/cp0.h (added)
-
mips64/include/cpu.h (moved) (moved from uspace/srv/hid/adb_mouse/adb_mouse.h ) (3 diffs)
-
mips64/include/cycle.h (added)
-
mips64/include/debug.h (added)
-
mips64/include/debugger.h (added)
-
mips64/include/drivers/msim.h (added)
-
mips64/include/elf.h (added)
-
mips64/include/exception.h (added)
-
mips64/include/faddr.h (added)
-
mips64/include/fpu_context.h (added)
-
mips64/include/interrupt.h (moved) (moved from kernel/arch/sparc64/include/drivers/fhc.h ) (3 diffs)
-
mips64/include/istate.h (added)
-
mips64/include/mm/as.h (added)
-
mips64/include/mm/asid.h (added)
-
mips64/include/mm/frame.h (added)
-
mips64/include/mm/page.h (added)
-
mips64/include/mm/tlb.h (added)
-
mips64/include/proc/task.h (added)
-
mips64/include/proc/thread.h (added)
-
mips64/include/smp/dorder.h (added)
-
mips64/include/stack.h (added)
-
mips64/include/types.h (moved) (moved from uspace/lib/c/include/async_sess.h ) (3 diffs)
-
mips64/src/asm.S (added)
-
mips64/src/cache.c (added)
-
mips64/src/context.S (added)
-
mips64/src/cpu (added)
-
mips64/src/ddi (added)
-
mips64/src/debug (added)
-
mips64/src/debugger.c (added)
-
mips64/src/exception.c (added)
-
mips64/src/fpu_context.c (added)
-
mips64/src/interrupt.c (added)
-
mips64/src/mips64.c (added)
-
mips64/src/mm/as.c (added)
-
mips64/src/mm/frame.c (added)
-
mips64/src/mm/page.c (added)
-
mips64/src/mm/tlb.c (added)
-
mips64/src/smp/dorder.c (added)
-
mips64/src/smp/smp.c (added)
-
mips64/src/start.S (added)
-
sparc64/Makefile.inc (modified) (1 diff)
-
sparc64/include/drivers/sgcn.h (deleted)
-
sparc64/src/console.c (modified) (3 diffs)
-
sparc64/src/drivers/fhc.c (deleted)
-
sparc64/src/drivers/kbd.c (modified) (4 diffs)
-
sparc64/src/drivers/niagara.c (modified) (6 diffs)
-
sparc64/src/drivers/sgcn.c (deleted)
-
sparc64/src/drivers/tick.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/Makefile.inc
r3714e79 rbee37cf 41 41 # is fixed. 42 42 # 43 # IfGCC generates a code for tail call, instead of generating ..43 # When GCC generates a code for tail call, instead of generating .. 44 44 # 45 45 # jmp *fnc … … 48 48 # 49 49 # jmp *$fnc 50 # 51 # See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48385 for reference. 50 52 # 51 53 -
kernel/arch/arm32/src/mach/gta02/gta02.c
r3714e79 rbee37cf 158 158 { 159 159 #ifdef CONFIG_FB 160 parea_t fb_parea;161 162 160 fb_properties_t prop = { 163 161 .addr = GTA02_FB_BASE, … … 170 168 171 169 outdev_t *fb_dev = fb_init(&prop); 172 if (fb_dev) {170 if (fb_dev) 173 171 stdout_wire(fb_dev); 174 fb_parea.pbase = GTA02_FB_BASE;175 fb_parea.frames = 150;176 fb_parea.unpriv = false;177 ddi_parea_register(&fb_parea);178 }179 172 #endif 180 173 181 174 /* Initialize serial port of the debugging console. */ 182 s3c24xx_uart_io_t *scons_io; 183 184 scons_io = (void *) hw_map(GTA02_SCONS_BASE, PAGE_SIZE); 185 gta02_scons_dev = s3c24xx_uart_init(scons_io, S3C24XX_INT_UART2); 175 gta02_scons_dev = 176 s3c24xx_uart_init(GTA02_SCONS_BASE, S3C24XX_INT_UART2); 186 177 187 178 if (gta02_scons_dev) { -
kernel/arch/arm32/src/mach/integratorcp/integratorcp.c
r3714e79 rbee37cf 53 53 54 54 #define SDRAM_SIZE (sdram[((*(uint32_t *)(ICP_CMCR+ICP_SDRAMCR_OFFSET) & ICP_SDRAM_MASK) >> 2)]) 55 static parea_t fb_parea;56 55 static icp_hw_map_t icp_hw_map; 57 56 static irq_t icp_timer_irq; … … 296 295 297 296 outdev_t *fbdev = fb_init(&prop); 298 if (fbdev) {297 if (fbdev) 299 298 stdout_wire(fbdev); 300 fb_parea.pbase = ICP_FB;301 fb_parea.frames = 300;302 fb_parea.unpriv = false;303 ddi_parea_register(&fb_parea);304 }305 299 #endif 306 300 } -
kernel/arch/ia32/src/boot/vesa_real.inc
r3714e79 rbee37cf 154 154 mov $e_vesa_init - vesa_init, %di 155 155 push %di 156 /* Write the "VBE2" signature into the info structure in order 157 * to get proper mode information. The presence of "VBE2" 158 * indicates two things: 159 * 160 * - VBE controller information structure is expected to be 161 * 512 bytes long instead of 256 bytes. 162 * - The BIOS should report VBE 3.0 information (potentially 163 * including non-standard modes in the mode list). 164 */ 165 movl $0x32454256, (%di) 156 166 int $0x10 157 167 -
kernel/arch/ia64/src/drivers/ski.c
r3714e79 rbee37cf 57 57 }; 58 58 59 static void ski_putchar(outdev_t *, const wchar_t , bool);59 static void ski_putchar(outdev_t *, const wchar_t); 60 60 61 61 static outdev_operations_t skidev_ops = { … … 99 99 static void poll_keyboard(ski_instance_t *instance) 100 100 { 101 if (silent)102 return;103 104 101 int count = POLL_LIMIT; 105 102 … … 121 118 122 119 while (true) { 123 if (!silent) 120 // TODO FIXME: 121 // This currently breaks the kernel console 122 // before we get the override from uspace. 123 if (console_override) 124 124 poll_keyboard(instance); 125 125 … … 182 182 * @param dev Character device. 183 183 * @param ch Character to be printed. 184 * @param silent Whether the output should be silenced. 185 * 186 */ 187 static void ski_putchar(outdev_t *dev, const wchar_t ch, bool silent) 188 { 189 if (!silent) { 184 * 185 */ 186 static void ski_putchar(outdev_t *dev, const wchar_t ch) 187 { 188 // TODO FIXME: 189 // This currently breaks the kernel console 190 // before we get the override from uspace. 191 if (console_override) { 190 192 if (ascii_check(ch)) { 191 193 if (ch == '\n') … … 213 215 if (!fb_exported) { 214 216 /* 215 * This is the necessary evil until the userspace driver is entirely 217 * This is the necessary evil until 218 * the userspace driver is entirely 216 219 * self-sufficient. 217 220 */ -
kernel/arch/mips32/Makefile.inc
r3714e79 rbee37cf 29 29 BFD_ARCH = mips 30 30 BFD = binary 31 GCC_CFLAGS += -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 31 GCC_CFLAGS += -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 -mabi=32 32 32 33 33 BITS = 32 -
kernel/arch/mips32/include/cycle.h
r3714e79 rbee37cf 27 27 */ 28 28 29 /** @addtogroup mips 229 /** @addtogroup mips32 30 30 * @{ 31 31 */ -
kernel/arch/mips32/include/debug.h
r3714e79 rbee37cf 34 34 35 35 #ifndef KERN_mips32_DEBUG_H_ 36 #define KERN_mips 23_DEBUG_H_36 #define KERN_mips32_DEBUG_H_ 37 37 38 38 /** Enter the simulator trace mode */ -
kernel/arch/mips32/include/mm/frame.h
r3714e79 rbee37cf 42 42 #ifndef __ASM__ 43 43 44 #include <typedefs.h>45 46 44 extern void frame_arch_init(void); 47 45 extern void physmem_print(void); -
kernel/arch/mips32/include/stack.h
r3714e79 rbee37cf 39 39 #define STACK_ALIGNMENT 8 40 40 41 #define STACK_ARG0 042 #define STACK_ARG1 443 #define STACK_ARG2 844 #define STACK_ARG3 1245 #define STACK_ARG4 1646 #define STACK_ARG5 2047 #define STACK_ARG6 2448 49 41 #endif 50 42 -
kernel/arch/mips32/src/cache.c
r3714e79 rbee37cf 27 27 */ 28 28 29 /** @addtogroup mips32 29 /** @addtogroup mips32 30 30 * @{ 31 31 */ -
kernel/arch/mips32/src/cpu/cpu.c
r3714e79 rbee37cf 37 37 #include <arch.h> 38 38 #include <arch/cp0.h> 39 #include <print.h> 39 #include <print.h> 40 40 41 41 struct data_t { -
kernel/arch/mips32/src/fpu_context.c
r3714e79 rbee37cf 27 27 */ 28 28 29 /** @addtogroup mips32 29 /** @addtogroup mips32 30 30 * @{ 31 31 */ … … 40 40 41 41 void fpu_disable(void) 42 { 42 { 43 43 #ifdef CONFIG_FPU 44 44 cp0_status_write(cp0_status_read() & ~cp0_status_fpu_bit); -
kernel/arch/mips32/src/mm/as.c
r3714e79 rbee37cf 61 61 /* 62 62 * Install ASID. 63 */ 63 */ 64 64 hi.value = cp0_entry_hi_read(); 65 65 66 66 hi.asid = as->asid; 67 cp0_entry_hi_write(hi.value); 67 cp0_entry_hi_write(hi.value); 68 68 } 69 69 -
kernel/arch/mips32/src/mm/tlb.c
r3714e79 rbee37cf 73 73 tlbwi(); 74 74 } 75 75 76 76 /* 77 77 * The kernel is going to make use of some wired … … 386 386 ASSERT(pte->w || access != PF_ACCESS_WRITE); 387 387 return pte; 388 break;389 388 case AS_PF_DEFER: 390 389 *pfrc = AS_PF_DEFER; 391 390 return NULL; 392 break;393 391 case AS_PF_FAULT: 394 392 *pfrc = AS_PF_FAULT; 395 393 return NULL; 396 break;397 394 default: 398 395 panic("Unexpected rc (%d).", rc); -
kernel/arch/mips32/src/start.S
r3714e79 rbee37cf 222 222 223 223 /* move $k0 pointer to kernel stack */ 224 lui $k0, %hi(supervisor_sp) 225 ori $k0, $k0, %lo(supervisor_sp) 224 la $k0, supervisor_sp 226 225 227 226 /* move $k0 (supervisor_sp) */ -
kernel/arch/mips64/include/cpu.h
r3714e79 rbee37cf 1 1 /* 2 * Copyright (c) 20 10 Jiri Svoboda2 * Copyright (c) 2003-2004 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup mouse 30 * @brief 29 /** @addtogroup mips64 31 30 * @{ 32 31 */ … … 34 33 */ 35 34 36 #ifndef ADB_MOUSE_H_37 #define ADB_MOUSE_H_35 #ifndef KERN_mips64_CPU_H_ 36 #define KERN_mips64_CPU_H_ 38 37 39 #include <sys/types.h> 38 #include <typedefs.h> 39 #include <arch/asm.h> 40 40 41 #define NAME "adb_ms" 42 #define NAMESPACE "hid_in" 43 44 extern void mouse_handle_data(uint16_t);41 typedef struct { 42 uint32_t imp_num; 43 uint32_t rev_num; 44 } cpu_arch_t; 45 45 46 46 #endif 47 47 48 /** 49 * @} 48 /** @} 50 49 */ -
kernel/arch/mips64/include/interrupt.h
r3714e79 rbee37cf 1 1 /* 2 * Copyright (c) 200 6Jakub Jermar2 * Copyright (c) 2003-2004 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup sparc6429 /** @addtogroup mips64 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef KERN_ sparc64_FHC_H_36 #define KERN_ sparc64_FHC_H_35 #ifndef KERN_mips64_INTERRUPT_H_ 36 #define KERN_mips64_INTERRUPT_H_ 37 37 38 38 #include <typedefs.h> 39 #include < genarch/ofw/ofw_tree.h>39 #include <arch/exception.h> 40 40 41 typedef struct { 42 volatile uint32_t *uart_imap; 43 } fhc_t; 41 #define IVT_ITEMS 32 42 #define IVT_FIRST 0 44 43 45 extern fhc_t *central_fhc; 44 #define VECTOR_TLB_SHOOTDOWN_IPI EXC_Int 46 45 47 extern fhc_t *fhc_init(ofw_tree_node_t *); 48 extern void fhc_enable_interrupt(fhc_t *, int); 49 extern void fhc_clear_interrupt(void *, int); 46 extern function virtual_timer_fnc; 47 extern uint32_t count_hi; 48 49 extern void interrupt_init(void); 50 50 51 51 #endif -
kernel/arch/mips64/include/types.h
r3714e79 rbee37cf 1 1 /* 2 * Copyright (c) 20 10Jakub Jermar2 * Copyright (c) 2003-2004 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup libc29 /** @addtogroup mips64 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef LIBC_ASYNC_SESS_H_36 #define LIBC_ASYNC_SESS_H_35 #ifndef KERN_mips64_TYPES_H_ 36 #define KERN_mips64_TYPES_H_ 37 37 38 #include <adt/list.h> 38 typedef uint64_t size_t; 39 typedef int64_t ssize_t; 40 41 typedef uint64_t uintptr_t; 42 typedef uint64_t pfn_t; 43 44 typedef uint64_t ipl_t; 45 46 typedef uint64_t sysarg_t; 47 typedef int64_t native_t; 48 typedef uint64_t atomic_count_t; 39 49 40 50 typedef struct { 41 int sess_phone; /**< Phone for cloning off the connections. */ 42 sysarg_t connect_arg1; /**< Argument for CONNECT_ME_TO. */ 43 link_t conn_head; /**< List of open data connections. */ 44 link_t sess_link; /**< Link in global list of open sessions. */ 45 } async_sess_t; 51 } fncptr_t; 46 52 47 extern void async_session_create(async_sess_t *, int, sysarg_t); 48 extern void async_session_destroy(async_sess_t *); 49 extern int async_exchange_begin(async_sess_t *); 50 extern void async_exchange_end(async_sess_t *, int); 53 #define INTN_C(c) INT64_C(c) 54 #define UINTN_C(c) UINT64_C(c) 55 56 #define PRIdn PRId64 /**< Format for native_t. */ 57 #define PRIun PRIu64 /**< Format for sysarg_t. */ 58 #define PRIxn PRIx64 /**< Format for hexadecimal sysarg_t. */ 59 #define PRIua PRIu64 /**< Format for atomic_count_t. */ 51 60 52 61 #endif -
kernel/arch/sparc64/Makefile.inc
r3714e79 rbee37cf 84 84 arch/$(KARCH)/src/drivers/tick.c \ 85 85 arch/$(KARCH)/src/drivers/kbd.c \ 86 arch/$(KARCH)/src/drivers/sgcn.c \87 86 arch/$(KARCH)/src/drivers/pci.c \ 88 arch/$(KARCH)/src/drivers/fhc.c \89 87 arch/$(KARCH)/src/trap/$(USARCH)/interrupt.c 90 88 -
kernel/arch/sparc64/src/console.c
r3714e79 rbee37cf 38 38 #include <arch/drivers/scr.h> 39 39 #include <arch/drivers/kbd.h> 40 #include <arch/drivers/sgcn.h>41 40 #include <genarch/srln/srln.h> 42 41 #include <console/chardev.h> … … 89 88 } 90 89 91 /** Initilize I/O on the Serengeti machine. */92 static void serengeti_init(void)93 {94 #ifdef CONFIG_SGCN_KBD95 sgcn_instance_t *sgcn_instance = sgcnin_init();96 if (sgcn_instance) {97 srln_instance_t *srln_instance = srln_init();98 if (srln_instance) {99 indev_t *sink = stdin_wire();100 indev_t *srln = srln_wire(srln_instance, sink);101 sgcnin_wire(sgcn_instance, srln);102 }103 }104 #endif105 106 #ifdef CONFIG_SGCN_PRN107 outdev_t *sgcndev = sgcnout_init();108 if (sgcndev)109 stdout_wire(sgcndev);110 #endif111 }112 113 90 /** 114 91 * Initialize input/output. Auto-detects the type of machine … … 127 104 prop = ofw_tree_getprop(aliases, "def-cn"); 128 105 129 if ((!prop) || (!prop->value) || (str_cmp(prop->value, "/sgcn") != 0)) {106 if ((!prop) || (!prop->value)) 130 107 standard_console_init(aliases); 131 } else {132 serengeti_init();133 }134 108 } 135 109 -
kernel/arch/sparc64/src/drivers/kbd.c
r3714e79 rbee37cf 35 35 #include <arch/drivers/kbd.h> 36 36 #include <genarch/ofw/ofw_tree.h> 37 #include <genarch/ofw/fhc.h>38 37 #include <genarch/ofw/ebus.h> 39 38 #include <console/console.h> … … 51 50 #endif 52 51 53 #ifdef CONFIG_Z853054 #include <genarch/drivers/z8530/z8530.h>55 #endif56 57 52 #ifdef CONFIG_NS16550 58 53 #include <genarch/drivers/ns16550/ns16550.h> … … 60 55 61 56 #ifdef CONFIG_SUN_KBD 62 63 #ifdef CONFIG_Z853064 65 static bool kbd_z8530_init(ofw_tree_node_t *node)66 {67 const char *name = ofw_tree_node_name(node);68 69 if (str_cmp(name, "zs") != 0)70 return false;71 72 /*73 * Read 'interrupts' property.74 */75 ofw_tree_property_t *prop = ofw_tree_getprop(node, "interrupts");76 if ((!prop) || (!prop->value)) {77 printf("z8530: Unable to find interrupts property\n");78 return false;79 }80 81 uint32_t interrupts = *((uint32_t *) prop->value);82 83 /*84 * Read 'reg' property.85 */86 prop = ofw_tree_getprop(node, "reg");87 if ((!prop) || (!prop->value)) {88 printf("z8530: Unable to find reg property\n");89 return false;90 }91 92 size_t size = ((ofw_fhc_reg_t *) prop->value)->size;93 94 uintptr_t pa;95 if (!ofw_fhc_apply_ranges(node->parent,96 ((ofw_fhc_reg_t *) prop->value), &pa)) {97 printf("z8530: Failed to determine address\n");98 return false;99 }100 101 inr_t inr;102 cir_t cir;103 void *cir_arg;104 if (!ofw_fhc_map_interrupt(node->parent,105 ((ofw_fhc_reg_t *) prop->value), interrupts, &inr, &cir,106 &cir_arg)) {107 printf("z8530: Failed to determine interrupt\n");108 return false;109 }110 111 /*112 * We need to pass aligned address to hw_map().113 * However, the physical keyboard address can114 * be pretty much unaligned, depending on the115 * underlying controller.116 */117 uintptr_t aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE);118 size_t offset = pa - aligned_addr;119 120 z8530_t *z8530 = (z8530_t *)121 (hw_map(aligned_addr, offset + size) + offset);122 123 z8530_instance_t *z8530_instance = z8530_init(z8530, inr, cir, cir_arg);124 if (z8530_instance) {125 kbrd_instance_t *kbrd_instance = kbrd_init();126 if (kbrd_instance) {127 indev_t *sink = stdin_wire();128 indev_t *kbrd = kbrd_wire(kbrd_instance, sink);129 z8530_wire(z8530_instance, kbrd);130 }131 }132 133 /*134 * This is the necessary evil until the userspace drivers are135 * entirely self-sufficient.136 */137 sysinfo_set_item_val("kbd", NULL, true);138 sysinfo_set_item_val("kbd.inr", NULL, inr);139 sysinfo_set_item_val("kbd.address.kernel", NULL,140 (uintptr_t) z8530);141 sysinfo_set_item_val("kbd.address.physical", NULL, pa);142 sysinfo_set_item_val("kbd.type.z8530", NULL, true);143 144 return true;145 }146 147 #endif /* CONFIG_Z8530 */148 57 149 58 #ifdef CONFIG_NS16550 … … 243 152 void kbd_init(ofw_tree_node_t *node) 244 153 { 245 #ifdef CONFIG_Z8530246 kbd_z8530_init(node);247 #endif248 249 154 #ifdef CONFIG_NS16550 250 155 kbd_ns16550_init(node); -
kernel/arch/sparc64/src/drivers/niagara.c
r3714e79 rbee37cf 32 32 /** 33 33 * @file 34 * @brief Niagara input/output driver based on hypervisor calls.34 * @brief Niagara input/output driver based on hypervisor calls. 35 35 */ 36 36 … … 52 52 #include <genarch/srln/srln.h> 53 53 54 /* polling interval in miliseconds */54 /* Polling interval in miliseconds */ 55 55 #define POLL_INTERVAL 10000 56 56 57 /* device instance */57 /* Device instance */ 58 58 static niagara_instance_t *instance = NULL; 59 59 60 static void niagara_putchar(outdev_t *, const wchar_t , bool);61 62 /** character device operations */60 static void niagara_putchar(outdev_t *, const wchar_t); 61 62 /** Character device operations */ 63 63 static outdev_operations_t niagara_ops = { 64 64 .write = niagara_putchar, … … 66 66 }; 67 67 68 /* 68 /** 69 69 * The driver uses hypercalls to print characters to the console. Since the 70 70 * hypercall cannot be performed from the userspace, we do this: 71 * The kernel "little brother" driver (which will be present no matter what the 72 * DDI architecture is - as we need the kernel part for the kconsole) 71 * 72 * The kernel "little brother" driver (which will be present no matter what 73 * the DDI architecture is -- as we need the kernel part for the kconsole) 73 74 * defines a shared buffer. Kernel walks through the buffer (in the same thread 74 75 * which is used for polling the keyboard) and prints any pending characters 75 * to the console (using hypercalls). The userspace fb server maps this shared 76 * buffer to its address space and output operation it does is performed using 77 * the mapped buffer. The shared buffer definition follows. 78 */ 79 #define OUTPUT_BUFFER_SIZE ((PAGE_SIZE) - 2 * 8) 76 * to the console (using hypercalls). 77 * 78 * The userspace fb server maps this shared buffer to its address space and 79 * output operation it does is performed using the mapped buffer. The shared 80 * buffer definition follows. 81 */ 82 #define OUTPUT_BUFFER_SIZE ((PAGE_SIZE) - 2 * 8) 83 80 84 static volatile struct { 81 85 uint64_t read_ptr; 82 86 uint64_t write_ptr; 83 87 char data[OUTPUT_BUFFER_SIZE]; 84 } 85 __attribute__ ((packed)) 86 __attribute__ ((aligned(PAGE_SIZE))) 87 output_buffer; 88 } __attribute__ ((packed)) __attribute__ ((aligned(PAGE_SIZE))) output_buffer; 89 90 static parea_t outbuf_parea; 88 91 89 92 /** 90 93 * Analogous to the output_buffer, see the previous definition. 91 94 */ 92 #define INPUT_BUFFER_SIZE ((PAGE_SIZE) - 2 * 8) 95 #define INPUT_BUFFER_SIZE ((PAGE_SIZE) - 2 * 8) 96 93 97 static volatile struct { 94 98 uint64_t write_ptr; 95 99 uint64_t read_ptr; 96 100 char data[INPUT_BUFFER_SIZE]; 97 } 98 __attribute__ ((packed)) 99 __attribute__ ((aligned(PAGE_SIZE))) 100 input_buffer; 101 102 103 /** Writes a single character to the standard output. */ 101 } __attribute__ ((packed)) __attribute__ ((aligned(PAGE_SIZE))) input_buffer; 102 103 static parea_t inbuf_parea; 104 105 /** Write a single character to the standard output. */ 104 106 static inline void do_putchar(const char c) { 105 /* repeat until the buffer is non-full */ 106 while (__hypercall_fast1(CONS_PUTCHAR, c) == HV_EWOULDBLOCK) 107 ; 108 } 109 110 /** Writes a single character to the standard output. */ 111 static void niagara_putchar(outdev_t *dev, const wchar_t ch, bool silent) 112 { 113 if (silent) 114 return; 115 116 do_putchar(ch); 117 if (ch == '\n') 118 do_putchar('\r'); 119 } 120 121 /** 122 * Function regularly called by the keyboard polling thread. Asks the 123 * hypervisor whether there is any unread character. If so, it picks it up 124 * and sends it to the upper layers of HelenOS. 125 * 126 * Apart from that, it also checks whether the userspace output driver has 127 * pushed any characters to the output buffer. If so, it prints them. 128 */ 129 static void niagara_poll(niagara_instance_t *instance) 130 { 131 /* print any pending characters from the shared buffer to the console */ 107 /* Repeat until the buffer is non-full */ 108 while (__hypercall_fast1(CONS_PUTCHAR, c) == HV_EWOULDBLOCK); 109 } 110 111 /** Write a single character to the standard output. */ 112 static void niagara_putchar(outdev_t *dev, const wchar_t ch) 113 { 114 if ((!outbuf_parea.mapped) || (console_override)) { 115 do_putchar(ch); 116 if (ch == '\n') 117 do_putchar('\r'); 118 } 119 } 120 121 /** Poll keyboard and print pending characters. 122 * 123 * Ask the hypervisor whether there is any unread character. If so, 124 * pick it up and send it to the indev layer. 125 * 126 * Check whether the userspace output driver has pushed any 127 * characters to the output buffer and eventually print them. 128 * 129 */ 130 static void niagara_poll(void) 131 { 132 /* 133 * Print any pending characters from the 134 * shared buffer to the console. 135 */ 136 132 137 while (output_buffer.read_ptr != output_buffer.write_ptr) { 133 138 do_putchar(output_buffer.data[output_buffer.read_ptr]); 134 139 output_buffer.read_ptr = 135 ((output_buffer.read_ptr) + 1) % OUTPUT_BUFFER_SIZE; 136 } 137 140 ((output_buffer.read_ptr) + 1) % OUTPUT_BUFFER_SIZE; 141 } 142 143 /* 144 * Read character from keyboard. 145 */ 146 138 147 uint64_t c; 139 140 /* read character from keyboard, send it to upper layers of HelenOS */141 148 if (__hypercall_fast_ret1(0, 0, 0, 0, 0, CONS_GETCHAR, &c) == HV_EOK) { 142 if (!silent) { 143 /* kconsole active, send the character to kernel */ 149 if ((!inbuf_parea.mapped) || (console_override)) { 150 /* 151 * Kernel console is active, send 152 * the character to kernel. 153 */ 144 154 indev_push_character(instance->srlnin, c); 145 155 } else { 146 /* kconsole inactive, send the character to uspace driver */ 156 /* 157 * Kernel console is inactive, send 158 * the character to uspace driver. 159 */ 147 160 input_buffer.data[input_buffer.write_ptr] = (char) c; 148 161 input_buffer.write_ptr = 149 ((input_buffer.write_ptr) + 1) % INPUT_BUFFER_SIZE;162 ((input_buffer.write_ptr) + 1) % INPUT_BUFFER_SIZE; 150 163 } 151 164 } 152 165 } 153 166 154 /** 155 * Polling thread function.156 */ 157 static void kniagarapoll(void * instance) {167 /** Polling thread function. 168 * 169 */ 170 static void kniagarapoll(void *arg) { 158 171 while (true) { 159 niagara_poll( instance);172 niagara_poll(); 160 173 thread_usleep(POLL_INTERVAL); 161 174 } 162 175 } 163 176 164 /** 165 * Initializes the input/output subsystem so that the Niagara standard 166 * input/output is used. 177 /** Initialize the input/output subsystem 178 * 167 179 */ 168 180 static void niagara_init(void) … … 172 184 173 185 instance = malloc(sizeof(niagara_instance_t), FRAME_ATOMIC); 174 175 if (instance) { 176 instance->thread = thread_create(kniagarapoll, instance, TASK, 0, 177 "kniagarapoll", true); 178 179 if (!instance->thread) { 180 free(instance); 181 instance = NULL; 182 return; 183 } 184 } 185 186 instance->thread = thread_create(kniagarapoll, NULL, TASK, 0, 187 "kniagarapoll", true); 188 189 if (!instance->thread) { 190 free(instance); 191 instance = NULL; 192 return; 193 } 194 186 195 instance->srlnin = NULL; 187 196 188 197 output_buffer.read_ptr = 0; 189 198 output_buffer.write_ptr = 0; 190 199 input_buffer.write_ptr = 0; 191 200 input_buffer.read_ptr = 0; 192 201 193 202 /* 194 203 * Set sysinfos and pareas so that the userspace counterpart of the 195 204 * niagara fb and kbd driver can communicate with kernel using shared 196 205 * buffers. 197 */198 206 */ 207 199 208 sysinfo_set_item_val("fb.kind", NULL, 5); 200 209 201 210 sysinfo_set_item_val("niagara.outbuf.address", NULL, 202 KA2PA(&output_buffer));211 KA2PA(&output_buffer)); 203 212 sysinfo_set_item_val("niagara.outbuf.size", NULL, 204 PAGE_SIZE);213 PAGE_SIZE); 205 214 sysinfo_set_item_val("niagara.outbuf.datasize", NULL, 206 OUTPUT_BUFFER_SIZE);207 215 OUTPUT_BUFFER_SIZE); 216 208 217 sysinfo_set_item_val("niagara.inbuf.address", NULL, 209 KA2PA(&input_buffer));218 KA2PA(&input_buffer)); 210 219 sysinfo_set_item_val("niagara.inbuf.size", NULL, 211 PAGE_SIZE);220 PAGE_SIZE); 212 221 sysinfo_set_item_val("niagara.inbuf.datasize", NULL, 213 INPUT_BUFFER_SIZE); 214 215 static parea_t outbuf_parea; 222 INPUT_BUFFER_SIZE); 223 216 224 outbuf_parea.pbase = (uintptr_t) (KA2PA(&output_buffer)); 217 225 outbuf_parea.frames = 1; 218 226 outbuf_parea.unpriv = false; 227 outbuf_parea.mapped = false; 219 228 ddi_parea_register(&outbuf_parea); 220 221 static parea_t inbuf_parea; 229 222 230 inbuf_parea.pbase = (uintptr_t) (KA2PA(&input_buffer)); 223 231 inbuf_parea.frames = 1; 224 232 inbuf_parea.unpriv = false; 233 inbuf_parea.mapped = false; 225 234 ddi_parea_register(&inbuf_parea); 226 235 227 236 outdev_t *niagara_dev = malloc(sizeof(outdev_t), FRAME_ATOMIC); 228 237 outdev_initialize("niagara_dev", niagara_dev, &niagara_ops); … … 230 239 } 231 240 232 /** 233 * A public function which initializes input from the Niagara console.241 /** Initialize input from the Niagara console. 242 * 234 243 */ 235 244 niagara_instance_t *niagarain_init(void) 236 245 { 237 246 niagara_init(); 238 247 239 248 if (instance) { 240 249 srln_instance_t *srln_instance = srln_init(); … … 242 251 indev_t *sink = stdin_wire(); 243 252 indev_t *srln = srln_wire(srln_instance, sink); 244 245 // wire std. input to niagara 253 246 254 instance->srlnin = srln; 247 255 thread_ready(instance->thread); 248 256 } 249 257 } 258 250 259 return instance; 251 260 } -
kernel/arch/sparc64/src/drivers/tick.c
r3714e79 rbee37cf 44 44 #include <debug.h> 45 45 46 #define TICK_RESTART_TIME 50 /* Worst case estimate. */47 48 46 /** Initialize tick and stick interrupt. */ 49 47 void tick_init(void) … … 51 49 /* initialize TICK interrupt */ 52 50 tick_compare_reg_t compare; 51 softint_reg_t clear; 53 52 54 53 interrupt_register(14, "tick_int", tick_interrupt); … … 59 58 tick_compare_write(compare.value); 60 59 60 clear.value = 0; 61 clear.tick_int = 1; 62 clear_softint_write(clear.value); 63 61 64 #if defined (US3) || defined (SUN4V) 62 65 /* disable STICK interrupts and clear any pending ones */ 63 66 tick_compare_reg_t stick_compare; 64 softint_reg_t clear;65 67 66 68 stick_compare.value = stick_compare_read();
Note:
See TracChangeset
for help on using the changeset viewer.
