- Timestamp:
- 2011-08-07T11:21:44Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- cc574511
- Parents:
- 15f3c3f (diff), e8067c0 (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
- Files:
-
- 49 added
- 6 deleted
- 46 edited
- 3 moved
-
arch/amd64/Makefile.inc (modified) (2 diffs)
-
arch/arm32/src/mach/gta02/gta02.c (modified) (2 diffs)
-
arch/arm32/src/mach/integratorcp/integratorcp.c (modified) (2 diffs)
-
arch/ia32/src/boot/vesa_real.inc (modified) (1 diff)
-
arch/ia64/include/bootinfo.h (modified) (3 diffs)
-
arch/ia64/src/drivers/ski.c (modified) (5 diffs)
-
arch/ia64/src/ia64.c (modified) (1 diff)
-
arch/ia64/src/mm/frame.c (modified) (1 diff)
-
arch/mips32/Makefile.inc (modified) (1 diff)
-
arch/mips32/include/cycle.h (modified) (1 diff)
-
arch/mips32/include/debug.h (modified) (1 diff)
-
arch/mips32/include/mm/frame.h (modified) (1 diff)
-
arch/mips32/include/stack.h (modified) (1 diff)
-
arch/mips32/src/cache.c (modified) (1 diff)
-
arch/mips32/src/cpu/cpu.c (modified) (1 diff)
-
arch/mips32/src/fpu_context.c (modified) (2 diffs)
-
arch/mips32/src/mm/as.c (modified) (1 diff)
-
arch/mips32/src/mm/tlb.c (modified) (2 diffs)
-
arch/mips32/src/start.S (modified) (1 diff)
-
arch/mips64/Makefile.inc (added)
-
arch/mips64/_link.ld.in (added)
-
arch/mips64/include/arch.h (moved) (moved from kernel/genarch/include/ofw/fhc.h ) (2 diffs)
-
arch/mips64/include/asm.h (added)
-
arch/mips64/include/asm/boot.h (added)
-
arch/mips64/include/asm/regname.h (added)
-
arch/mips64/include/atomic.h (added)
-
arch/mips64/include/barrier.h (added)
-
arch/mips64/include/cache.h (added)
-
arch/mips64/include/context.h (added)
-
arch/mips64/include/context_offset.h (added)
-
arch/mips64/include/cp0.h (added)
-
arch/mips64/include/cpu.h (added)
-
arch/mips64/include/cycle.h (added)
-
arch/mips64/include/debug.h (added)
-
arch/mips64/include/debugger.h (added)
-
arch/mips64/include/drivers/msim.h (added)
-
arch/mips64/include/elf.h (added)
-
arch/mips64/include/exception.h (added)
-
arch/mips64/include/faddr.h (moved) (moved from uspace/srv/hid/fb/sgcn.h ) (2 diffs)
-
arch/mips64/include/fpu_context.h (added)
-
arch/mips64/include/interrupt.h (added)
-
arch/mips64/include/istate.h (added)
-
arch/mips64/include/mm/as.h (added)
-
arch/mips64/include/mm/asid.h (added)
-
arch/mips64/include/mm/frame.h (added)
-
arch/mips64/include/mm/page.h (added)
-
arch/mips64/include/mm/tlb.h (added)
-
arch/mips64/include/proc/task.h (moved) (moved from kernel/arch/sparc64/include/drivers/fhc.h ) (2 diffs)
-
arch/mips64/include/proc/thread.h (added)
-
arch/mips64/include/smp/dorder.h (added)
-
arch/mips64/include/stack.h (added)
-
arch/mips64/include/types.h (added)
-
arch/mips64/src/asm.S (added)
-
arch/mips64/src/cache.c (added)
-
arch/mips64/src/context.S (added)
-
arch/mips64/src/cpu (added)
-
arch/mips64/src/ddi (added)
-
arch/mips64/src/debug (added)
-
arch/mips64/src/debugger.c (added)
-
arch/mips64/src/exception.c (added)
-
arch/mips64/src/fpu_context.c (added)
-
arch/mips64/src/interrupt.c (added)
-
arch/mips64/src/mips64.c (added)
-
arch/mips64/src/mm/as.c (added)
-
arch/mips64/src/mm/frame.c (added)
-
arch/mips64/src/mm/page.c (added)
-
arch/mips64/src/mm/tlb.c (added)
-
arch/mips64/src/smp/dorder.c (added)
-
arch/mips64/src/smp/smp.c (added)
-
arch/mips64/src/start.S (added)
-
arch/sparc64/Makefile.inc (modified) (1 diff)
-
arch/sparc64/include/drivers/sgcn.h (deleted)
-
arch/sparc64/src/console.c (modified) (3 diffs)
-
arch/sparc64/src/drivers/fhc.c (deleted)
-
arch/sparc64/src/drivers/kbd.c (modified) (4 diffs)
-
arch/sparc64/src/drivers/niagara.c (modified) (6 diffs)
-
arch/sparc64/src/drivers/sgcn.c (deleted)
-
genarch/Makefile.inc (modified) (2 diffs)
-
genarch/include/drivers/s3c24xx_uart/s3c24xx_uart.h (modified) (2 diffs)
-
genarch/include/drivers/z8530/z8530.h (deleted)
-
genarch/src/drivers/dsrln/dsrlnout.c (modified) (3 diffs)
-
genarch/src/drivers/ega/ega.c (modified) (13 diffs)
-
genarch/src/drivers/s3c24xx_uart/s3c24xx_uart.c (modified) (5 diffs)
-
genarch/src/drivers/z8530/z8530.c (deleted)
-
genarch/src/fb/fb.c (modified) (15 diffs)
-
genarch/src/ofw/fhc.c (deleted)
-
generic/include/console/chardev.h (modified) (1 diff)
-
generic/include/console/console.h (modified) (1 diff)
-
generic/include/ddi/ddi.h (modified) (1 diff)
-
generic/include/lib/elf.h (modified) (8 diffs)
-
generic/include/lib/elf_load.h (added)
-
generic/include/mm/as.h (modified) (2 diffs)
-
generic/include/panic.h (modified) (1 diff)
-
generic/include/syscall/syscall.h (modified) (1 diff)
-
generic/src/console/console.c (modified) (9 diffs)
-
generic/src/ddi/ddi.c (modified) (4 diffs)
-
generic/src/ddi/irq.c (modified) (1 diff)
-
generic/src/debug/panic.c (modified) (2 diffs)
-
generic/src/lib/elf.c (modified) (1 diff)
-
generic/src/lib/rd.c (modified) (1 diff)
-
generic/src/mm/as.c (modified) (1 diff)
-
generic/src/proc/program.c (modified) (1 diff)
-
generic/src/syscall/syscall.c (modified) (1 diff)
-
generic/src/time/clock.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/Makefile.inc
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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/include/bootinfo.h
r15f3c3f r86ffa27f 34 34 #define MEMMAP_ITEMS 128 35 35 36 #define EFI_MEMMAP_FREE_MEM 036 #define MEMMAP_FREE_MEM 0 37 37 38 38 /** Size of buffer for storing task name in binit_task_t. */ … … 54 54 unsigned long base; 55 55 unsigned long size; 56 } efi_memmap_item_t;56 } memmap_item_t; 57 57 58 58 typedef struct { 59 59 binit_t taskmap; 60 60 61 efi_memmap_item_t memmap[MEMMAP_ITEMS];61 memmap_item_t memmap[MEMMAP_ITEMS]; 62 62 unsigned int memmap_items; 63 63 … … 66 66 unsigned long freq_scale; 67 67 unsigned int wakeup_intno; 68 int hello_configured;69 68 } bootinfo_t; 70 69 -
kernel/arch/ia64/src/drivers/ski.c
r15f3c3f r86ffa27f 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/ia64/src/ia64.c
r15f3c3f r86ffa27f 151 151 /* Set platform name. */ 152 152 #ifdef MACHINE_ski 153 platform = " pc";153 platform = "ski"; 154 154 #endif 155 155 #ifdef MACHINE_i460GX -
kernel/arch/ia64/src/mm/frame.c
r15f3c3f r86ffa27f 58 58 unsigned int i; 59 59 for (i = 0; i < bootinfo->memmap_items; i++) { 60 if (bootinfo->memmap[i].type == EFI_MEMMAP_FREE_MEM) {60 if (bootinfo->memmap[i].type == MEMMAP_FREE_MEM) { 61 61 uint64_t base = bootinfo->memmap[i].base; 62 62 uint64_t size = bootinfo->memmap[i].size; -
kernel/arch/mips32/Makefile.inc
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 27 27 */ 28 28 29 /** @addtogroup mips 229 /** @addtogroup mips32 30 30 * @{ 31 31 */ -
kernel/arch/mips32/include/debug.h
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 27 27 */ 28 28 29 /** @addtogroup mips32 29 /** @addtogroup mips32 30 30 * @{ 31 31 */ -
kernel/arch/mips32/src/cpu/cpu.c
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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/arch.h
r15f3c3f r86ffa27f 1 1 /* 2 * Copyright (c) 200 6 Jakub Jermar2 * Copyright (c) 2005 Martin Decky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 #ifndef KERN_FHC_H_ 30 #define KERN_FHC_H_ 29 /** @addtogroup mips64 30 * @{ 31 */ 32 /** @file 33 */ 31 34 32 #i nclude <genarch/ofw/ofw_tree.h>33 # include <typedefs.h>34 #include <ddi/irq.h> 35 #ifndef KERN_mips64_ARCH_H_ 36 #define KERN_mips64_ARCH_H_ 37 35 38 #include <typedefs.h> 36 39 37 typedef struct { 38 uint64_t addr; 39 uint32_t size; 40 } __attribute__ ((packed)) ofw_fhc_reg_t; 40 #define TASKMAP_MAX_RECORDS 32 41 #define CPUMAP_MAX_RECORDS 32 42 #define BOOTINFO_TASK_NAME_BUFLEN 32 43 44 extern size_t cpu_count; 41 45 42 46 typedef struct { 43 uint64_t child_base;44 uint64_t parent_base;45 uint32_t size;46 } __attribute__ ((packed)) ofw_fhc_range_t;47 void *addr; 48 size_t size; 49 char name[BOOTINFO_TASK_NAME_BUFLEN]; 50 } utask_t; 47 51 48 52 typedef struct { 49 uint64_t addr; 50 uint32_t size; 51 } __attribute__ ((packed)) ofw_central_reg_t; 53 uint32_t cpumap; 54 size_t cnt; 55 utask_t tasks[TASKMAP_MAX_RECORDS]; 56 } bootinfo_t; 52 57 53 typedef struct { 54 uint64_t child_base; 55 uint64_t parent_base; 56 uint32_t size; 57 } __attribute__ ((packed)) ofw_central_range_t; 58 59 extern bool ofw_fhc_apply_ranges(ofw_tree_node_t *, ofw_fhc_reg_t *, 60 uintptr_t *); 61 extern bool ofw_central_apply_ranges(ofw_tree_node_t *, ofw_central_reg_t *, 62 uintptr_t *); 63 64 extern bool ofw_fhc_map_interrupt(ofw_tree_node_t *, ofw_fhc_reg_t *, 65 uint32_t, int *, cir_t *, void **); 58 extern void arch_pre_main(void *entry, bootinfo_t *bootinfo); 66 59 67 60 #endif 61 62 /** @} 63 */ -
kernel/arch/mips64/include/faddr.h
r15f3c3f r86ffa27f 1 1 /* 2 * Copyright (c) 200 8 Pavel Rimsky2 * Copyright (c) 2005 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @defgroup sgcnfb SGCN 30 * @brief userland driver of the Serengeti console output 29 /** @addtogroup mips64 31 30 * @{ 32 31 */ 33 34 32 /** @file 35 33 */ 36 34 37 #ifndef FB_SGCN_H_38 #define FB_SGCN_H_35 #ifndef KERN_mips64_FADDR_H_ 36 #define KERN_mips64_FADDR_H_ 39 37 40 int sgcn_init(void); 38 #include <typedefs.h> 39 40 #define FADDR(fptr) ((uintptr_t) (fptr)) 41 41 42 42 #endif 43 43 44 /** 45 * @} 44 /** @} 46 45 */ -
kernel/arch/mips64/include/proc/task.h
r15f3c3f r86ffa27f 27 27 */ 28 28 29 /** @addtogroup sparc6429 /** @addtogroup mips64proc 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef KERN_sparc64_FHC_H_ 36 #define KERN_sparc64_FHC_H_ 37 38 #include <typedefs.h> 39 #include <genarch/ofw/ofw_tree.h> 35 #ifndef KERN_mips64_TASK_H_ 36 #define KERN_mips64_TASK_H_ 40 37 41 38 typedef struct { 42 volatile uint32_t *uart_imap; 43 } fhc_t; 39 } task_arch_t; 44 40 45 extern fhc_t *central_fhc; 46 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); 41 #define task_create_arch(task) 42 #define task_destroy_arch(task) 50 43 51 44 #endif -
kernel/arch/sparc64/Makefile.inc
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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
r15f3c3f r86ffa27f 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/genarch/Makefile.inc
r15f3c3f r86ffa27f 100 100 endif 101 101 102 ifeq ($(CONFIG_Z8530),y)103 GENARCH_SOURCES += \104 genarch/src/drivers/z8530/z8530.c105 endif106 107 102 ifeq ($(CONFIG_VIA_CUDA),y) 108 103 GENARCH_SOURCES += \ … … 141 136 GENARCH_SOURCES += \ 142 137 genarch/src/ofw/ebus.c \ 143 genarch/src/ofw/fhc.c \144 138 genarch/src/ofw/pci.c \ 145 139 genarch/src/ofw/sbus.c \ -
kernel/genarch/include/drivers/s3c24xx_uart/s3c24xx_uart.h
r15f3c3f r86ffa27f 38 38 #define KERN_S3C24XX_UART_H_ 39 39 40 #include <ddi/ddi.h> 40 41 #include <ddi/irq.h> 41 42 #include <console/chardev.h> … … 83 84 indev_t *indev; 84 85 irq_t irq; 86 parea_t parea; 85 87 } s3c24xx_uart_t; 86 88 87 extern outdev_t *s3c24xx_uart_init( s3c24xx_uart_io_t *, inr_t inr);89 extern outdev_t *s3c24xx_uart_init(uintptr_t, inr_t inr); 88 90 extern void s3c24xx_uart_input_wire(s3c24xx_uart_t *, 89 91 indev_t *); -
kernel/genarch/src/drivers/dsrln/dsrlnout.c
r15f3c3f r86ffa27f 42 42 #include <sysinfo/sysinfo.h> 43 43 #include <str.h> 44 #include <ddi/ddi.h> 44 45 45 46 typedef struct { 47 parea_t parea; 46 48 ioport8_t *base; 47 49 } dsrlnout_instance_t; 48 50 49 static void dsrlnout_putchar(outdev_t *dev, const wchar_t ch , bool silent)51 static void dsrlnout_putchar(outdev_t *dev, const wchar_t ch) 50 52 { 51 53 dsrlnout_instance_t *instance = (dsrlnout_instance_t *) dev->data; 52 54 53 if ( !silent) {55 if ((!instance->parea.mapped) || (console_override)) { 54 56 if (ascii_check(ch)) 55 57 pio_write_8(instance->base, ch); … … 70 72 return NULL; 71 73 72 dsrlnout_instance_t *instance = malloc(sizeof(dsrlnout_instance_t), FRAME_ATOMIC); 74 dsrlnout_instance_t *instance = malloc(sizeof(dsrlnout_instance_t), 75 FRAME_ATOMIC); 73 76 if (!instance) { 74 77 free(dsrlndev); … … 80 83 81 84 instance->base = base; 85 link_initialize(&instance->parea.link); 86 instance->parea.pbase = KA2PA(base); 87 instance->parea.frames = 1; 88 instance->parea.unpriv = false; 89 instance->parea.mapped = false; 90 ddi_parea_register(&instance->parea); 82 91 83 92 if (!fb_exported) { 84 93 /* 85 * This is the necessary evil until the userspace driver is entirely 94 * This is the necessary evil until 95 * the userspace driver is entirely 86 96 * self-sufficient. 87 97 */ -
kernel/genarch/src/drivers/ega/ega.c
r15f3c3f r86ffa27f 64 64 IRQ_SPINLOCK_DECLARE(lock); 65 65 66 parea_t parea; 67 66 68 uint32_t cursor; 67 69 uint8_t *addr; … … 70 72 } ega_instance_t; 71 73 72 static void ega_putchar(outdev_t *, wchar_t , bool);74 static void ega_putchar(outdev_t *, wchar_t); 73 75 static void ega_redraw(outdev_t *); 74 76 … … 437 439 * This function takes care of scrolling. 438 440 */ 439 static void ega_check_cursor(ega_instance_t *instance , bool silent)441 static void ega_check_cursor(ega_instance_t *instance) 440 442 { 441 443 if (instance->cursor < EGA_SCREEN) … … 448 450 EGA_COLS, EMPTY_CHAR); 449 451 450 if ( !silent) {452 if ((!instance->parea.mapped) || (console_override)) { 451 453 memmove((void *) instance->addr, 452 454 (void *) (instance->addr + EGA_COLS * 2), … … 459 461 } 460 462 461 static void ega_show_cursor(ega_instance_t *instance , bool silent)462 { 463 if ( !silent) {463 static void ega_show_cursor(ega_instance_t *instance) 464 { 465 if ((!instance->parea.mapped) || (console_override)) { 464 466 pio_write_8(instance->base + EGA_INDEX_REG, 0x0a); 465 467 uint8_t stat = pio_read_8(instance->base + EGA_DATA_REG); … … 469 471 } 470 472 471 static void ega_move_cursor(ega_instance_t *instance , bool silent)472 { 473 if ( !silent) {473 static void ega_move_cursor(ega_instance_t *instance) 474 { 475 if ((!instance->parea.mapped) || (console_override)) { 474 476 pio_write_8(instance->base + EGA_INDEX_REG, 0x0e); 475 477 pio_write_8(instance->base + EGA_DATA_REG, … … 481 483 } 482 484 483 static void ega_sync_cursor(ega_instance_t *instance , bool silent)484 { 485 if ( !silent) {485 static void ega_sync_cursor(ega_instance_t *instance) 486 { 487 if ((!instance->parea.mapped) || (console_override)) { 486 488 pio_write_8(instance->base + EGA_INDEX_REG, 0x0e); 487 489 uint8_t hi = pio_read_8(instance->base + EGA_DATA_REG); … … 503 505 EGA_SCREEN - instance->cursor, EMPTY_CHAR); 504 506 505 if ( !silent)507 if ((!instance->parea.mapped) || (console_override)) 506 508 memsetw(instance->addr + instance->cursor * 2, 507 509 EGA_SCREEN - instance->cursor, EMPTY_CHAR); 508 510 509 ega_check_cursor(instance , silent);510 ega_move_cursor(instance , silent);511 ega_show_cursor(instance , silent);512 } 513 514 static void ega_display_char(ega_instance_t *instance, wchar_t ch , bool silent)511 ega_check_cursor(instance); 512 ega_move_cursor(instance); 513 ega_show_cursor(instance); 514 } 515 516 static void ega_display_char(ega_instance_t *instance, wchar_t ch) 515 517 { 516 518 uint16_t index = ega_oem_glyph(ch); … … 529 531 instance->backbuf[instance->cursor * 2 + 1] = style; 530 532 531 if ( !silent) {533 if ((!instance->parea.mapped) || (console_override)) { 532 534 instance->addr[instance->cursor * 2] = glyph; 533 535 instance->addr[instance->cursor * 2 + 1] = style; … … 535 537 } 536 538 537 static void ega_putchar(outdev_t *dev, wchar_t ch , bool silent)539 static void ega_putchar(outdev_t *dev, wchar_t ch) 538 540 { 539 541 ega_instance_t *instance = (ega_instance_t *) dev->data; … … 555 557 break; 556 558 default: 557 ega_display_char(instance, ch , silent);559 ega_display_char(instance, ch); 558 560 instance->cursor++; 559 561 break; 560 562 } 561 ega_check_cursor(instance , silent);562 ega_move_cursor(instance , silent);563 ega_check_cursor(instance); 564 ega_move_cursor(instance); 563 565 564 566 irq_spinlock_unlock(&instance->lock, true); … … 572 574 573 575 memcpy(instance->addr, instance->backbuf, EGA_VRAM_SIZE); 574 ega_move_cursor(instance , silent);575 ega_show_cursor(instance , silent);576 ega_move_cursor(instance); 577 ega_show_cursor(instance); 576 578 577 579 irq_spinlock_unlock(&instance->lock, true); … … 612 614 } 613 615 616 link_initialize(&instance->parea.link); 617 instance->parea.pbase = addr; 618 instance->parea.frames = SIZE2FRAMES(EGA_VRAM_SIZE); 619 instance->parea.unpriv = false; 620 instance->parea.mapped = false; 621 ddi_parea_register(&instance->parea); 622 614 623 /* Synchronize the back buffer and cursor position. */ 615 624 memcpy(instance->backbuf, instance->addr, EGA_VRAM_SIZE); 616 ega_sync_cursor(instance , silent);625 ega_sync_cursor(instance); 617 626 618 627 if (!fb_exported) { 619 628 /* 620 * This is the necessary evil until the userspace driver is entirely 621 * self-sufficient. 629 * We export the kernel framebuffer for uspace usage. 630 * This is used in the case the uspace framebuffer 631 * driver is not self-sufficient. 622 632 */ 623 633 sysinfo_set_item_val("fb", NULL, true); -
kernel/genarch/src/drivers/s3c24xx_uart/s3c24xx_uart.c
r15f3c3f r86ffa27f 44 44 #include <arch/asm.h> 45 45 #include <mm/slab.h> 46 #include <mm/page.h> 46 47 #include <sysinfo/sysinfo.h> 47 48 #include <str.h> … … 59 60 } 60 61 61 static void s3c24xx_uart_putchar(outdev_t *dev, wchar_t ch , bool silent)62 static void s3c24xx_uart_putchar(outdev_t *dev, wchar_t ch) 62 63 { 63 if (!silent) { 64 s3c24xx_uart_t *uart = 65 (s3c24xx_uart_t *) dev->data; 66 67 if ((!uart->parea.mapped) || (console_override)) { 64 68 if (!ascii_check(ch)) { 65 69 s3c24xx_uart_sendb(dev, U_SPECIAL); 66 70 } else { 67 if (ch == '\n')71 if (ch == '\n') 68 72 s3c24xx_uart_sendb(dev, (uint8_t) '\r'); 69 73 s3c24xx_uart_sendb(dev, (uint8_t) ch); … … 93 97 }; 94 98 95 outdev_t *s3c24xx_uart_init( s3c24xx_uart_io_t *io, inr_t inr)99 outdev_t *s3c24xx_uart_init(uintptr_t paddr, inr_t inr) 96 100 { 97 101 outdev_t *uart_dev = malloc(sizeof(outdev_t), FRAME_ATOMIC); … … 109 113 uart_dev->data = uart; 110 114 111 uart->io = io;115 uart->io = (s3c24xx_uart_io_t *) hw_map(paddr, PAGE_SIZE); 112 116 uart->indev = NULL; 113 117 … … 127 131 pio_write_32(&uart->io->ucon, 128 132 pio_read_32(&uart->io->ucon) & ~UCON_RX_INT_LEVEL); 129 133 134 link_initialize(&uart->parea.link); 135 uart->parea.pbase = paddr; 136 uart->parea.frames = 1; 137 uart->parea.unpriv = false; 138 uart->parea.mapped = false; 139 ddi_parea_register(&uart->parea); 140 130 141 if (!fb_exported) { 131 142 /* 132 * This is the necessary evil until the userspace driver is entirely 143 * This is the necessary evil until 144 * the userspace driver is entirely 133 145 * self-sufficient. 134 146 */ 135 147 sysinfo_set_item_val("fb", NULL, true); 136 148 sysinfo_set_item_val("fb.kind", NULL, 3); 137 sysinfo_set_item_val("fb.address.physical", NULL, KA2PA(io));149 sysinfo_set_item_val("fb.address.physical", NULL, paddr); 138 150 139 151 fb_exported = true; -
kernel/genarch/src/fb/fb.c
r15f3c3f r86ffa27f 82 82 SPINLOCK_DECLARE(lock); 83 83 84 parea_t parea; 85 84 86 uint8_t *addr; 85 87 uint16_t *backbuf; … … 109 111 } fb_instance_t; 110 112 111 static void fb_putchar(outdev_t *dev, wchar_t ch , bool silent);113 static void fb_putchar(outdev_t *dev, wchar_t ch); 112 114 static void fb_redraw_internal(fb_instance_t *instance); 113 115 static void fb_redraw(outdev_t *dev); … … 215 217 * 216 218 */ 217 static void logo_hide(fb_instance_t *instance , bool silent)219 static void logo_hide(fb_instance_t *instance) 218 220 { 219 221 instance->ylogo = 0; … … 221 223 instance->rowtrim = instance->rows; 222 224 223 if ( !silent)225 if ((!instance->parea.mapped) || (console_override)) 224 226 fb_redraw_internal(instance); 225 227 } … … 229 231 */ 230 232 static void glyph_draw(fb_instance_t *instance, uint16_t glyph, 231 unsigned int col, unsigned int row, bool silent, booloverlay)233 unsigned int col, unsigned int row, bool overlay) 232 234 { 233 235 unsigned int x = COL2X(col); … … 236 238 237 239 if (y >= instance->ytrim) 238 logo_hide(instance , silent);240 logo_hide(instance); 239 241 240 242 if (!overlay) 241 243 instance->backbuf[BB_POS(instance, col, row)] = glyph; 242 244 243 if ( !silent) {245 if ((!instance->parea.mapped) || (console_override)) { 244 246 for (yd = 0; yd < FONT_SCANLINES; yd++) 245 247 memcpy(&instance->addr[FB_POS(instance, x, y + yd + instance->ylogo)], … … 253 255 * 254 256 */ 255 static void screen_scroll(fb_instance_t *instance , bool silent)257 static void screen_scroll(fb_instance_t *instance) 256 258 { 257 259 if (instance->ylogo > 0) { 258 logo_hide(instance , silent);260 logo_hide(instance); 259 261 return; 260 262 } 261 263 262 if ( !silent) {264 if ((!instance->parea.mapped) || (console_override)) { 263 265 unsigned int row; 264 266 … … 298 300 } 299 301 300 static void cursor_put(fb_instance_t *instance , bool silent)302 static void cursor_put(fb_instance_t *instance) 301 303 { 302 304 unsigned int col = instance->position % instance->cols; 303 305 unsigned int row = instance->position / instance->cols; 304 306 305 glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, silent,true);306 } 307 308 static void cursor_remove(fb_instance_t *instance , bool silent)307 glyph_draw(instance, fb_font_glyph(U_CURSOR), col, row, true); 308 } 309 310 static void cursor_remove(fb_instance_t *instance) 309 311 { 310 312 unsigned int col = instance->position % instance->cols; … … 312 314 313 315 glyph_draw(instance, instance->backbuf[BB_POS(instance, col, row)], 314 col, row, silent,true);316 col, row, true); 315 317 } 316 318 … … 362 364 * 363 365 */ 364 static void fb_putchar(outdev_t *dev, wchar_t ch , bool silent)366 static void fb_putchar(outdev_t *dev, wchar_t ch) 365 367 { 366 368 fb_instance_t *instance = (fb_instance_t *) dev->data; … … 369 371 switch (ch) { 370 372 case '\n': 371 cursor_remove(instance , silent);373 cursor_remove(instance); 372 374 instance->position += instance->cols; 373 375 instance->position -= instance->position % instance->cols; 374 376 break; 375 377 case '\r': 376 cursor_remove(instance , silent);378 cursor_remove(instance); 377 379 instance->position -= instance->position % instance->cols; 378 380 break; 379 381 case '\b': 380 cursor_remove(instance , silent);382 cursor_remove(instance); 381 383 if (instance->position % instance->cols) 382 384 instance->position--; 383 385 break; 384 386 case '\t': 385 cursor_remove(instance , silent);387 cursor_remove(instance); 386 388 do { 387 389 glyph_draw(instance, fb_font_glyph(' '), 388 390 instance->position % instance->cols, 389 instance->position / instance->cols, silent,false);391 instance->position / instance->cols, false); 390 392 instance->position++; 391 393 } while ((instance->position % 8) … … 395 397 glyph_draw(instance, fb_font_glyph(ch), 396 398 instance->position % instance->cols, 397 instance->position / instance->cols, silent,false);399 instance->position / instance->cols, false); 398 400 instance->position++; 399 401 } … … 401 403 if (instance->position >= instance->cols * instance->rows) { 402 404 instance->position -= instance->cols; 403 screen_scroll(instance , silent);404 } 405 406 cursor_put(instance , silent);405 screen_scroll(instance); 406 } 407 408 cursor_put(instance); 407 409 408 410 spinlock_unlock(&instance->lock); … … 555 557 556 558 spinlock_initialize(&instance->lock, "*fb.instance.lock"); 559 557 560 instance->rgb_conv = rgb_conv; 558 561 instance->pixelbytes = pixelbytes; … … 623 626 glyphs_render(instance); 624 627 628 link_initialize(&instance->parea.link); 629 instance->parea.pbase = props->addr; 630 instance->parea.frames = SIZE2FRAMES(fbsize); 631 instance->parea.unpriv = false; 632 instance->parea.mapped = false; 633 ddi_parea_register(&instance->parea); 634 625 635 if (!fb_exported) { 626 636 /* 627 * This is the necessary evil until the userspace driver is entirely 628 * self-sufficient. 637 * We export the kernel framebuffer for uspace usage. 638 * This is used in the case the uspace framebuffer 639 * driver is not self-sufficient. 629 640 */ 630 641 sysinfo_set_item_val("fb", NULL, true); -
kernel/generic/include/console/chardev.h
r15f3c3f r86ffa27f 73 73 typedef struct { 74 74 /** Write character to output. */ 75 void (* write)(struct outdev *, wchar_t , bool);75 void (* write)(struct outdev *, wchar_t); 76 76 77 77 /** Redraw any previously cached characters. */ -
kernel/generic/include/console/console.h
r15f3c3f r86ffa27f 72 72 extern void release_console(void); 73 73 74 extern sysarg_t sys_debug_enable_console(void); 75 extern sysarg_t sys_debug_disable_console(void); 74 extern sysarg_t sys_debug_activate_console(void); 76 75 77 76 #endif /* KERN_CONSOLE_H_ */ -
kernel/generic/include/ddi/ddi.h
r15f3c3f r86ffa27f 48 48 pfn_t frames; /**< Number of frames in the area. */ 49 49 bool unpriv; /**< Allow mapping by unprivileged tasks. */ 50 bool mapped; /**< Indicate whether the area is actually 51 mapped. */ 50 52 } parea_t; 51 53 -
kernel/generic/include/lib/elf.h
r15f3c3f r86ffa27f 106 106 #define ELFDATA2LSB 1 /* Least significant byte first (little endian) */ 107 107 #define ELFDATA2MSB 2 /* Most signigicant byte first (big endian) */ 108 109 /**110 * ELF error return codes111 */112 #define EE_OK 0 /* No error */113 #define EE_INVALID 1 /* Invalid ELF image */114 #define EE_MEMORY 2 /* Cannot allocate address space */115 #define EE_INCOMPATIBLE 3 /* ELF image is not compatible with current architecture */116 #define EE_UNSUPPORTED 4 /* Non-supported ELF (e.g. dynamic ELFs) */117 #define EE_LOADER 5 /* The image is actually a program loader */118 #define EE_IRRECOVERABLE 6119 108 120 109 /** … … 149 138 #define SHF_MASKPROC 0xf0000000 150 139 140 /** Macros for decomposing elf_symbol.st_info into binging and type */ 141 #define ELF_ST_BIND(i) ((i) >> 4) 142 #define ELF_ST_TYPE(i) ((i) & 0x0f) 143 #define ELF_ST_INFO(b, t) (((b) << 4) + ((t) & 0x0f)) 144 151 145 /** 152 146 * Symbol binding … … 195 189 * ELF object file specifications. They are the only types used 196 190 * in ELF header. 197 *198 191 */ 199 192 typedef uint64_t elf_xword; … … 207 200 * 208 201 * These types are specific for 32-bit format. 209 *210 202 */ 211 203 typedef uint32_t elf32_addr; … … 216 208 * 217 209 * These types are specific for 64-bit format. 218 *219 210 */ 220 211 typedef uint64_t elf64_addr; … … 332 323 }; 333 324 325 /* 326 * ELF note segment entry 327 */ 328 struct elf32_note { 329 elf_word namesz; 330 elf_word descsz; 331 elf_word type; 332 }; 333 334 /* 335 * NOTE: namesz, descsz and type should be 64-bits wide (elf_xword) 336 * per the 64-bit ELF spec. The Linux kernel however screws up and 337 * defines them as Elf64_Word, which is 32-bits wide(!). We are trying 338 * to make our core files compatible with Linux GDB target so we copy 339 * the blunder here. 340 */ 341 struct elf64_note { 342 elf_word namesz; 343 elf_word descsz; 344 elf_word type; 345 }; 346 334 347 #ifdef __32_BITS__ 335 348 typedef struct elf32_header elf_header_t; … … 337 350 typedef struct elf32_section_header elf_section_header_t; 338 351 typedef struct elf32_symbol elf_symbol_t; 352 typedef struct elf32_note elf_note_t; 339 353 #endif 340 354 … … 344 358 typedef struct elf64_section_header elf_section_header_t; 345 359 typedef struct elf64_symbol elf_symbol_t; 360 typedef struct elf64_note elf_note_t; 346 361 #endif 347 348 extern const char *elf_error(unsigned int rc);349 362 350 363 /** Interpreter string used to recognize the program loader */ -
kernel/generic/include/mm/as.h
r15f3c3f r86ffa27f 65 65 #include <arch/mm/as.h> 66 66 #include <arch/mm/asid.h> 67 #include <arch/istate.h> 67 68 #include <typedefs.h> 68 69 #include <synch/spinlock.h> … … 306 307 extern mem_backend_t phys_backend; 307 308 308 /**309 * This flags is passed when running the loader, otherwise elf_load()310 * would return with a EE_LOADER error code.311 *312 */313 #define ELD_F_NONE 0314 #define ELD_F_LOADER 1315 316 extern unsigned int elf_load(elf_header_t *, as_t *, unsigned int);317 318 309 /* Address space area related syscalls. */ 319 310 extern sysarg_t sys_as_area_create(uintptr_t, size_t, unsigned int); -
kernel/generic/include/panic.h
r15f3c3f r86ffa27f 60 60 struct istate; 61 61 62 extern bool silent;62 extern bool console_override; 63 63 64 64 extern void panic_common(panic_category_t, struct istate *, int, -
kernel/generic/include/syscall/syscall.h
r15f3c3f r86ffa27f 94 94 SYS_SYSINFO_GET_DATA, 95 95 96 SYS_DEBUG_ENABLE_CONSOLE, 97 SYS_DEBUG_DISABLE_CONSOLE, 96 SYS_DEBUG_ACTIVATE_CONSOLE, 98 97 99 98 SYSCALL_END -
kernel/generic/src/console/console.c
r15f3c3f r86ffa27f 87 87 }; 88 88 89 static void stdout_write(outdev_t *, wchar_t , bool);89 static void stdout_write(outdev_t *, wchar_t); 90 90 static void stdout_redraw(outdev_t *); 91 91 … … 95 95 }; 96 96 97 /** Silence output */98 bool silent= false;97 /** Override kernel console lockout */ 98 bool console_override = false; 99 99 100 100 /** Standard input and output character devices */ … … 122 122 } 123 123 124 static void stdout_write(outdev_t *dev, wchar_t ch , bool silent)124 static void stdout_write(outdev_t *dev, wchar_t ch) 125 125 { 126 126 list_foreach(dev->list, cur) { 127 127 outdev_t *sink = list_get_instance(cur, outdev_t, link); 128 128 if ((sink) && (sink->op->write)) 129 sink->op->write(sink, ch , silent);129 sink->op->write(sink, ch); 130 130 } 131 131 } … … 156 156 klog_parea.frames = SIZE2FRAMES(sizeof(klog)); 157 157 klog_parea.unpriv = false; 158 klog_parea.mapped = false; 158 159 ddi_parea_register(&klog_parea); 159 160 … … 167 168 void grab_console(void) 168 169 { 169 bool prev = silent;170 171 silent = false;170 bool prev = console_override; 171 172 console_override = true; 172 173 if ((stdout) && (stdout->op->redraw)) 173 174 stdout->op->redraw(stdout); 174 175 175 if ((stdin) && ( prev)) {176 if ((stdin) && (!prev)) { 176 177 /* 177 178 * Force the console to print the prompt. … … 183 184 void release_console(void) 184 185 { 185 // FIXME arch_release_console 186 silent = true; 187 } 188 189 /** Tell kernel to get keyboard/console access again */ 190 sysarg_t sys_debug_enable_console(void) 186 console_override = false; 187 } 188 189 /** Activate kernel console override */ 190 sysarg_t sys_debug_activate_console(void) 191 191 { 192 192 #ifdef CONFIG_KCONSOLE … … 196 196 return false; 197 197 #endif 198 }199 200 /** Tell kernel to relinquish keyboard/console access */201 sysarg_t sys_debug_disable_console(void)202 {203 release_console();204 return true;205 198 } 206 199 … … 289 282 */ 290 283 spinlock_unlock(&klog_lock); 291 stdout->op->write(stdout, tmp , silent);284 stdout->op->write(stdout, tmp); 292 285 spinlock_lock(&klog_lock); 293 286 } … … 317 310 * it should be no longer buffered. 318 311 */ 319 stdout->op->write(stdout, ch , silent);312 stdout->op->write(stdout, ch); 320 313 } else { 321 314 /* -
kernel/generic/src/ddi/ddi.c
r15f3c3f r86ffa27f 122 122 backend_data.frames = pages; 123 123 124 /* Find the zone of the physical memory */ 124 /* 125 * Check if the memory region is explicitly enabled 126 * for mapping by any parea structure. 127 */ 128 129 mutex_lock(&parea_lock); 130 btree_node_t *nodep; 131 parea_t *parea = (parea_t *) btree_search(&parea_btree, 132 (btree_key_t) pf, &nodep); 133 134 if ((parea != NULL) && (parea->frames >= pages)) { 135 if ((!priv) && (!parea->unpriv)) { 136 mutex_unlock(&parea_lock); 137 return EPERM; 138 } 139 140 goto map; 141 } 142 143 parea = NULL; 144 mutex_unlock(&parea_lock); 145 146 /* 147 * Check if the memory region is part of physical 148 * memory generally enabled for mapping. 149 */ 150 125 151 irq_spinlock_lock(&zones.lock, true); 126 152 size_t znum = find_zone(ADDR2PFN(pf), pages, 0); … … 153 179 } 154 180 155 if (zone_flags_available(zones.info[znum].flags)) {156 /*157 * Frames are part of physical memory, check158 * if the memory region is enabled for mapping.159 */160 irq_spinlock_unlock(&zones.lock, true);161 162 mutex_lock(&parea_lock);163 btree_node_t *nodep;164 parea_t *parea = (parea_t *) btree_search(&parea_btree,165 (btree_key_t) pf, &nodep);166 167 if ((!parea) || (parea->frames < pages)) {168 mutex_unlock(&parea_lock);169 return ENOENT;170 }171 172 if (!priv) {173 if (!parea->unpriv) {174 mutex_unlock(&parea_lock);175 return EPERM;176 }177 }178 179 mutex_unlock(&parea_lock);180 goto map;181 }182 183 181 irq_spinlock_unlock(&zones.lock, true); 184 182 return ENOENT; … … 188 186 AS_AREA_ATTR_NONE, &phys_backend, &backend_data)) { 189 187 /* 190 * The address space area could not have beencreated.188 * The address space area was not created. 191 189 * We report it using ENOMEM. 192 190 */ 191 192 if (parea != NULL) 193 mutex_unlock(&parea_lock); 194 193 195 return ENOMEM; 194 196 } … … 197 199 * Mapping is created on-demand during page fault. 198 200 */ 199 return 0; 201 202 if (parea != NULL) { 203 parea->mapped = true; 204 mutex_unlock(&parea_lock); 205 } 206 207 return EOK; 200 208 } 201 209 -
kernel/generic/src/ddi/irq.c
r15f3c3f r86ffa27f 275 275 { 276 276 /* 277 * If the kernel console is silenced, 278 * then try first the uspace handlers, 279 * eventually fall back to kernel handlers. 277 * If the kernel console override is on, 278 * then try first the kernel handlers 279 * and eventually fall back to uspace 280 * handlers. 280 281 * 281 * I f the kernel console is active,282 * then do it the other way around.282 * In the usual case the uspace handlers 283 * have precedence. 283 284 */ 284 if (silent) { 285 irq_t *irq = irq_dispatch_and_lock_uspace(inr); 285 286 if (console_override) { 287 irq_t *irq = irq_dispatch_and_lock_kernel(inr); 286 288 if (irq) 287 289 return irq; 288 290 289 return irq_dispatch_and_lock_ kernel(inr);290 } 291 292 irq_t *irq = irq_dispatch_and_lock_ kernel(inr);291 return irq_dispatch_and_lock_uspace(inr); 292 } 293 294 irq_t *irq = irq_dispatch_and_lock_uspace(inr); 293 295 if (irq) 294 296 return irq; 295 297 296 return irq_dispatch_and_lock_ uspace(inr);298 return irq_dispatch_and_lock_kernel(inr); 297 299 } 298 300 -
kernel/generic/src/debug/panic.c
r15f3c3f r86ffa27f 48 48 uintptr_t address, const char *fmt, ...) 49 49 { 50 va_list args; 51 52 silent = false; 50 console_override = true; 53 51 54 52 printf("\n%s Kernel panic ", BANNER_LEFT); … … 57 55 printf("due to "); 58 56 57 va_list args; 59 58 va_start(args, fmt); 60 59 if (cat == PANIC_ASSERT) { -
kernel/generic/src/lib/elf.c
r15f3c3f r86ffa27f 47 47 #include <macros.h> 48 48 #include <arch.h> 49 50 #include <lib/elf_load.h> 49 51 50 52 static const char *error_codes[] = { -
kernel/generic/src/lib/rd.c
r15f3c3f r86ffa27f 91 91 rd_parea.frames = SIZE2FRAMES(dsize); 92 92 rd_parea.unpriv = false; 93 rd_parea.mapped = false; 93 94 ddi_parea_register(&rd_parea); 94 95 -
kernel/generic/src/mm/as.c
r15f3c3f r86ffa27f 1284 1284 * thing which is forbidden in this context is locking the address space. 1285 1285 * 1286 * When this function is en etered, no spinlocks may be held.1286 * When this function is entered, no spinlocks may be held. 1287 1287 * 1288 1288 * @param old Old address space or NULL. -
kernel/generic/src/proc/program.c
r15f3c3f r86ffa27f 48 48 #include <ipc/ipcrsc.h> 49 49 #include <security/cap.h> 50 #include <lib/elf .h>50 #include <lib/elf_load.h> 51 51 #include <errno.h> 52 52 #include <print.h> -
kernel/generic/src/syscall/syscall.c
r15f3c3f r86ffa27f 186 186 (syshandler_t) sys_sysinfo_get_data, 187 187 188 /* Debug calls */ 189 (syshandler_t) sys_debug_enable_console, 190 (syshandler_t) sys_debug_disable_console 188 /* Kernel console syscalls. */ 189 (syshandler_t) sys_debug_activate_console 191 190 }; 192 191 -
kernel/generic/src/time/clock.c
r15f3c3f r86ffa27f 94 94 clock_parea.frames = 1; 95 95 clock_parea.unpriv = true; 96 clock_parea.mapped = false; 96 97 ddi_parea_register(&clock_parea); 97 98
Note:
See TracChangeset
for help on using the changeset viewer.
