Changes in / [bfd7aac:01a9ef5] in mainline
- Files:
-
- 11 added
- 82 deleted
- 89 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
rbfd7aac r01a9ef5 77 77 @ "us" UltraSPARC I-II subarchitecture 78 78 @ "us3" UltraSPARC III-IV subarchitecture 79 @ "sun4v" Niagara (sun4v)80 79 ! [PLATFORM=sparc64&MACHINE=generic] PROCESSOR (choice) 81 80 … … 258 257 259 258 % Compiler 260 @ "gcc_cross" GNU C Compiler (cross-compiler)261 259 @ "gcc_native" GNU C Compiler (native) 262 260 @ "clang" Clang … … 264 262 265 263 266 ## Cross-compiler target for abstract architecture267 268 % Cross-compiler target269 @ "arm32" ARM 32-bit270 @ "ia32" Intel IA-32271 @ "mips32" MIPS 32-bit272 ! [PLATFORM=abs32le&COMPILER=gcc_cross] CROSS_TARGET (choice)273 274 275 264 ## Kernel configuration 276 265 … … 294 283 295 284 % Software integer division support 296 ! [PLATFORM= abs32le|PLATFORM=ia32|PLATFORM=arm32|PLATFORM=ia64|PLATFORM=mips32|PLATFORM=ppc32] CONFIG_SOFTINT (y)285 ! [PLATFORM=ia32|PLATFORM=arm32|PLATFORM=ia64|PLATFORM=mips32|PLATFORM=ppc32] CONFIG_SOFTINT (y) 297 286 298 287 % ASID support … … 456 445 457 446 % Serial line input module 458 ! [CONFIG_DSRLNIN=y|(PLATFORM=ia64&MACHINE=i460GX&CONFIG_NS16550=y)|(PLATFORM=ia64&MACHINE=ski)|(PLATFORM=sparc64&MACHINE=serengeti&CONFIG_SGCN_KBD=y) |(PLATFORM=sparc64&PROCESSOR=sun4v)] CONFIG_SRLN (y)447 ! [CONFIG_DSRLNIN=y|(PLATFORM=ia64&MACHINE=i460GX&CONFIG_NS16550=y)|(PLATFORM=ia64&MACHINE=ski)|(PLATFORM=sparc64&MACHINE=serengeti&CONFIG_SGCN_KBD=y)] CONFIG_SRLN (y) 459 448 460 449 % EGA support -
boot/Makefile.common
rbfd7aac r01a9ef5 102 102 $(USPACEDIR)/srv/net/app/nettest2/nettest2 103 103 104 ifneq ($(NETWORKING), none)105 104 NET_CFG = \ 106 105 $(USPACEDIR)/srv/net/cfg/$(NETWORKING)/general \ 107 106 $(USPACEDIR)/srv/net/cfg/$(NETWORKING)/lo \ 108 107 $(USPACEDIR)/srv/net/cfg/$(NETWORKING)/ne2k 109 endif110 108 111 109 ifeq ($(NETWORKING), module) -
boot/arch/sparc64/loader/asm.S
rbfd7aac r01a9ef5 115 115 */ 116 116 117 #if defined (SUN4U)118 117 /* 119 118 * US3 processors have a write-invalidate cache, so explicitly … … 129 128 call icache_flush 130 129 nop 131 #endif130 132 131 1: 133 132 membar #StoreStore -
boot/arch/sparc64/loader/main.c
rbfd7aac r01a9ef5 57 57 #endif 58 58 59 /** UltraSPARC subarchitecture - 1 for US, 3 for US3 , 0 for other*/60 static uint8_t subarchitecture = 0;59 /** UltraSPARC subarchitecture - 1 for US, 3 for US3 */ 60 static uint8_t subarchitecture; 61 61 62 62 /** … … 69 69 static void version_print(void) 70 70 { 71 72 71 printf("HelenOS SPARC64 Bootloader\nRelease %s%s%s\n" 73 72 "Copyright (c) 2006 HelenOS project\n", … … 84 83 #define US_IIIi_CODE 0x15 85 84 86 /* max. length of the "compatible" property of the root node */87 #define COMPATIBLE_PROP_MAXLEN 6488 89 /*90 * HelenOS bootloader will use these constants to distinguish particular91 * UltraSPARC architectures92 */93 #define COMPATIBLE_SUN4U 1094 #define COMPATIBLE_SUN4V 2095 96 /** US architecture. COMPATIBLE_SUN4U for sun4v, COMPATIBLE_SUN4V for sun4u */97 static uint8_t architecture;98 99 85 /** 100 * Detects the UltraSPARC architecture (sun4u and sun4v currently supported) 101 * by inspecting the property called "compatible" in the OBP root node. 102 */ 103 static void detect_architecture(void) 104 { 105 phandle root = ofw_find_device("/"); 106 char compatible[COMPATIBLE_PROP_MAXLEN]; 107 108 if (ofw_get_property(root, "compatible", compatible, 109 COMPATIBLE_PROP_MAXLEN) <= 0) { 110 printf("Unable to determine architecture, default: sun4u.\n"); 111 architecture = COMPATIBLE_SUN4U; 112 return; 113 } 114 115 if (strcmp(compatible, "sun4v") == 0) { 116 architecture = COMPATIBLE_SUN4V; 117 } else { 118 /* 119 * As not all sun4u machines have "sun4u" in their "compatible" 120 * OBP property (e.g. Serengeti's OBP "compatible" property is 121 * "SUNW,Serengeti"), we will by default fallback to sun4u if 122 * an unknown value of the "compatible" property is encountered. 123 */ 124 architecture = COMPATIBLE_SUN4U; 125 } 126 } 127 128 129 /** 130 * Detects the subarchitecture (US, US3) of the sun4u 131 * processor. Sets the global variables "subarchitecture" and "mid_mask" to 86 * Sets the global variables "subarchitecture" and "mid_mask" to 132 87 * correct values. 133 88 */ … … 154 109 } 155 110 156 /**157 * Performs sun4u-specific initialization. The components are expected158 * to be already copied and boot allocator initialized.159 *160 * @param base kernel base virtual address161 * @param top virtual address above which the boot allocator162 * can make allocations163 */164 static void bootstrap_sun4u(void *base, unsigned int top)165 {166 void *balloc_base;167 /*168 * Claim and map the physical memory for the boot allocator.169 * Initialize the boot allocator.170 */171 balloc_base = base + ALIGN_UP(top, PAGE_SIZE);172 (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base,173 BALLOC_MAX_SIZE);174 (void) ofw_map(bootinfo.physmem_start + balloc_base, balloc_base,175 BALLOC_MAX_SIZE, -1);176 balloc_init(&bootinfo.ballocs, (uintptr_t) balloc_base,177 (uintptr_t) balloc_base);178 179 printf("Setting up screens...");180 ofw_setup_screens();181 printf("done.\n");182 183 printf("Canonizing OpenFirmware device tree...");184 bootinfo.ofw_root = ofw_tree_build();185 printf("done.\n");186 187 #ifdef CONFIG_AP188 printf("Checking for secondary processors...");189 if (!ofw_cpu(mid_mask, bootinfo.physmem_start))190 printf("Error: unable to get CPU properties\n");191 printf("done.\n");192 #endif193 194 }195 196 /**197 * * Performs sun4v-specific initialization. The components are expected198 * * to be already copied and boot allocator initialized.199 * */200 static void bootstrap_sun4v(void)201 {202 /*203 * When SILO booted, the OBP had established a virtual to physical204 * memory mapping. This mapping is not an identity (because the205 * physical memory starts on non-zero address) - this is not206 * surprising. But! The mapping even does not map virtual address207 * 0 onto the starting address of the physical memory, but onto an208 * address which is 0x400000 bytes higher. The reason is that the209 * OBP had already used the memory just at the beginning of the210 * physical memory, so that memory cannot be used by SILO (nor211 * bootloader). As for now, we solve it by a nasty workaround:212 * we pretend that the physical memory starts 0x400000 bytes further213 * than it actually does (and hence pretend that the physical memory214 * is 0x400000 bytes smaller). Of course, the value 0x400000 will most215 * probably depend on the machine and OBP version (the workaround now216 * works on Simics). A solution would be to inspect the "available"217 * property of the "/memory" node to find out which parts of memory218 * are used by OBP and redesign the algorithm of copying219 * kernel/init tasks/ramdisk from the bootable image to memory220 * (which we must do anyway because of issues with claiming the memory221 * on Serengeti).222 */223 bootinfo.physmem_start += 0x400000;224 bootinfo.memmap.zones[0].start += 0x400000;225 bootinfo.memmap.zones[0].size -= 0x400000;226 printf("The sun4v init finished.");227 }228 229 230 111 void bootstrap(void) 231 112 { 232 113 void *base = (void *) KERNEL_VIRTUAL_ADDRESS; 114 void *balloc_base; 233 115 unsigned int top = 0; 234 116 unsigned int i; 235 117 unsigned int j; 236 118 237 detect_architecture(); 119 version_print(); 120 121 detect_subarchitecture(); 238 122 init_components(components); 239 123 … … 376 260 printf("done.\n"); 377 261 378 /* perform architecture-specific initialization */ 379 if (architecture == COMPATIBLE_SUN4U) { 380 bootstrap_sun4u(base, top); 381 } else if (architecture == COMPATIBLE_SUN4V) { 382 bootstrap_sun4v(); 383 } else { 384 printf("Unknown architecture.\n"); 385 halt(); 386 } 262 /* 263 * Claim and map the physical memory for the boot allocator. 264 * Initialize the boot allocator. 265 */ 266 balloc_base = base + ALIGN_UP(top, PAGE_SIZE); 267 (void) ofw_claim_phys(bootinfo.physmem_start + balloc_base, 268 BALLOC_MAX_SIZE); 269 (void) ofw_map(bootinfo.physmem_start + balloc_base, balloc_base, 270 BALLOC_MAX_SIZE, -1); 271 balloc_init(&bootinfo.ballocs, (uintptr_t) balloc_base, 272 (uintptr_t) balloc_base); 273 274 printf("Setting up screens..."); 275 ofw_setup_screens(); 276 printf("done.\n"); 277 278 printf("Canonizing OpenFirmware device tree..."); 279 bootinfo.ofw_root = ofw_tree_build(); 280 printf("done.\n"); 281 282 #ifdef CONFIG_AP 283 printf("Checking for secondary processors..."); 284 if (!ofw_cpu(mid_mask, bootinfo.physmem_start)) 285 printf("Error: unable to get CPU properties\n"); 286 printf("done.\n"); 287 #endif 387 288 388 289 printf("Booting the kernel...\n"); -
defaults/arm32/Makefile.config
rbfd7aac r01a9ef5 39 39 40 40 # Default networking architecture 41 NETWORKING = none41 NETWORKING = modular -
defaults/mips32/Makefile.config
rbfd7aac r01a9ef5 45 45 46 46 # Default networking architecture 47 NETWORKING = none47 NETWORKING = modular -
defaults/ppc32/Makefile.config
rbfd7aac r01a9ef5 45 45 46 46 # Default networking architecture 47 NETWORKING = none47 NETWORKING = modular -
defaults/special/Makefile.config
rbfd7aac r01a9ef5 3 3 4 4 # Compiler 5 COMPILER = gcc_ cross5 COMPILER = gcc_native 6 6 7 7 # Support for SMP -
defaults/special/abs32le/Makefile.config
rbfd7aac r01a9ef5 1 1 # Platform 2 2 PLATFORM = abs32le 3 4 # Cross-compiler target5 CROSS_TARGET = ia326 7 # Networking architecture8 NETWORKING = none -
kernel/Makefile.build
rbfd7aac r01a9ef5 115 115 OBJCOPY = $(BINUTILS_PREFIX)objcopy 116 116 OBJDUMP = $(BINUTILS_PREFIX)objdump 117 LIBDIR = /usr/lib 117 118 CFLAGS = $(GCC_CFLAGS) 118 119 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS) … … 126 127 OBJCOPY = $(TOOLCHAIN_DIR)/bin/$(TARGET)-objcopy 127 128 OBJDUMP = $(TOOLCHAIN_DIR)/bin/$(TARGET)-objdump 129 LIBDIR = $(TOOLCHAIN_DIR)/lib 128 130 CFLAGS = $(GCC_CFLAGS) 129 131 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS) … … 137 139 OBJCOPY = objcopy 138 140 OBJDUMP = objdump 141 LIBDIR = /usr/lib 139 142 CFLAGS = $(ICC_CFLAGS) 140 143 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS) … … 148 151 OBJCOPY = $(BINUTILS_PREFIX)objcopy 149 152 OBJDUMP = $(BINUTILS_PREFIX)objdump 153 LIBDIR = /usr/lib 150 154 CFLAGS = $(SUNCC_CFLAGS) 151 155 DEFS += $(CONFIG_DEFS) … … 160 164 OBJCOPY = $(BINUTILS_PREFIX)objcopy 161 165 OBJDUMP = $(BINUTILS_PREFIX)objdump 166 LIBDIR = /usr/lib 162 167 CFLAGS = $(CLANG_CFLAGS) 163 168 DEPEND_DEFS = $(DEFS) $(CONFIG_DEFS) -
kernel/arch/abs32le/Makefile.inc
rbfd7aac r01a9ef5 30 30 # 31 31 32 BFD = binary33 34 ifeq ($(COMPILER),gcc_cross)35 TOOLCHAIN_DIR = $(CROSS_PREFIX)/$(CROSS_TARGET)36 37 ifeq ($(CROSS_TARGET),arm32)38 TARGET = arm-linux-gnu39 ATSIGN = %40 endif41 42 ifeq ($(CROSS_TARGET),ia32)43 TARGET = i686-pc-linux-gnu44 endif45 46 ifeq ($(CROSS_TARGET),mips32)47 TARGET = mipsel-linux-gnu48 GCC_CFLAGS += -mno-abicalls49 endif50 endif51 52 32 BITS = 32 53 33 ENDIANESS = LE … … 63 43 arch/$(KARCH)/src/ddi/ddi.c \ 64 44 arch/$(KARCH)/src/smp/smp.c \ 65 arch/$(KARCH)/src/smp/ipi.c \66 45 arch/$(KARCH)/src/mm/as.c \ 67 46 arch/$(KARCH)/src/mm/frame.c \ -
kernel/arch/abs32le/include/asm.h
rbfd7aac r01a9ef5 40 40 #include <config.h> 41 41 42 static inline void asm_delay_loop(uint32_t usec) 43 { 44 } 42 extern void interrupt_handlers(void); 43 44 extern void enable_l_apic_in_msr(void); 45 46 47 extern void asm_delay_loop(uint32_t); 48 extern void asm_fake_loop(uint32_t); 49 45 50 46 51 static inline __attribute__((noreturn)) void cpu_halt(void) -
kernel/arch/abs32le/include/atomic.h
rbfd7aac r01a9ef5 81 81 #define atomic_predec(val) (atomic_postdec(val) - 1) 82 82 83 static inline uint32_t test_and_set(atomic_t *val) 84 { 85 uint32_t prev = val->count; 86 val->count = 1; 87 return prev; 83 static inline uint32_t test_and_set(atomic_t *val) { 84 uint32_t v; 85 86 asm volatile ( 87 "movl $1, %[v]\n" 88 "xchgl %[v], %[count]\n" 89 : [v] "=r" (v), [count] "+m" (val->count) 90 ); 91 92 return v; 88 93 } 89 94 95 /** ia32 specific fast spinlock */ 90 96 static inline void atomic_lock_arch(atomic_t *val) 91 97 { 92 do { 93 while (val->count); 94 } while (test_and_set(val)); 98 uint32_t tmp; 99 100 preemption_disable(); 101 asm volatile ( 102 "0:\n" 103 "pause\n" /* Pentium 4's HT love this instruction */ 104 "mov %[count], %[tmp]\n" 105 "testl %[tmp], %[tmp]\n" 106 "jnz 0b\n" /* lightweight looping on locked spinlock */ 107 108 "incl %[tmp]\n" /* now use the atomic operation */ 109 "xchgl %[count], %[tmp]\n" 110 "testl %[tmp], %[tmp]\n" 111 "jnz 0b\n" 112 : [count] "+m" (val->count), [tmp] "=&r" (tmp) 113 ); 114 /* 115 * Prevent critical section code from bleeding out this way up. 116 */ 117 CS_ENTER_BARRIER(); 95 118 } 96 119 -
kernel/arch/abs32le/include/barrier.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup abs32le29 /** @addtogroup ia32 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef KERN_abs32le_BARRIER_H_ 36 #define KERN_abs32le_BARRIER_H_ 35 #ifndef KERN_ia32_BARRIER_H_ 36 #define KERN_ia32_BARRIER_H_ 37 38 /* 39 * NOTE: 40 * No barriers for critical section (i.e. spinlock) on IA-32 are needed: 41 * - spinlock_lock() and spinlock_trylock() use serializing XCHG instruction 42 * - writes cannot pass reads on IA-32 => spinlock_unlock() needs no barriers 43 */ 37 44 38 45 /* … … 40 47 */ 41 48 42 #define CS_ENTER_BARRIER() 43 #define CS_LEAVE_BARRIER() 49 #define CS_ENTER_BARRIER() asm volatile ("" ::: "memory") 50 #define CS_LEAVE_BARRIER() asm volatile ("" ::: "memory") 44 51 45 #define memory_barrier() 46 #define read_barrier() 47 #define write_barrier() 52 static inline void cpuid_serialization(void) 53 { 54 asm volatile ( 55 "xorl %%eax, %%eax\n" 56 "cpuid\n" 57 ::: "eax", "ebx", "ecx", "edx", "memory" 58 ); 59 } 48 60 49 #define smc_coherence(addr) 50 #define smc_coherence_block(addr, size) 61 #if defined(CONFIG_FENCES_P4) 62 #define memory_barrier() asm volatile ("mfence\n" ::: "memory") 63 #define read_barrier() asm volatile ("lfence\n" ::: "memory") 64 #ifdef CONFIG_WEAK_MEMORY 65 #define write_barrier() asm volatile ("sfence\n" ::: "memory") 66 #else 67 #define write_barrier() asm volatile ("" ::: "memory"); 68 #endif 69 #elif defined(CONFIG_FENCES_P3) 70 #define memory_barrier() cpuid_serialization() 71 #define read_barrier() cpuid_serialization() 72 #ifdef CONFIG_WEAK_MEMORY 73 #define write_barrier() asm volatile ("sfence\n" ::: "memory") 74 #else 75 #define write_barrier() asm volatile ("" ::: "memory"); 76 #endif 77 #else 78 #define memory_barrier() cpuid_serialization() 79 #define read_barrier() cpuid_serialization() 80 #ifdef CONFIG_WEAK_MEMORY 81 #define write_barrier() cpuid_serialization() 82 #else 83 #define write_barrier() asm volatile ("" ::: "memory"); 84 #endif 85 #endif 86 87 /* 88 * On ia32, the hardware takes care about instruction and data cache coherence, 89 * even on SMP systems. We issue a write barrier to be sure that writes 90 * queueing in the store buffer drain to the memory (even though it would be 91 * sufficient for them to drain to the D-cache). 92 */ 93 #define smc_coherence(a) write_barrier() 94 #define smc_coherence_block(a, l) write_barrier() 51 95 52 96 #endif -
kernel/arch/abs32le/include/context.h
rbfd7aac r01a9ef5 40 40 41 41 #define context_set(ctx, pc, stack, size) \ 42 42 context_set_generic(ctx, pc, stack, size) 43 43 44 44 /* -
kernel/arch/abs32le/include/context_offset.h
rbfd7aac r01a9ef5 37 37 38 38 #define OFFSET_PC 0x00 39 #define OFFSET_IPL 0x04 39 40 #ifdef KERNEL 41 #define OFFSET_IPL 0x04 42 #else 43 #define OFFSET_TLS 0x04 44 #endif 40 45 41 46 #endif -
kernel/arch/abs32le/include/memstr.h
rbfd7aac r01a9ef5 36 36 #define KERN_abs32le_MEMSTR_H_ 37 37 38 #define memcpy(dst, src, cnt) _memcpy((dst), (src), (cnt)) 39 #define memsetb(dst, cnt, val) _memsetb((dst), (cnt), (val)) 40 #define memsetw(dst, cnt, val) _memsetw((dst), (cnt), (val)) 38 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 39 40 extern void memsetw(void *, size_t, uint16_t); 41 extern void memsetb(void *, size_t, uint8_t); 42 43 extern int memcmp(const void *, const void *, size_t); 41 44 42 45 #endif -
kernel/arch/abs32le/include/mm/frame.h
rbfd7aac r01a9ef5 40 40 41 41 #ifdef KERNEL 42 #ifndef __ASM__ 42 43 43 44 #include <arch/types.h> … … 46 47 extern void physmem_print(void); 47 48 49 #endif /* __ASM__ */ 48 50 #endif /* KERNEL */ 49 51 -
kernel/arch/abs32le/include/mm/page.h
rbfd7aac r01a9ef5 43 43 #ifdef KERNEL 44 44 45 #define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) 46 #define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) 45 #ifndef __ASM__ 46 #define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) 47 #define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) 48 #else 49 #define KA2PA(x) ((x) - 0x80000000) 50 #define PA2KA(x) ((x) + 0x80000000) 51 #endif 47 52 48 53 /* … … 117 122 #define PTE_EXECUTABLE_ARCH(p) 1 118 123 124 #ifndef __ASM__ 125 119 126 #include <mm/mm.h> 120 127 #include <arch/interrupt.h> … … 122 129 #include <typedefs.h> 123 130 131 /* Page fault error codes. */ 132 133 /** When bit on this position is 0, the page fault was caused by a not-present 134 * page. 135 */ 136 #define PFERR_CODE_P (1 << 0) 137 138 /** When bit on this position is 1, the page fault was caused by a write. */ 139 #define PFERR_CODE_RW (1 << 1) 140 141 /** When bit on this position is 1, the page fault was caused in user mode. */ 142 #define PFERR_CODE_US (1 << 2) 143 144 /** When bit on this position is 1, a reserved bit was set in page directory. */ 145 #define PFERR_CODE_RSVD (1 << 3) 146 124 147 /** Page Table Entry. */ 125 148 typedef struct { 126 unsigned int present : 1; 127 unsigned int writeable : 1; 128 unsigned int uaccessible : 1; 129 unsigned int page_write_through : 1; 130 unsigned int page_cache_disable : 1; 131 unsigned int accessed : 1; 132 unsigned int dirty : 1; 133 unsigned int pat : 1; 134 unsigned int global : 1; 135 136 /** Valid content even if the present bit is not set. */ 137 unsigned int soft_valid : 1; 138 unsigned int avl : 2; 139 unsigned int frame_address : 20; 140 } __attribute__((packed)) pte_t; 149 unsigned present : 1; 150 unsigned writeable : 1; 151 unsigned uaccessible : 1; 152 unsigned page_write_through : 1; 153 unsigned page_cache_disable : 1; 154 unsigned accessed : 1; 155 unsigned dirty : 1; 156 unsigned pat : 1; 157 unsigned global : 1; 158 unsigned soft_valid : 1; /**< Valid content even if the present bit is not set. */ 159 unsigned avl : 2; 160 unsigned frame_address : 20; 161 } __attribute__ ((packed)) pte_t; 141 162 142 163 static inline unsigned int get_pt_flags(pte_t *pt, size_t i) … … 171 192 172 193 extern void page_arch_init(void); 173 extern void page_fault(int, istate_t *); 194 extern void page_fault(int n, istate_t *istate); 195 196 #endif /* __ASM__ */ 174 197 175 198 #endif /* KERNEL */ -
kernel/arch/abs32le/src/abs32le.c
rbfd7aac r01a9ef5 35 35 #include <arch.h> 36 36 #include <arch/types.h> 37 #include <arch/context.h> 37 38 #include <arch/interrupt.h> 38 39 #include <arch/asm.h> … … 40 41 #include <func.h> 41 42 #include <config.h> 42 #include <errno.h>43 43 #include <context.h> 44 #include <fpu_context.h>45 44 #include <interrupt.h> 46 #include <syscall/copy.h>47 45 #include <ddi/irq.h> 48 46 #include <proc/thread.h> … … 51 49 #include <sysinfo/sysinfo.h> 52 50 #include <memstr.h> 53 54 char memcpy_from_uspace_failover_address;55 char memcpy_to_uspace_failover_address;56 51 57 52 void arch_pre_mm_init(void) … … 88 83 unative_t sys_tls_set(unative_t addr) 89 84 { 90 return EOK;85 return 0; 91 86 } 92 87 … … 114 109 } 115 110 111 void memsetb(void *dst, size_t cnt, uint8_t val) 112 { 113 _memsetb(dst, cnt, val); 114 } 115 116 void memsetw(void *dst, size_t cnt, uint16_t val) 117 { 118 _memsetw(dst, cnt, val); 119 } 120 116 121 void panic_printf(char *fmt, ...) 117 122 { … … 135 140 } 136 141 137 void fpu_init(void)138 {139 }140 141 void fpu_context_save(fpu_context_t *ctx)142 {143 }144 145 void fpu_context_restore(fpu_context_t *ctx)146 {147 }148 149 int memcpy_from_uspace(void *dst, const void *uspace_src, size_t size)150 {151 return EOK;152 }153 154 int memcpy_to_uspace(void *uspace_dst, const void *src, size_t size)155 {156 return EOK;157 }158 159 142 /** @} 160 143 */ -
kernel/arch/abs32le/src/debug/stacktrace.c
rbfd7aac r01a9ef5 40 40 bool kernel_frame_pointer_validate(uintptr_t fp) 41 41 { 42 return true; 42 return true;; 43 43 } 44 44 -
kernel/arch/amd64/include/memstr.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup amd64 29 /** @addtogroup amd64 30 30 * @{ 31 31 */ … … 38 38 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 39 39 40 extern void memsetw(void *, size_t, uint16_t); 41 extern void memsetb(void *, size_t, uint8_t); 40 extern void memsetw(void *dst, size_t cnt, uint16_t x); 41 extern void memsetb(void *dst, size_t cnt, uint8_t x); 42 43 extern int memcmp(const void *a, const void *b, size_t cnt); 42 44 43 45 #endif -
kernel/arch/amd64/src/debugger.c
rbfd7aac r01a9ef5 201 201 202 202 /* Send IPI */ 203 #ifdef CONFIG_SMP 203 204 // ipi_broadcast(VECTOR_DEBUG_IPI); 205 #endif 204 206 205 207 return curidx; … … 260 262 spinlock_unlock(&bkpoint_lock); 261 263 interrupts_restore(ipl); 262 // ipi_broadcast(VECTOR_DEBUG_IPI); 264 #ifdef CONFIG_SMP 265 // ipi_broadcast(VECTOR_DEBUG_IPI); 266 #endif 263 267 } 264 268 -
kernel/arch/arm32/include/memstr.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup arm32 29 /** @addtogroup arm32 30 30 * @{ 31 31 */ … … 39 39 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 40 40 41 extern void memsetw(void *, size_t, uint16_t); 42 extern void memsetb(void *, size_t, uint8_t); 41 extern void memsetw(void *dst, size_t cnt, uint16_t x); 42 extern void memsetb(void *dst, size_t cnt, uint8_t x); 43 44 extern int memcmp(const void *a, const void *b, size_t cnt); 43 45 44 46 #endif -
kernel/arch/ia32/include/memstr.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup ia32 29 /** @addtogroup ia32 30 30 * @{ 31 31 */ … … 38 38 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 39 39 40 extern void memsetw(void *, size_t, uint16_t); 41 extern void memsetb(void *, size_t, uint8_t); 40 extern void memsetw(void *dst, size_t cnt, uint16_t x); 41 extern void memsetb(void *dst, size_t cnt, uint8_t x); 42 43 extern int memcmp(const void *a, const void *b, size_t cnt); 42 44 43 45 #endif -
kernel/arch/ia32/src/smp/ipi.c
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup ia32 29 /** @addtogroup ia32 30 30 * @{ 31 31 */ -
kernel/arch/ia64/include/memstr.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup ia64 29 /** @addtogroup ia64 30 30 * @{ 31 31 */ … … 38 38 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 39 39 40 extern void memsetw(void *, size_t, uint16_t); 41 extern void memsetb(void *, size_t, uint8_t); 40 extern void memsetw(void *dst, size_t cnt, uint16_t x); 41 extern void memsetb(void *dst, size_t cnt, uint8_t x); 42 43 extern int memcmp(const void *a, const void *b, size_t cnt); 42 44 43 45 #endif -
kernel/arch/ia64/src/ia64.c
rbfd7aac r01a9ef5 214 214 215 215 #ifdef CONFIG_NETIF_DP8390 216 trap_virtual_enable_irqs(1 << IRQ_DP8390); 216 217 sysinfo_set_item_val("netif.dp8390.inr", NULL, IRQ_DP8390); 217 218 #endif -
kernel/arch/mips32/include/memstr.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup mips32 29 /** @addtogroup mips32 30 30 * @{ 31 31 */ … … 38 38 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 39 39 40 extern void memsetw(void *, size_t, uint16_t); 41 extern void memsetb(void *, size_t, uint8_t); 40 extern void memsetw(void *dst, size_t cnt, uint16_t x); 41 extern void memsetb(void *dst, size_t cnt, uint8_t x); 42 43 extern int memcmp(const void *a, const void *b, size_t cnt); 42 44 43 45 #endif -
kernel/arch/mips32/src/smp/dorder.c
rbfd7aac r01a9ef5 33 33 */ 34 34 35 #include <smp/ipi.h> 36 37 #ifdef CONFIG_SMP 35 #include <arch/smp/dorder.h> 38 36 39 37 #define MSIM_DORDER_ADDRESS 0xB0000004 … … 41 39 void ipi_broadcast_arch(int ipi) 42 40 { 41 #ifdef CONFIG_SMP 43 42 *((volatile unsigned int *) MSIM_DORDER_ADDRESS) = 0x7FFFFFFF; 43 #endif 44 44 } 45 46 #endif47 45 48 46 /** @} -
kernel/arch/ppc32/include/memstr.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup ppc32 29 /** @addtogroup ppc32 30 30 * @{ 31 31 */ … … 38 38 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 39 39 40 extern void memsetw(void *, size_t, uint16_t); 41 extern void memsetb(void *, size_t, uint8_t); 40 extern void memsetw(void *dst, size_t cnt, uint16_t x); 41 extern void memsetb(void *dst, size_t cnt, uint8_t x); 42 43 extern int memcmp(const void *a, const void *b, size_t cnt); 42 44 43 45 #endif -
kernel/arch/sparc64/Makefile.inc
rbfd7aac r01a9ef5 46 46 ifeq ($(PROCESSOR),us) 47 47 DEFS += -DUS 48 DEFS += -DSUN4U49 USARCH = sun4u50 48 endif 51 49 52 50 ifeq ($(PROCESSOR),us3) 53 51 DEFS += -DUS3 54 DEFS += -DSUN4U55 USARCH = sun4u56 endif57 58 ifeq ($(PROCESSOR),sun4v)59 DEFS += -DSUN4V60 USARCH = sun4v61 #MH62 DEFS += -DUS63 52 endif 64 53 65 54 ARCH_SOURCES = \ 66 arch/$(KARCH)/src/cpu/ $(USARCH)/cpu.c \55 arch/$(KARCH)/src/cpu/cpu.c \ 67 56 arch/$(KARCH)/src/debug/stacktrace.c \ 68 57 arch/$(KARCH)/src/debug/stacktrace_asm.S \ 69 58 arch/$(KARCH)/src/asm.S \ 70 arch/$(KARCH)/src/$(USARCH)/asm.S \71 59 arch/$(KARCH)/src/panic.S \ 72 60 arch/$(KARCH)/src/console.c \ … … 74 62 arch/$(KARCH)/src/fpu_context.c \ 75 63 arch/$(KARCH)/src/dummy.s \ 76 arch/$(KARCH)/src/mm/ $(USARCH)/as.c \64 arch/$(KARCH)/src/mm/as.c \ 77 65 arch/$(KARCH)/src/mm/cache.S \ 78 arch/$(KARCH)/src/mm/ $(USARCH)/frame.c \66 arch/$(KARCH)/src/mm/frame.c \ 79 67 arch/$(KARCH)/src/mm/page.c \ 80 arch/$(KARCH)/src/mm/ $(USARCH)/tlb.c \81 arch/$(KARCH)/src/ $(USARCH)/sparc64.c \82 arch/$(KARCH)/src/ $(USARCH)/start.S \83 arch/$(KARCH)/src/proc/ $(USARCH)/scheduler.c \68 arch/$(KARCH)/src/mm/tlb.c \ 69 arch/$(KARCH)/src/sparc64.c \ 70 arch/$(KARCH)/src/start.S \ 71 arch/$(KARCH)/src/proc/scheduler.c \ 84 72 arch/$(KARCH)/src/proc/thread.c \ 85 arch/$(KARCH)/src/trap/ $(USARCH)/mmu.S \86 arch/$(KARCH)/src/trap/ $(USARCH)/trap_table.S \73 arch/$(KARCH)/src/trap/mmu.S \ 74 arch/$(KARCH)/src/trap/trap_table.S \ 87 75 arch/$(KARCH)/src/trap/trap.c \ 88 76 arch/$(KARCH)/src/trap/exception.c \ … … 94 82 arch/$(KARCH)/src/drivers/pci.c \ 95 83 arch/$(KARCH)/src/drivers/fhc.c 96 97 ifeq ($(USARCH),sun4v)98 ARCH_SOURCES += \99 arch/$(KARCH)/src/drivers/niagara.c \100 arch/$(KARCH)/src/sun4v/md.c101 endif102 84 103 85 ifeq ($(CONFIG_FB),y) … … 114 96 ifeq ($(CONFIG_TSB),y) 115 97 ARCH_SOURCES += \ 116 arch/$(KARCH)/src/mm/ $(USARCH)/tsb.c98 arch/$(KARCH)/src/mm/tsb.c 117 99 endif -
kernel/arch/sparc64/include/arch.h
rbfd7aac r01a9ef5 38 38 #define KERN_sparc64_ARCH_H_ 39 39 40 #if defined (SUN4U)41 #include <arch/sun4u/arch.h>42 #elif defined (SUN4V)43 #include <arch/sun4v/arch.h>44 #endif45 46 40 #define ASI_AIUP 0x10 /** Access to primary context with user privileges. */ 47 41 #define ASI_AIUS 0x11 /** Access to secondary context with user privileges. */ 42 #define ASI_NUCLEUS_QUAD_LDD 0x24 /** ASI for 16-byte atomic loads. */ 43 #define ASI_DCACHE_TAG 0x47 /** ASI D-Cache Tag. */ 44 #define ASI_ICBUS_CONFIG 0x4a /** ASI of the UPA_CONFIG/FIREPLANE_CONFIG register. */ 48 45 49 46 #define NWINDOWS 8 /** Number of register window sets. */ … … 55 52 #endif /* __ASM__ */ 56 53 57 58 54 #endif 59 55 -
kernel/arch/sparc64/include/cpu.h
rbfd7aac r01a9ef5 64 64 #endif 65 65 66 typedef struct { 67 uint32_t mid; /**< Processor ID as read from 68 UPA_CONFIG/FIREPLANE_CONFIG. */ 69 ver_reg_t ver; 70 uint32_t clock_frequency; /**< Processor frequency in Hz. */ 71 uint64_t next_tick_cmpr; /**< Next clock interrupt should be 72 generated when the TICK register 73 matches this value. */ 74 } cpu_arch_t; 66 75 67 #if defined (SUN4U) 68 #include <arch/sun4u/cpu.h> 69 #elif defined (SUN4V) 70 #include <arch/sun4v/cpu.h> 76 77 /** 78 * Reads the module ID (agent ID/CPUID) of the current CPU. 79 */ 80 static inline uint32_t read_mid(void) 81 { 82 uint64_t icbus_config = asi_u64_read(ASI_ICBUS_CONFIG, 0); 83 icbus_config = icbus_config >> ICBUS_CONFIG_MID_SHIFT; 84 #if defined (US) 85 return icbus_config & 0x1f; 86 #elif defined (US3) 87 if (((ver_reg_t) ver_read()).impl == IMPL_ULTRASPARCIII_I) 88 return icbus_config & 0x1f; 89 else 90 return icbus_config & 0x3ff; 71 91 #endif 72 92 } 73 93 74 94 #endif -
kernel/arch/sparc64/include/drivers/tick.h
rbfd7aac r01a9ef5 36 36 #define KERN_sparc64_TICK_H_ 37 37 38 #include <arch/asm.h>39 38 #include <arch/interrupt.h> 40 41 /* mask of the "counter" field of the Tick register */42 #define TICK_COUNTER_MASK (~(1l << 63))43 39 44 40 extern void tick_init(void); 45 41 extern void tick_interrupt(int n, istate_t *istate); 46 47 /**48 * Reads the Tick register counter.49 */50 static inline uint64_t tick_counter_read(void)51 {52 return TICK_COUNTER_MASK & tick_read();53 }54 42 55 43 #endif -
kernel/arch/sparc64/include/memstr.h
rbfd7aac r01a9ef5 38 38 #define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) 39 39 40 extern void memsetw(void *, size_t, uint16_t); 41 extern void memsetb(void *, size_t, uint8_t); 40 extern void memsetw(void *dst, size_t cnt, uint16_t x); 41 extern void memsetb(void *dst, size_t cnt, uint8_t x); 42 43 extern int memcmp(const void *a, const void *b, size_t cnt); 42 44 43 45 #endif -
kernel/arch/sparc64/include/mm/frame.h
rbfd7aac r01a9ef5 36 36 #define KERN_sparc64_FRAME_H_ 37 37 38 #if defined (SUN4U) 39 #include <arch/mm/sun4u/frame.h> 40 #elif defined (SUN4V) 41 #include <arch/mm/sun4v/frame.h> 38 /* 39 * Page size supported by the MMU. 40 * For 8K there is the nasty illegal virtual aliasing problem. 41 * Therefore, the kernel uses 8K only internally on the TLB and TSB levels. 42 */ 43 #define MMU_FRAME_WIDTH 13 /* 8K */ 44 #define MMU_FRAME_SIZE (1 << MMU_FRAME_WIDTH) 45 46 /* 47 * Page size exported to the generic memory management subsystems. 48 * This page size is not directly supported by the MMU, but we can emulate 49 * each 16K page with a pair of adjacent 8K pages. 50 */ 51 #define FRAME_WIDTH 14 /* 16K */ 52 #define FRAME_SIZE (1 << FRAME_WIDTH) 53 54 #ifdef KERNEL 55 #ifndef __ASM__ 56 57 #include <arch/types.h> 58 59 union frame_address { 60 uintptr_t address; 61 struct { 62 #if defined (US) 63 unsigned : 23; 64 uint64_t pfn : 28; /**< Physical Frame Number. */ 65 #elif defined (US3) 66 unsigned : 21; 67 uint64_t pfn : 30; /**< Physical Frame Number. */ 68 #endif 69 unsigned offset : 13; /**< Offset. */ 70 } __attribute__ ((packed)); 71 }; 72 73 typedef union frame_address frame_address_t; 74 75 extern uintptr_t last_frame; 76 extern uintptr_t end_of_identity; 77 78 extern void frame_arch_init(void); 79 #define physmem_print() 80 81 #endif 42 82 #endif 43 83 -
kernel/arch/sparc64/include/mm/mmu.h
rbfd7aac r01a9ef5 36 36 #define KERN_sparc64_MMU_H_ 37 37 38 #if defined (SUN4U) 39 #include <arch/mm/sun4u/mmu.h> 40 #elif defined (SUN4V) 41 #include <arch/mm/sun4v/mmu.h> 38 #if defined(US) 39 /* LSU Control Register ASI. */ 40 #define ASI_LSU_CONTROL_REG 0x45 /**< Load/Store Unit Control Register. */ 42 41 #endif 43 42 43 /* I-MMU ASIs. */ 44 #define ASI_IMMU 0x50 45 #define ASI_IMMU_TSB_8KB_PTR_REG 0x51 46 #define ASI_IMMU_TSB_64KB_PTR_REG 0x52 47 #define ASI_ITLB_DATA_IN_REG 0x54 48 #define ASI_ITLB_DATA_ACCESS_REG 0x55 49 #define ASI_ITLB_TAG_READ_REG 0x56 50 #define ASI_IMMU_DEMAP 0x57 51 52 /* Virtual Addresses within ASI_IMMU. */ 53 #define VA_IMMU_TSB_TAG_TARGET 0x0 /**< IMMU TSB tag target register. */ 54 #define VA_IMMU_SFSR 0x18 /**< IMMU sync fault status register. */ 55 #define VA_IMMU_TSB_BASE 0x28 /**< IMMU TSB base register. */ 56 #define VA_IMMU_TAG_ACCESS 0x30 /**< IMMU TLB tag access register. */ 57 #if defined (US3) 58 #define VA_IMMU_PRIMARY_EXTENSION 0x48 /**< IMMU TSB primary extension register */ 59 #define VA_IMMU_NUCLEUS_EXTENSION 0x58 /**< IMMU TSB nucleus extension register */ 60 #endif 61 62 63 /* D-MMU ASIs. */ 64 #define ASI_DMMU 0x58 65 #define ASI_DMMU_TSB_8KB_PTR_REG 0x59 66 #define ASI_DMMU_TSB_64KB_PTR_REG 0x5a 67 #define ASI_DMMU_TSB_DIRECT_PTR_REG 0x5b 68 #define ASI_DTLB_DATA_IN_REG 0x5c 69 #define ASI_DTLB_DATA_ACCESS_REG 0x5d 70 #define ASI_DTLB_TAG_READ_REG 0x5e 71 #define ASI_DMMU_DEMAP 0x5f 72 73 /* Virtual Addresses within ASI_DMMU. */ 74 #define VA_DMMU_TSB_TAG_TARGET 0x0 /**< DMMU TSB tag target register. */ 75 #define VA_PRIMARY_CONTEXT_REG 0x8 /**< DMMU primary context register. */ 76 #define VA_SECONDARY_CONTEXT_REG 0x10 /**< DMMU secondary context register. */ 77 #define VA_DMMU_SFSR 0x18 /**< DMMU sync fault status register. */ 78 #define VA_DMMU_SFAR 0x20 /**< DMMU sync fault address register. */ 79 #define VA_DMMU_TSB_BASE 0x28 /**< DMMU TSB base register. */ 80 #define VA_DMMU_TAG_ACCESS 0x30 /**< DMMU TLB tag access register. */ 81 #define VA_DMMU_VA_WATCHPOINT_REG 0x38 /**< DMMU VA data watchpoint register. */ 82 #define VA_DMMU_PA_WATCHPOINT_REG 0x40 /**< DMMU PA data watchpoint register. */ 83 #if defined (US3) 84 #define VA_DMMU_PRIMARY_EXTENSION 0x48 /**< DMMU TSB primary extension register */ 85 #define VA_DMMU_SECONDARY_EXTENSION 0x50 /**< DMMU TSB secondary extension register */ 86 #define VA_DMMU_NUCLEUS_EXTENSION 0x58 /**< DMMU TSB nucleus extension register */ 87 #endif 88 89 #ifndef __ASM__ 90 91 #include <arch/asm.h> 92 #include <arch/barrier.h> 93 #include <arch/types.h> 94 95 #if defined(US) 96 /** LSU Control Register. */ 97 typedef union { 98 uint64_t value; 99 struct { 100 unsigned : 23; 101 unsigned pm : 8; 102 unsigned vm : 8; 103 unsigned pr : 1; 104 unsigned pw : 1; 105 unsigned vr : 1; 106 unsigned vw : 1; 107 unsigned : 1; 108 unsigned fm : 16; 109 unsigned dm : 1; /**< D-MMU enable. */ 110 unsigned im : 1; /**< I-MMU enable. */ 111 unsigned dc : 1; /**< D-Cache enable. */ 112 unsigned ic : 1; /**< I-Cache enable. */ 113 114 } __attribute__ ((packed)); 115 } lsu_cr_reg_t; 116 #endif /* US */ 117 118 #endif /* !def __ASM__ */ 44 119 45 120 #endif -
kernel/arch/sparc64/include/mm/tlb.h
rbfd7aac r01a9ef5 36 36 #define KERN_sparc64_TLB_H_ 37 37 38 #if defined (SUN4U) 39 #include <arch/mm/sun4u/tlb.h> 40 #elif defined (SUN4V) 41 #include <arch/mm/sun4v/tlb.h> 42 #endif 38 #if defined (US) 39 #define ITLB_ENTRY_COUNT 64 40 #define DTLB_ENTRY_COUNT 64 41 #define DTLB_MAX_LOCKED_ENTRIES DTLB_ENTRY_COUNT 42 #endif 43 44 /** TLB_DSMALL is the only of the three DMMUs that can hold locked entries. */ 45 #if defined (US3) 46 #define DTLB_MAX_LOCKED_ENTRIES 16 47 #endif 48 49 #define MEM_CONTEXT_KERNEL 0 50 #define MEM_CONTEXT_TEMP 1 51 52 /** Page sizes. */ 53 #define PAGESIZE_8K 0 54 #define PAGESIZE_64K 1 55 #define PAGESIZE_512K 2 56 #define PAGESIZE_4M 3 57 58 /** Bit width of the TLB-locked portion of kernel address space. */ 59 #define KERNEL_PAGE_WIDTH 22 /* 4M */ 60 61 /* TLB Demap Operation types. */ 62 #define TLB_DEMAP_PAGE 0 63 #define TLB_DEMAP_CONTEXT 1 64 #if defined (US3) 65 #define TLB_DEMAP_ALL 2 66 #endif 67 68 #define TLB_DEMAP_TYPE_SHIFT 6 69 70 /* TLB Demap Operation Context register encodings. */ 71 #define TLB_DEMAP_PRIMARY 0 72 #define TLB_DEMAP_SECONDARY 1 73 #define TLB_DEMAP_NUCLEUS 2 74 75 /* There are more TLBs in one MMU in US3, their codes are defined here. */ 76 #if defined (US3) 77 /* D-MMU: one small (16-entry) TLB and two big (512-entry) TLBs */ 78 #define TLB_DSMALL 0 79 #define TLB_DBIG_0 2 80 #define TLB_DBIG_1 3 81 82 /* I-MMU: one small (16-entry) TLB and one big TLB */ 83 #define TLB_ISMALL 0 84 #define TLB_IBIG 2 85 #endif 86 87 #define TLB_DEMAP_CONTEXT_SHIFT 4 88 89 /* TLB Tag Access shifts */ 90 #define TLB_TAG_ACCESS_CONTEXT_SHIFT 0 91 #define TLB_TAG_ACCESS_CONTEXT_MASK ((1 << 13) - 1) 92 #define TLB_TAG_ACCESS_VPN_SHIFT 13 93 94 #ifndef __ASM__ 95 96 #include <arch/mm/tte.h> 97 #include <arch/mm/mmu.h> 98 #include <arch/mm/page.h> 99 #include <arch/asm.h> 100 #include <arch/barrier.h> 101 #include <arch/types.h> 102 #include <arch/register.h> 103 #include <arch/cpu.h> 104 105 union tlb_context_reg { 106 uint64_t v; 107 struct { 108 unsigned long : 51; 109 unsigned context : 13; /**< Context/ASID. */ 110 } __attribute__ ((packed)); 111 }; 112 typedef union tlb_context_reg tlb_context_reg_t; 113 114 /** I-/D-TLB Data In/Access Register type. */ 115 typedef tte_data_t tlb_data_t; 116 117 /** I-/D-TLB Data Access Address in Alternate Space. */ 118 119 #if defined (US) 120 121 union tlb_data_access_addr { 122 uint64_t value; 123 struct { 124 uint64_t : 55; 125 unsigned tlb_entry : 6; 126 unsigned : 3; 127 } __attribute__ ((packed)); 128 }; 129 typedef union tlb_data_access_addr dtlb_data_access_addr_t; 130 typedef union tlb_data_access_addr dtlb_tag_read_addr_t; 131 typedef union tlb_data_access_addr itlb_data_access_addr_t; 132 typedef union tlb_data_access_addr itlb_tag_read_addr_t; 133 134 #elif defined (US3) 135 136 /* 137 * In US3, I-MMU and D-MMU have different formats of the data 138 * access register virtual address. In the corresponding 139 * structures the member variable for the entry number is 140 * called "local_tlb_entry" - it contrasts with the "tlb_entry" 141 * for the US data access register VA structure. The rationale 142 * behind this is to prevent careless mistakes in the code 143 * caused by setting only the entry number and not the TLB 144 * number in the US3 code (when taking the code from US). 145 */ 146 147 union dtlb_data_access_addr { 148 uint64_t value; 149 struct { 150 uint64_t : 45; 151 unsigned : 1; 152 unsigned tlb_number : 2; 153 unsigned : 4; 154 unsigned local_tlb_entry : 9; 155 unsigned : 3; 156 } __attribute__ ((packed)); 157 }; 158 typedef union dtlb_data_access_addr dtlb_data_access_addr_t; 159 typedef union dtlb_data_access_addr dtlb_tag_read_addr_t; 160 161 union itlb_data_access_addr { 162 uint64_t value; 163 struct { 164 uint64_t : 45; 165 unsigned : 1; 166 unsigned tlb_number : 2; 167 unsigned : 6; 168 unsigned local_tlb_entry : 7; 169 unsigned : 3; 170 } __attribute__ ((packed)); 171 }; 172 typedef union itlb_data_access_addr itlb_data_access_addr_t; 173 typedef union itlb_data_access_addr itlb_tag_read_addr_t; 174 175 #endif 176 177 /** I-/D-TLB Tag Read Register. */ 178 union tlb_tag_read_reg { 179 uint64_t value; 180 struct { 181 uint64_t vpn : 51; /**< Virtual Address bits 63:13. */ 182 unsigned context : 13; /**< Context identifier. */ 183 } __attribute__ ((packed)); 184 }; 185 typedef union tlb_tag_read_reg tlb_tag_read_reg_t; 186 typedef union tlb_tag_read_reg tlb_tag_access_reg_t; 187 188 189 /** TLB Demap Operation Address. */ 190 union tlb_demap_addr { 191 uint64_t value; 192 struct { 193 uint64_t vpn: 51; /**< Virtual Address bits 63:13. */ 194 #if defined (US) 195 unsigned : 6; /**< Ignored. */ 196 unsigned type : 1; /**< The type of demap operation. */ 197 #elif defined (US3) 198 unsigned : 5; /**< Ignored. */ 199 unsigned type: 2; /**< The type of demap operation. */ 200 #endif 201 unsigned context : 2; /**< Context register selection. */ 202 unsigned : 4; /**< Zero. */ 203 } __attribute__ ((packed)); 204 }; 205 typedef union tlb_demap_addr tlb_demap_addr_t; 206 207 /** TLB Synchronous Fault Status Register. */ 208 union tlb_sfsr_reg { 209 uint64_t value; 210 struct { 211 #if defined (US) 212 unsigned long : 40; /**< Implementation dependent. */ 213 unsigned asi : 8; /**< ASI. */ 214 unsigned : 2; 215 unsigned ft : 7; /**< Fault type. */ 216 #elif defined (US3) 217 unsigned long : 39; /**< Implementation dependent. */ 218 unsigned nf : 1; /**< Non-faulting load. */ 219 unsigned asi : 8; /**< ASI. */ 220 unsigned tm : 1; /**< I-TLB miss. */ 221 unsigned : 3; /**< Reserved. */ 222 unsigned ft : 5; /**< Fault type. */ 223 #endif 224 unsigned e : 1; /**< Side-effect bit. */ 225 unsigned ct : 2; /**< Context Register selection. */ 226 unsigned pr : 1; /**< Privilege bit. */ 227 unsigned w : 1; /**< Write bit. */ 228 unsigned ow : 1; /**< Overwrite bit. */ 229 unsigned fv : 1; /**< Fault Valid bit. */ 230 } __attribute__ ((packed)); 231 }; 232 typedef union tlb_sfsr_reg tlb_sfsr_reg_t; 233 234 #if defined (US3) 235 236 /* 237 * Functions for determining the number of entries in TLBs. They either return 238 * a constant value or a value based on the CPU autodetection. 239 */ 240 241 /** 242 * Determine the number of entries in the DMMU's small TLB. 243 */ 244 static inline uint16_t tlb_dsmall_size(void) 245 { 246 return 16; 247 } 248 249 /** 250 * Determine the number of entries in each DMMU's big TLB. 251 */ 252 static inline uint16_t tlb_dbig_size(void) 253 { 254 return 512; 255 } 256 257 /** 258 * Determine the number of entries in the IMMU's small TLB. 259 */ 260 static inline uint16_t tlb_ismall_size(void) 261 { 262 return 16; 263 } 264 265 /** 266 * Determine the number of entries in the IMMU's big TLB. 267 */ 268 static inline uint16_t tlb_ibig_size(void) 269 { 270 if (((ver_reg_t) ver_read()).impl == IMPL_ULTRASPARCIV_PLUS) 271 return 512; 272 else 273 return 128; 274 } 275 276 #endif 277 278 /** Read MMU Primary Context Register. 279 * 280 * @return Current value of Primary Context Register. 281 */ 282 static inline uint64_t mmu_primary_context_read(void) 283 { 284 return asi_u64_read(ASI_DMMU, VA_PRIMARY_CONTEXT_REG); 285 } 286 287 /** Write MMU Primary Context Register. 288 * 289 * @param v New value of Primary Context Register. 290 */ 291 static inline void mmu_primary_context_write(uint64_t v) 292 { 293 asi_u64_write(ASI_DMMU, VA_PRIMARY_CONTEXT_REG, v); 294 flush_pipeline(); 295 } 296 297 /** Read MMU Secondary Context Register. 298 * 299 * @return Current value of Secondary Context Register. 300 */ 301 static inline uint64_t mmu_secondary_context_read(void) 302 { 303 return asi_u64_read(ASI_DMMU, VA_SECONDARY_CONTEXT_REG); 304 } 305 306 /** Write MMU Primary Context Register. 307 * 308 * @param v New value of Primary Context Register. 309 */ 310 static inline void mmu_secondary_context_write(uint64_t v) 311 { 312 asi_u64_write(ASI_DMMU, VA_SECONDARY_CONTEXT_REG, v); 313 flush_pipeline(); 314 } 315 316 #if defined (US) 317 318 /** Read IMMU TLB Data Access Register. 319 * 320 * @param entry TLB Entry index. 321 * 322 * @return Current value of specified IMMU TLB Data Access 323 * Register. 324 */ 325 static inline uint64_t itlb_data_access_read(size_t entry) 326 { 327 itlb_data_access_addr_t reg; 328 329 reg.value = 0; 330 reg.tlb_entry = entry; 331 return asi_u64_read(ASI_ITLB_DATA_ACCESS_REG, reg.value); 332 } 333 334 /** Write IMMU TLB Data Access Register. 335 * 336 * @param entry TLB Entry index. 337 * @param value Value to be written. 338 */ 339 static inline void itlb_data_access_write(size_t entry, uint64_t value) 340 { 341 itlb_data_access_addr_t reg; 342 343 reg.value = 0; 344 reg.tlb_entry = entry; 345 asi_u64_write(ASI_ITLB_DATA_ACCESS_REG, reg.value, value); 346 flush_pipeline(); 347 } 348 349 /** Read DMMU TLB Data Access Register. 350 * 351 * @param entry TLB Entry index. 352 * 353 * @return Current value of specified DMMU TLB Data Access 354 * Register. 355 */ 356 static inline uint64_t dtlb_data_access_read(size_t entry) 357 { 358 dtlb_data_access_addr_t reg; 359 360 reg.value = 0; 361 reg.tlb_entry = entry; 362 return asi_u64_read(ASI_DTLB_DATA_ACCESS_REG, reg.value); 363 } 364 365 /** Write DMMU TLB Data Access Register. 366 * 367 * @param entry TLB Entry index. 368 * @param value Value to be written. 369 */ 370 static inline void dtlb_data_access_write(size_t entry, uint64_t value) 371 { 372 dtlb_data_access_addr_t reg; 373 374 reg.value = 0; 375 reg.tlb_entry = entry; 376 asi_u64_write(ASI_DTLB_DATA_ACCESS_REG, reg.value, value); 377 membar(); 378 } 379 380 /** Read IMMU TLB Tag Read Register. 381 * 382 * @param entry TLB Entry index. 383 * 384 * @return Current value of specified IMMU TLB Tag Read Register. 385 */ 386 static inline uint64_t itlb_tag_read_read(size_t entry) 387 { 388 itlb_tag_read_addr_t tag; 389 390 tag.value = 0; 391 tag.tlb_entry = entry; 392 return asi_u64_read(ASI_ITLB_TAG_READ_REG, tag.value); 393 } 394 395 /** Read DMMU TLB Tag Read Register. 396 * 397 * @param entry TLB Entry index. 398 * 399 * @return Current value of specified DMMU TLB Tag Read Register. 400 */ 401 static inline uint64_t dtlb_tag_read_read(size_t entry) 402 { 403 dtlb_tag_read_addr_t tag; 404 405 tag.value = 0; 406 tag.tlb_entry = entry; 407 return asi_u64_read(ASI_DTLB_TAG_READ_REG, tag.value); 408 } 409 410 #elif defined (US3) 411 412 413 /** Read IMMU TLB Data Access Register. 414 * 415 * @param tlb TLB number (one of TLB_ISMALL or TLB_IBIG) 416 * @param entry TLB Entry index. 417 * 418 * @return Current value of specified IMMU TLB Data Access 419 * Register. 420 */ 421 static inline uint64_t itlb_data_access_read(int tlb, size_t entry) 422 { 423 itlb_data_access_addr_t reg; 424 425 reg.value = 0; 426 reg.tlb_number = tlb; 427 reg.local_tlb_entry = entry; 428 return asi_u64_read(ASI_ITLB_DATA_ACCESS_REG, reg.value); 429 } 430 431 /** Write IMMU TLB Data Access Register. 432 * @param tlb TLB number (one of TLB_ISMALL or TLB_IBIG) 433 * @param entry TLB Entry index. 434 * @param value Value to be written. 435 */ 436 static inline void itlb_data_access_write(int tlb, size_t entry, 437 uint64_t value) 438 { 439 itlb_data_access_addr_t reg; 440 441 reg.value = 0; 442 reg.tlb_number = tlb; 443 reg.local_tlb_entry = entry; 444 asi_u64_write(ASI_ITLB_DATA_ACCESS_REG, reg.value, value); 445 flush_pipeline(); 446 } 447 448 /** Read DMMU TLB Data Access Register. 449 * 450 * @param tlb TLB number (one of TLB_DSMALL, TLB_DBIG, TLB_DBIG) 451 * @param entry TLB Entry index. 452 * 453 * @return Current value of specified DMMU TLB Data Access 454 * Register. 455 */ 456 static inline uint64_t dtlb_data_access_read(int tlb, size_t entry) 457 { 458 dtlb_data_access_addr_t reg; 459 460 reg.value = 0; 461 reg.tlb_number = tlb; 462 reg.local_tlb_entry = entry; 463 return asi_u64_read(ASI_DTLB_DATA_ACCESS_REG, reg.value); 464 } 465 466 /** Write DMMU TLB Data Access Register. 467 * 468 * @param tlb TLB number (one of TLB_DSMALL, TLB_DBIG_0, TLB_DBIG_1) 469 * @param entry TLB Entry index. 470 * @param value Value to be written. 471 */ 472 static inline void dtlb_data_access_write(int tlb, size_t entry, 473 uint64_t value) 474 { 475 dtlb_data_access_addr_t reg; 476 477 reg.value = 0; 478 reg.tlb_number = tlb; 479 reg.local_tlb_entry = entry; 480 asi_u64_write(ASI_DTLB_DATA_ACCESS_REG, reg.value, value); 481 membar(); 482 } 483 484 /** Read IMMU TLB Tag Read Register. 485 * 486 * @param tlb TLB number (one of TLB_ISMALL or TLB_IBIG) 487 * @param entry TLB Entry index. 488 * 489 * @return Current value of specified IMMU TLB Tag Read Register. 490 */ 491 static inline uint64_t itlb_tag_read_read(int tlb, size_t entry) 492 { 493 itlb_tag_read_addr_t tag; 494 495 tag.value = 0; 496 tag.tlb_number = tlb; 497 tag.local_tlb_entry = entry; 498 return asi_u64_read(ASI_ITLB_TAG_READ_REG, tag.value); 499 } 500 501 /** Read DMMU TLB Tag Read Register. 502 * 503 * @param tlb TLB number (one of TLB_DSMALL, TLB_DBIG_0, TLB_DBIG_1) 504 * @param entry TLB Entry index. 505 * 506 * @return Current value of specified DMMU TLB Tag Read Register. 507 */ 508 static inline uint64_t dtlb_tag_read_read(int tlb, size_t entry) 509 { 510 dtlb_tag_read_addr_t tag; 511 512 tag.value = 0; 513 tag.tlb_number = tlb; 514 tag.local_tlb_entry = entry; 515 return asi_u64_read(ASI_DTLB_TAG_READ_REG, tag.value); 516 } 517 518 #endif 519 520 521 /** Write IMMU TLB Tag Access Register. 522 * 523 * @param v Value to be written. 524 */ 525 static inline void itlb_tag_access_write(uint64_t v) 526 { 527 asi_u64_write(ASI_IMMU, VA_IMMU_TAG_ACCESS, v); 528 flush_pipeline(); 529 } 530 531 /** Read IMMU TLB Tag Access Register. 532 * 533 * @return Current value of IMMU TLB Tag Access Register. 534 */ 535 static inline uint64_t itlb_tag_access_read(void) 536 { 537 return asi_u64_read(ASI_IMMU, VA_IMMU_TAG_ACCESS); 538 } 539 540 /** Write DMMU TLB Tag Access Register. 541 * 542 * @param v Value to be written. 543 */ 544 static inline void dtlb_tag_access_write(uint64_t v) 545 { 546 asi_u64_write(ASI_DMMU, VA_DMMU_TAG_ACCESS, v); 547 membar(); 548 } 549 550 /** Read DMMU TLB Tag Access Register. 551 * 552 * @return Current value of DMMU TLB Tag Access Register. 553 */ 554 static inline uint64_t dtlb_tag_access_read(void) 555 { 556 return asi_u64_read(ASI_DMMU, VA_DMMU_TAG_ACCESS); 557 } 558 559 560 /** Write IMMU TLB Data in Register. 561 * 562 * @param v Value to be written. 563 */ 564 static inline void itlb_data_in_write(uint64_t v) 565 { 566 asi_u64_write(ASI_ITLB_DATA_IN_REG, 0, v); 567 flush_pipeline(); 568 } 569 570 /** Write DMMU TLB Data in Register. 571 * 572 * @param v Value to be written. 573 */ 574 static inline void dtlb_data_in_write(uint64_t v) 575 { 576 asi_u64_write(ASI_DTLB_DATA_IN_REG, 0, v); 577 membar(); 578 } 579 580 /** Read ITLB Synchronous Fault Status Register. 581 * 582 * @return Current content of I-SFSR register. 583 */ 584 static inline uint64_t itlb_sfsr_read(void) 585 { 586 return asi_u64_read(ASI_IMMU, VA_IMMU_SFSR); 587 } 588 589 /** Write ITLB Synchronous Fault Status Register. 590 * 591 * @param v New value of I-SFSR register. 592 */ 593 static inline void itlb_sfsr_write(uint64_t v) 594 { 595 asi_u64_write(ASI_IMMU, VA_IMMU_SFSR, v); 596 flush_pipeline(); 597 } 598 599 /** Read DTLB Synchronous Fault Status Register. 600 * 601 * @return Current content of D-SFSR register. 602 */ 603 static inline uint64_t dtlb_sfsr_read(void) 604 { 605 return asi_u64_read(ASI_DMMU, VA_DMMU_SFSR); 606 } 607 608 /** Write DTLB Synchronous Fault Status Register. 609 * 610 * @param v New value of D-SFSR register. 611 */ 612 static inline void dtlb_sfsr_write(uint64_t v) 613 { 614 asi_u64_write(ASI_DMMU, VA_DMMU_SFSR, v); 615 membar(); 616 } 617 618 /** Read DTLB Synchronous Fault Address Register. 619 * 620 * @return Current content of D-SFAR register. 621 */ 622 static inline uint64_t dtlb_sfar_read(void) 623 { 624 return asi_u64_read(ASI_DMMU, VA_DMMU_SFAR); 625 } 626 627 /** Perform IMMU TLB Demap Operation. 628 * 629 * @param type Selects between context and page demap (and entire MMU 630 * demap on US3). 631 * @param context_encoding Specifies which Context register has Context ID for 632 * demap. 633 * @param page Address which is on the page to be demapped. 634 */ 635 static inline void itlb_demap(int type, int context_encoding, uintptr_t page) 636 { 637 tlb_demap_addr_t da; 638 page_address_t pg; 639 640 da.value = 0; 641 pg.address = page; 642 643 da.type = type; 644 da.context = context_encoding; 645 da.vpn = pg.vpn; 646 647 /* da.value is the address within the ASI */ 648 asi_u64_write(ASI_IMMU_DEMAP, da.value, 0); 649 650 flush_pipeline(); 651 } 652 653 /** Perform DMMU TLB Demap Operation. 654 * 655 * @param type Selects between context and page demap (and entire MMU 656 * demap on US3). 657 * @param context_encoding Specifies which Context register has Context ID for 658 * demap. 659 * @param page Address which is on the page to be demapped. 660 */ 661 static inline void dtlb_demap(int type, int context_encoding, uintptr_t page) 662 { 663 tlb_demap_addr_t da; 664 page_address_t pg; 665 666 da.value = 0; 667 pg.address = page; 668 669 da.type = type; 670 da.context = context_encoding; 671 da.vpn = pg.vpn; 672 673 /* da.value is the address within the ASI */ 674 asi_u64_write(ASI_DMMU_DEMAP, da.value, 0); 675 676 membar(); 677 } 678 679 extern void fast_instruction_access_mmu_miss(unative_t, istate_t *); 680 extern void fast_data_access_mmu_miss(tlb_tag_access_reg_t, istate_t *); 681 extern void fast_data_access_protection(tlb_tag_access_reg_t , istate_t *); 682 683 extern void dtlb_insert_mapping(uintptr_t, uintptr_t, int, bool, bool); 684 685 extern void dump_sfsr_and_sfar(void); 686 687 #endif /* !def __ASM__ */ 43 688 44 689 #endif -
kernel/arch/sparc64/include/mm/tte.h
rbfd7aac r01a9ef5 36 36 #define KERN_sparc64_TTE_H_ 37 37 38 #if defined (SUN4U) 39 #include <arch/mm/sun4u/tte.h> 40 #elif defined (SUN4V) 41 #include <arch/mm/sun4v/tte.h> 38 #define TTE_G (1 << 0) 39 #define TTE_W (1 << 1) 40 #define TTE_P (1 << 2) 41 #define TTE_E (1 << 3) 42 #define TTE_CV (1 << 4) 43 #define TTE_CP (1 << 5) 44 #define TTE_L (1 << 6) 45 46 #define TTE_V_SHIFT 63 47 #define TTE_SIZE_SHIFT 61 48 49 #ifndef __ASM__ 50 51 #include <arch/types.h> 52 53 /* TTE tag's VA_tag field contains bits <63:VA_TAG_PAGE_SHIFT> of the VA */ 54 #define VA_TAG_PAGE_SHIFT 22 55 56 /** Translation Table Entry - Tag. */ 57 union tte_tag { 58 uint64_t value; 59 struct { 60 unsigned g : 1; /**< Global. */ 61 unsigned : 2; /**< Reserved. */ 62 unsigned context : 13; /**< Context identifier. */ 63 unsigned : 6; /**< Reserved. */ 64 uint64_t va_tag : 42; /**< Virtual Address Tag, bits 63:22. */ 65 } __attribute__ ((packed)); 66 }; 67 68 typedef union tte_tag tte_tag_t; 69 70 /** Translation Table Entry - Data. */ 71 union tte_data { 72 uint64_t value; 73 struct { 74 unsigned v : 1; /**< Valid. */ 75 unsigned size : 2; /**< Page size of this entry. */ 76 unsigned nfo : 1; /**< No-Fault-Only. */ 77 unsigned ie : 1; /**< Invert Endianness. */ 78 unsigned soft2 : 9; /**< Software defined field. */ 79 #if defined (US) 80 unsigned diag : 9; /**< Diagnostic data. */ 81 unsigned pfn : 28; /**< Physical Address bits, bits 40:13. */ 82 #elif defined (US3) 83 unsigned : 7; /**< Reserved. */ 84 unsigned pfn : 30; /**< Physical Address bits, bits 42:13 */ 42 85 #endif 86 unsigned soft : 6; /**< Software defined field. */ 87 unsigned l : 1; /**< Lock. */ 88 unsigned cp : 1; /**< Cacheable in physically indexed cache. */ 89 unsigned cv : 1; /**< Cacheable in virtually indexed cache. */ 90 unsigned e : 1; /**< Side-effect. */ 91 unsigned p : 1; /**< Privileged. */ 92 unsigned w : 1; /**< Writable. */ 93 unsigned g : 1; /**< Global. */ 94 } __attribute__ ((packed)); 95 }; 96 97 typedef union tte_data tte_data_t; 98 99 #endif /* !def __ASM__ */ 43 100 44 101 #endif -
kernel/arch/sparc64/include/trap/mmu.h
rbfd7aac r01a9ef5 38 38 #define KERN_sparc64_MMU_TRAP_H_ 39 39 40 #if defined (SUN4U) 41 #include <arch/trap/sun4u/mmu.h> 42 #elif defined (SUN4V) 43 #include <arch/trap/sun4v/mmu.h> 40 #include <arch/stack.h> 41 #include <arch/regdef.h> 42 #include <arch/mm/tlb.h> 43 #include <arch/mm/mmu.h> 44 #include <arch/mm/tte.h> 45 #include <arch/trap/regwin.h> 46 47 #ifdef CONFIG_TSB 48 #include <arch/mm/tsb.h> 44 49 #endif 50 51 #define TT_FAST_INSTRUCTION_ACCESS_MMU_MISS 0x64 52 #define TT_FAST_DATA_ACCESS_MMU_MISS 0x68 53 #define TT_FAST_DATA_ACCESS_PROTECTION 0x6c 54 55 #define FAST_MMU_HANDLER_SIZE 128 56 57 #ifdef __ASM__ 58 59 .macro FAST_INSTRUCTION_ACCESS_MMU_MISS_HANDLER 60 /* 61 * First, try to refill TLB from TSB. 62 */ 63 #ifdef CONFIG_TSB 64 ldxa [%g0] ASI_IMMU, %g1 ! read TSB Tag Target Register 65 ldxa [%g0] ASI_IMMU_TSB_8KB_PTR_REG, %g2 ! read TSB 8K Pointer 66 ldda [%g2] ASI_NUCLEUS_QUAD_LDD, %g4 ! 16-byte atomic load into %g4 and %g5 67 cmp %g1, %g4 ! is this the entry we are looking for? 68 bne,pn %xcc, 0f 69 nop 70 stxa %g5, [%g0] ASI_ITLB_DATA_IN_REG ! copy mapping from ITSB to ITLB 71 retry 72 #endif 73 74 0: 75 wrpr %g0, PSTATE_PRIV_BIT | PSTATE_AG_BIT, %pstate 76 PREEMPTIBLE_HANDLER fast_instruction_access_mmu_miss 77 .endm 78 79 .macro FAST_DATA_ACCESS_MMU_MISS_HANDLER tl 80 /* 81 * First, try to refill TLB from TSB. 82 */ 83 84 #ifdef CONFIG_TSB 85 ldxa [%g0] ASI_DMMU, %g1 ! read TSB Tag Target Register 86 srlx %g1, TSB_TAG_TARGET_CONTEXT_SHIFT, %g2 ! is this a kernel miss? 87 brz,pn %g2, 0f 88 ldxa [%g0] ASI_DMMU_TSB_8KB_PTR_REG, %g3 ! read TSB 8K Pointer 89 ldda [%g3] ASI_NUCLEUS_QUAD_LDD, %g4 ! 16-byte atomic load into %g4 and %g5 90 cmp %g1, %g4 ! is this the entry we are looking for? 91 bne,pn %xcc, 0f 92 nop 93 stxa %g5, [%g0] ASI_DTLB_DATA_IN_REG ! copy mapping from DTSB to DTLB 94 retry 95 #endif 96 97 /* 98 * Second, test if it is the portion of the kernel address space 99 * which is faulting. If that is the case, immediately create 100 * identity mapping for that page in DTLB. VPN 0 is excluded from 101 * this treatment. 102 * 103 * Note that branch-delay slots are used in order to save space. 104 */ 105 0: 106 sethi %hi(fast_data_access_mmu_miss_data_hi), %g7 107 wr %g0, ASI_DMMU, %asi 108 ldxa [VA_DMMU_TAG_ACCESS] %asi, %g1 ! read the faulting Context and VPN 109 set TLB_TAG_ACCESS_CONTEXT_MASK, %g2 110 andcc %g1, %g2, %g3 ! get Context 111 bnz %xcc, 0f ! Context is non-zero 112 andncc %g1, %g2, %g3 ! get page address into %g3 113 bz %xcc, 0f ! page address is zero 114 ldx [%g7 + %lo(end_of_identity)], %g4 115 cmp %g3, %g4 116 bgeu %xcc, 0f 117 118 ldx [%g7 + %lo(kernel_8k_tlb_data_template)], %g2 119 add %g3, %g2, %g2 120 stxa %g2, [%g0] ASI_DTLB_DATA_IN_REG ! identity map the kernel page 121 retry 122 123 /* 124 * Third, catch and handle special cases when the trap is caused by 125 * the userspace register window spill or fill handler. In case 126 * one of these two traps caused this trap, we just lower the trap 127 * level and service the DTLB miss. In the end, we restart 128 * the offending SAVE or RESTORE. 129 */ 130 0: 131 .if (\tl > 0) 132 wrpr %g0, 1, %tl 133 .endif 134 135 /* 136 * Switch from the MM globals. 137 */ 138 wrpr %g0, PSTATE_PRIV_BIT | PSTATE_AG_BIT, %pstate 139 140 /* 141 * Read the Tag Access register for the higher-level handler. 142 * This is necessary to survive nested DTLB misses. 143 */ 144 ldxa [VA_DMMU_TAG_ACCESS] %asi, %g2 145 146 /* 147 * g2 will be passed as an argument to fast_data_access_mmu_miss(). 148 */ 149 PREEMPTIBLE_HANDLER fast_data_access_mmu_miss 150 .endm 151 152 .macro FAST_DATA_ACCESS_PROTECTION_HANDLER tl 153 /* 154 * The same special case as in FAST_DATA_ACCESS_MMU_MISS_HANDLER. 155 */ 156 157 .if (\tl > 0) 158 wrpr %g0, 1, %tl 159 .endif 160 161 /* 162 * Switch from the MM globals. 163 */ 164 wrpr %g0, PSTATE_PRIV_BIT | PSTATE_AG_BIT, %pstate 165 166 /* 167 * Read the Tag Access register for the higher-level handler. 168 * This is necessary to survive nested DTLB misses. 169 */ 170 mov VA_DMMU_TAG_ACCESS, %g2 171 ldxa [%g2] ASI_DMMU, %g2 172 173 /* 174 * g2 will be passed as an argument to fast_data_access_mmu_miss(). 175 */ 176 PREEMPTIBLE_HANDLER fast_data_access_protection 177 .endm 178 179 #endif /* __ASM__ */ 45 180 46 181 #endif -
kernel/arch/sparc64/include/trap/regwin.h
rbfd7aac r01a9ef5 131 131 132 132 /* 133 * Macro used to spill userspace window to userspace window buffer. 134 * It can be either triggered from preemptible_handler doing SAVE 135 * at (TL=1) or from normal kernel code doing SAVE when OTHERWIN>0 136 * at (TL=0). 137 */ 138 .macro SPILL_TO_USPACE_WINDOW_BUFFER 139 stx %l0, [%g7 + L0_OFFSET] 140 stx %l1, [%g7 + L1_OFFSET] 141 stx %l2, [%g7 + L2_OFFSET] 142 stx %l3, [%g7 + L3_OFFSET] 143 stx %l4, [%g7 + L4_OFFSET] 144 stx %l5, [%g7 + L5_OFFSET] 145 stx %l6, [%g7 + L6_OFFSET] 146 stx %l7, [%g7 + L7_OFFSET] 147 stx %i0, [%g7 + I0_OFFSET] 148 stx %i1, [%g7 + I1_OFFSET] 149 stx %i2, [%g7 + I2_OFFSET] 150 stx %i3, [%g7 + I3_OFFSET] 151 stx %i4, [%g7 + I4_OFFSET] 152 stx %i5, [%g7 + I5_OFFSET] 153 stx %i6, [%g7 + I6_OFFSET] 154 stx %i7, [%g7 + I7_OFFSET] 155 add %g7, STACK_WINDOW_SAVE_AREA_SIZE, %g7 156 saved 157 retry 158 .endm 159 160 161 /* 133 162 * Macro used by the nucleus and the primary context 0 during normal fills. 134 163 */ … … 203 232 #endif /* __ASM__ */ 204 233 205 #if defined (SUN4U)206 #include <arch/trap/sun4u/regwin.h>207 #elif defined (SUN4V)208 #include <arch/trap/sun4v/regwin.h>209 234 #endif 210 235 211 #endif212 213 236 /** @} 214 237 */ -
kernel/arch/sparc64/src/asm.S
rbfd7aac r01a9ef5 29 29 #include <arch/arch.h> 30 30 #include <arch/stack.h> 31 #include <arch/regdef.h> 32 #include <arch/mm/mmu.h> 31 33 32 34 .text … … 232 234 nop 233 235 236 237 .macro WRITE_ALTERNATE_REGISTER reg, bit 238 rdpr %pstate, %g1 ! save PSTATE.PEF 239 wrpr %g0, (\bit | PSTATE_PRIV_BIT), %pstate 240 mov %o0, \reg 241 wrpr %g0, PSTATE_PRIV_BIT, %pstate 242 retl 243 wrpr %g1, 0, %pstate ! restore PSTATE.PEF 244 .endm 245 246 .macro READ_ALTERNATE_REGISTER reg, bit 247 rdpr %pstate, %g1 ! save PSTATE.PEF 248 wrpr %g0, (\bit | PSTATE_PRIV_BIT), %pstate 249 mov \reg, %o0 250 wrpr %g0, PSTATE_PRIV_BIT, %pstate 251 retl 252 wrpr %g1, 0, %pstate ! restore PSTATE.PEF 253 .endm 254 255 .global write_to_ag_g6 256 write_to_ag_g6: 257 WRITE_ALTERNATE_REGISTER %g6, PSTATE_AG_BIT 258 259 .global write_to_ag_g7 260 write_to_ag_g7: 261 WRITE_ALTERNATE_REGISTER %g7, PSTATE_AG_BIT 262 263 .global write_to_ig_g6 264 write_to_ig_g6: 265 WRITE_ALTERNATE_REGISTER %g6, PSTATE_IG_BIT 266 267 .global read_from_ag_g7 268 read_from_ag_g7: 269 READ_ALTERNATE_REGISTER %g7, PSTATE_AG_BIT 270 271 272 /** Switch to userspace. 273 * 274 * %o0 Userspace entry address. 275 * %o1 Userspace stack pointer address. 276 * %o2 Userspace address of uarg structure. 277 */ 278 .global switch_to_userspace 279 switch_to_userspace: 280 save %o1, -(STACK_WINDOW_SAVE_AREA_SIZE + STACK_ARG_SAVE_AREA_SIZE), %sp 281 flushw 282 wrpr %g0, 0, %cleanwin ! avoid information leak 283 284 mov %i2, %o0 ! uarg 285 xor %o1, %o1, %o1 ! %o1 is defined to hold pcb_ptr 286 ! set it to 0 287 288 clr %i2 289 clr %i3 290 clr %i4 291 clr %i5 292 clr %i6 293 294 wrpr %g0, 1, %tl ! enforce mapping via nucleus 295 296 rdpr %cwp, %g1 297 wrpr %g1, TSTATE_IE_BIT, %tstate 298 wrpr %i0, 0, %tnpc 299 300 /* 301 * Set primary context according to secondary context. 302 * Secondary context has been already installed by 303 * higher-level functions. 304 */ 305 wr %g0, ASI_DMMU, %asi 306 ldxa [VA_SECONDARY_CONTEXT_REG] %asi, %g1 307 stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi 308 flush %i7 309 310 /* 311 * Spills and fills will be handled by the userspace handlers. 312 */ 313 wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate 314 315 done ! jump to userspace 316 -
kernel/arch/sparc64/src/drivers/kbd.c
rbfd7aac r01a9ef5 39 39 #include <console/console.h> 40 40 #include <ddi/irq.h> 41 #include <mm/page.h>42 41 #include <arch/mm/page.h> 43 42 #include <arch/types.h> -
kernel/arch/sparc64/src/drivers/tick.c
rbfd7aac r01a9ef5 54 54 interrupt_register(14, "tick_int", tick_interrupt); 55 55 compare.int_dis = false; 56 compare.tick_cmpr = tick_counter_read() + 57 CPU->arch.clock_frequency / HZ; 56 compare.tick_cmpr = CPU->arch.clock_frequency / HZ; 58 57 CPU->arch.next_tick_cmpr = compare.tick_cmpr; 59 58 tick_compare_write(compare.value); 59 tick_write(0); 60 60 61 #if defined (US3) || defined (SUN4V)61 #if defined (US3) 62 62 /* disable STICK interrupts and clear any pending ones */ 63 63 tick_compare_reg_t stick_compare; … … 111 111 * overflow only in 146 years. 112 112 */ 113 drift = tick_ counter_read() - CPU->arch.next_tick_cmpr;113 drift = tick_read() - CPU->arch.next_tick_cmpr; 114 114 while (drift > CPU->arch.clock_frequency / HZ) { 115 115 drift -= CPU->arch.clock_frequency / HZ; 116 116 CPU->missed_clock_ticks++; 117 117 } 118 CPU->arch.next_tick_cmpr = tick_ counter_read() +118 CPU->arch.next_tick_cmpr = tick_read() + 119 119 (CPU->arch.clock_frequency / HZ) - drift; 120 120 tick_compare_write(CPU->arch.next_tick_cmpr); -
kernel/arch/sparc64/src/mm/page.c
rbfd7aac r01a9ef5 33 33 */ 34 34 35 #include <mm/page.h>36 35 #include <arch/mm/page.h> 37 36 #include <arch/mm/tlb.h> -
kernel/arch/sparc64/src/trap/exception.c
rbfd7aac r01a9ef5 162 162 fault_if_from_uspace(istate, "%s.", __func__); 163 163 dump_istate(istate); 164 //MH 165 // dump_sfsr_and_sfar(); 164 dump_sfsr_and_sfar(); 166 165 panic("%s.", __func__); 167 166 } -
kernel/genarch/include/softint/division.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup genarch 29 /** @addtogroup genarch 30 30 * @{ 31 31 */ -
kernel/generic/include/console/console.h
rbfd7aac r01a9ef5 41 41 extern indev_t *stdin; 42 42 extern outdev_t *stdout; 43 extern bool silent; 43 44 44 45 extern indev_t *stdin_wire(void); -
kernel/generic/include/errno.h
rbfd7aac r01a9ef5 57 57 #define EADDRNOTAVAIL -12 /* Address not available. */ 58 58 #define ETIMEOUT -13 /* Timeout expired */ 59 //MH60 #ifndef EINVAL61 59 #define EINVAL -14 /* Invalid value */ 62 #endif63 #ifndef EBUSY64 60 #define EBUSY -15 /* Resource is busy */ 65 #endif66 61 #define EOVERFLOW -16 /* The result does not fit its size. */ 67 62 #define EINTR -17 /* Operation was interrupted. */ -
kernel/generic/include/panic.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup generic 29 /** @addtogroup generic 30 30 * @{ 31 31 */ … … 36 36 #define KERN_PANIC_H_ 37 37 38 #include <typedefs.h>39 38 #include <stacktrace.h> 40 39 #include <print.h> … … 43 42 # define panic(format, ...) \ 44 43 do { \ 45 silent = false; \46 44 printf("Kernel panic in %s() at %s:%u.\n", \ 47 45 __func__, __FILE__, __LINE__); \ … … 52 50 #else 53 51 # define panic(format, ...) \ 54 do { \ 55 silent = false; \ 56 panic_printf("Kernel panic: " format "\n", ##__VA_ARGS__); \ 57 } while (0) 52 panic_printf("Kernel panic: " format "\n", ##__VA_ARGS__); 58 53 #endif 59 60 extern bool silent;61 54 62 55 extern void panic_printf(char *fmt, ...) __attribute__((noreturn)); -
kernel/generic/include/smp/ipi.h
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup generic 29 /** @addtogroup generic 30 30 * @{ 31 31 */ … … 37 37 38 38 #ifdef CONFIG_SMP 39 40 extern void ipi_broadcast(int); 41 extern void ipi_broadcast_arch(int); 42 39 extern void ipi_broadcast(int ipi); 40 extern void ipi_broadcast_arch(int ipi); 43 41 #else 44 45 #define ipi_broadcast(ipi) 46 42 #define ipi_broadcast(x) ; 47 43 #endif /* CONFIG_SMP */ 48 44 -
kernel/generic/include/time/clock.h
rbfd7aac r01a9ef5 38 38 #include <arch/types.h> 39 39 40 #define HZ 100 40 #define HZ 1000 41 41 42 42 /** Uptime structure */ -
kernel/generic/src/console/console.c
rbfd7aac r01a9ef5 45 45 #include <ipc/irq.h> 46 46 #include <arch.h> 47 #include <panic.h>48 47 #include <print.h> 49 48 #include <putchar.h> -
kernel/generic/src/ddi/ddi.c
rbfd7aac r01a9ef5 146 146 (btree_key_t) pf, &nodep); 147 147 148 if ((!parea) || (parea->frames < pages)) { 149 spinlock_unlock(&parea_lock); 148 if ((!parea) || (parea->frames < pages)) 150 149 goto err; 151 }152 150 153 151 spinlock_unlock(&parea_lock); … … 155 153 } 156 154 155 err: 157 156 spinlock_unlock(&zones.lock); 158 err:159 157 interrupts_restore(ipl); 160 158 return ENOENT; -
kernel/generic/src/main/kinit.c
rbfd7aac r01a9ef5 94 94 void kinit(void *arg) 95 95 { 96 96 97 #if defined(CONFIG_SMP) || defined(CONFIG_KCONSOLE) 97 98 thread_t *thread; … … 216 217 } 217 218 } 218 219 219 220 /* 220 221 * Run user tasks. … … 224 225 program_ready(&programs[i]); 225 226 } 226 227 227 228 #ifdef CONFIG_KCONSOLE 228 229 if (!stdin) { -
kernel/generic/src/smp/ipi.c
rbfd7aac r01a9ef5 27 27 */ 28 28 29 /** @addtogroup generic 29 /** @addtogroup generic 30 30 * @{ 31 31 */ … … 33 33 /** 34 34 * @file 35 * @brief 35 * @brief Generic IPI interface. 36 36 */ 37 37 38 38 #ifdef CONFIG_SMP 39 39 40 40 #include <smp/ipi.h> 41 41 #include <config.h> 42 42 43 43 44 /** Broadcast IPI message … … 48 49 * 49 50 * @bug The decision whether to actually send the IPI must be based 50 * 51 * 52 * 51 * on a different criterion. The current version has 52 * problems when some of the detected CPUs are marked 53 * disabled in machine configuration. 53 54 */ 54 55 void ipi_broadcast(int ipi) … … 59 60 * - if there is only one CPU but the kernel was compiled with CONFIG_SMP 60 61 */ 61 62 62 63 if ((config.cpu_active > 1) && (config.cpu_active == config.cpu_count)) 63 64 ipi_broadcast_arch(ipi); -
uspace/Makefile
rbfd7aac r01a9ef5 60 60 srv/fs/devfs \ 61 61 srv/hid/adb_mouse \ 62 srv/hid/console \ 62 63 srv/hid/char_mouse \ 63 64 srv/hid/fb \ … … 65 66 srv/hw/char/i8042 \ 66 67 srv/net 67 68 ifneq ($(UARCH),abs32le)69 DIRS += srv/hid/console70 endif71 68 72 69 ifeq ($(UARCH),amd64) -
uspace/app/taskdump/taskdump.c
rbfd7aac r01a9ef5 54 54 #define LINE_BYTES 16 55 55 56 #define DBUF_SIZE 4096 57 static uint8_t data_buf[DBUF_SIZE]; 58 56 59 static int phoneid; 57 60 static task_id_t task_id; … … 67 70 static int thread_dump(uintptr_t thash); 68 71 static int areas_dump(void); 72 static int area_dump(as_area_info_t *area); 73 static void hex_dump(uintptr_t addr, void *buffer, size_t size); 69 74 static int td_read_uintptr(void *arg, uintptr_t addr, uintptr_t *value); 70 75 … … 351 356 } 352 357 358 static __attribute__((unused)) int area_dump(as_area_info_t *area) 359 { 360 size_t to_copy; 361 size_t total; 362 uintptr_t addr; 363 int rc; 364 365 addr = area->start_addr; 366 total = 0; 367 368 while (total < area->size) { 369 to_copy = min(area->size - total, DBUF_SIZE); 370 rc = udebug_mem_read(phoneid, data_buf, addr, to_copy); 371 if (rc < 0) { 372 printf("udebug_mem_read() failed.\n"); 373 return rc; 374 } 375 376 hex_dump(addr, data_buf, to_copy); 377 378 addr += to_copy; 379 total += to_copy; 380 } 381 382 return EOK; 383 } 384 385 static void hex_dump(uintptr_t addr, void *buffer, size_t size) 386 { 387 uint8_t *data = (uint8_t *) buffer; 388 uint8_t b; 389 size_t pos, i; 390 391 assert(addr % LINE_BYTES == 0); 392 assert(size % LINE_BYTES == 0); 393 394 pos = 0; 395 396 while (pos < size) { 397 printf("%08lx:", addr + pos); 398 for (i = 0; i < LINE_BYTES; ++i) { 399 if (i % 4 == 0) putchar(' '); 400 printf(" %02x", data[pos + i]); 401 } 402 putchar('\t'); 403 404 for (i = 0; i < LINE_BYTES; ++i) { 405 b = data[pos + i]; 406 if (b >= 32 && b < 127) { 407 putchar(b); 408 } else { 409 putchar(' '); 410 } 411 } 412 putchar('\n'); 413 pos += LINE_BYTES; 414 } 415 } 416 353 417 static int td_read_uintptr(void *arg, uintptr_t addr, uintptr_t *value) 354 418 { -
uspace/lib/Makefile.common
rbfd7aac r01a9ef5 33 33 # Individual makefiles set: 34 34 # 35 # USPACE_PREFIXrelative path to uspace/ directory36 # LIBSlibraries to link with (with relative path)37 # EXTRA_CFLAGSadditional flags to pass to C compiler38 # JOBjob file name (like appname.job)39 # OUTPUToutput binary name (like appname)40 # SOURCESlist of source files35 # USPACE_PREFIX relative path to uspace/ directory 36 # LIBS libraries to link with (with relative path) 37 # EXTRA_CFLAGS additional flags to pass to C compiler 38 # JOB job file name (like appname.job) 39 # OUTPUT output binary name (like appname) 40 # SOURCES list of source files 41 41 # 42 42 … … 72 72 find . -name '*.o' -follow -exec rm \{\} \; 73 73 74 build: 74 build: 75 75 76 76 -include $(DEPEND) -
uspace/lib/libc/Makefile
rbfd7aac r01a9ef5 31 31 32 32 USPACE_PREFIX = $(shell pwd)/../.. 33 #LIBS = $(LIBC_PREFIX)/libc.a 33 34 LIBS = 34 35 … … 90 91 generic/stacktrace.c 91 92 93 ARCH_SOURCES = \ 94 arch/$(UARCH)/src/entry.s \ 95 arch/$(UARCH)/src/thread_entry.s 96 92 97 SOURCES = \ 93 98 $(GENERIC_SOURCES) \ -
uspace/lib/libc/Makefile.toolchain
rbfd7aac r01a9ef5 30 30 -fexec-charset=UTF-8 -fwide-exec-charset=UTF-32$(ENDIANESS) \ 31 31 -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \ 32 -Wall -Wextra -Wno- clobbered -Wno-unused-parameter -Wmissing-prototypes \32 -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes \ 33 33 -Werror-implicit-function-declaration -Werror -pipe -g -D__$(ENDIANESS)__ 34 34 -
uspace/lib/libc/arch/amd64/Makefile.inc
rbfd7aac r01a9ef5 34 34 TOOLCHAIN_DIR = $(CROSS_PREFIX)/amd64/bin 35 35 36 ARCH_SOURCES = \ 37 arch/$(UARCH)/src/entry.s \ 38 arch/$(UARCH)/src/thread_entry.s \ 39 arch/$(UARCH)/src/syscall.S \ 36 ARCH_SOURCES += arch/$(UARCH)/src/syscall.S \ 40 37 arch/$(UARCH)/src/fibril.S \ 41 38 arch/$(UARCH)/src/tls.c \ -
uspace/lib/libc/arch/arm32/Makefile.inc
rbfd7aac r01a9ef5 34 34 TOOLCHAIN_DIR = $(CROSS_PREFIX)/arm32/bin 35 35 36 ARCH_SOURCES = \ 37 arch/$(UARCH)/src/entry.s \ 38 arch/$(UARCH)/src/thread_entry.s \ 39 arch/$(UARCH)/src/syscall.c \ 36 ARCH_SOURCES += arch/$(UARCH)/src/syscall.c \ 40 37 arch/$(UARCH)/src/fibril.S \ 41 38 arch/$(UARCH)/src/tls.c \ -
uspace/lib/libc/arch/ia32/Makefile.inc
rbfd7aac r01a9ef5 34 34 TOOLCHAIN_DIR = $(CROSS_PREFIX)/ia32/bin 35 35 36 ARCH_SOURCES = \ 37 arch/$(UARCH)/src/entry.s \ 38 arch/$(UARCH)/src/thread_entry.s \ 39 arch/$(UARCH)/src/syscall.S \ 36 ARCH_SOURCES += arch/$(UARCH)/src/syscall.S \ 40 37 arch/$(UARCH)/src/fibril.S \ 41 38 arch/$(UARCH)/src/tls.c \ -
uspace/lib/libc/arch/ia64/Makefile.inc
rbfd7aac r01a9ef5 33 33 TOOLCHAIN_DIR = $(CROSS_PREFIX)/ia64/bin 34 34 35 ARCH_SOURCES = \ 36 arch/$(UARCH)/src/entry.s \ 37 arch/$(UARCH)/src/thread_entry.s \ 38 arch/$(UARCH)/src/syscall.S \ 35 ARCH_SOURCES += arch/$(UARCH)/src/syscall.S \ 39 36 arch/$(UARCH)/src/fibril.S \ 40 37 arch/$(UARCH)/src/tls.c \ -
uspace/lib/libc/arch/mips32/Makefile.inc
rbfd7aac r01a9ef5 33 33 TOOLCHAIN_DIR = $(CROSS_PREFIX)/mips32/bin 34 34 35 ARCH_SOURCES = \ 36 arch/$(UARCH)/src/entry.s \ 37 arch/$(UARCH)/src/thread_entry.s \ 38 arch/$(UARCH)/src/syscall.c \ 35 ARCH_SOURCES += arch/$(UARCH)/src/syscall.c \ 39 36 arch/$(UARCH)/src/fibril.S \ 40 37 arch/$(UARCH)/src/tls.c \ -
uspace/lib/libc/arch/mips32eb/Makefile.inc
rbfd7aac r01a9ef5 33 33 TOOLCHAIN_DIR = $(CROSS_PREFIX)/mips32eb/bin 34 34 35 ARCH_SOURCES = \ 36 arch/$(UARCH)/src/entry.s \ 37 arch/$(UARCH)/src/thread_entry.s \ 38 arch/$(UARCH)/src/syscall.c \ 35 ARCH_SOURCES += arch/$(UARCH)/src/syscall.c \ 39 36 arch/$(UARCH)/src/fibril.S \ 40 37 arch/$(UARCH)/src/tls.c \ -
uspace/lib/libc/arch/ppc32/Makefile.inc
rbfd7aac r01a9ef5 33 33 TOOLCHAIN_DIR = $(CROSS_PREFIX)/ppc32/bin 34 34 35 ARCH_SOURCES = \ 36 arch/$(UARCH)/src/entry.s \ 37 arch/$(UARCH)/src/thread_entry.s \ 38 arch/$(UARCH)/src/syscall.c \ 35 ARCH_SOURCES += arch/$(UARCH)/src/syscall.c \ 39 36 arch/$(UARCH)/src/fibril.S \ 40 37 arch/$(UARCH)/src/tls.c \ -
uspace/lib/libc/arch/sparc64/Makefile.inc
rbfd7aac r01a9ef5 33 33 TOOLCHAIN_DIR = $(CROSS_PREFIX)/sparc64/bin 34 34 35 ARCH_SOURCES = \ 36 arch/$(UARCH)/src/entry.s \ 37 arch/$(UARCH)/src/thread_entry.s \ 38 arch/$(UARCH)/src/fibril.S \ 35 ARCH_SOURCES += arch/$(UARCH)/src/fibril.S \ 39 36 arch/$(UARCH)/src/tls.c \ 40 37 arch/$(UARCH)/src/stacktrace.c \ … … 48 45 BFD_NAME = elf64-sparc 49 46 BFD_ARCH = sparc 50 51 ifeq ($(PROCESSOR),us)52 DEFS += -DSUN4U53 endif54 55 ifeq ($(PROCESSOR),us3)56 DEFS += -DSUN4U57 endif58 59 ifeq ($(PROCESSOR),sun4v)60 DEFS += -DSUN4V61 endif -
uspace/lib/libc/arch/sparc64/include/config.h
rbfd7aac r01a9ef5 36 36 #define LIBC_sparc64_CONFIG_H_ 37 37 38 #if defined (SUN4U)39 38 #define PAGE_WIDTH 14 40 #elif defined(SUN4V)41 #define PAGE_WIDTH 1342 #endif43 44 39 #define PAGE_SIZE (1 << PAGE_WIDTH) 45 40 -
uspace/lib/libc/arch/sparc64/src/thread_entry.s
rbfd7aac r01a9ef5 38 38 # Create the first stack frame. 39 39 # 40 41 #save %sp, -176, %sp 42 #flushw 43 #add %g0, -0x7ff, %fp 40 save %sp, -176, %sp 41 flushw 42 add %g0, -0x7ff, %fp 44 43 45 44 sethi %hi(_gp), %l7 -
uspace/lib/libc/generic/fibril.c
rbfd7aac r01a9ef5 211 211 } 212 212 213 /* Avoid srcf being clobbered by context_save() */ 214 srcf = __tcb_get()->fibril_data; 215 213 216 /* Choose a new fibril to run */ 214 217 fibril_t *dstf; -
uspace/lib/libc/include/atomicdflt.h
rbfd7aac r01a9ef5 56 56 } 57 57 58 #ifndef CAS 58 #ifndef CAS 59 59 static inline bool cas(atomic_t *val, long ov, long nv) 60 60 { -
uspace/lib/libc/include/stacktrace.h
rbfd7aac r01a9ef5 57 57 extern void stacktrace_prepare(void); 58 58 extern uintptr_t stacktrace_fp_get(void); 59 extern uintptr_t stacktrace_pc_get( void);59 extern uintptr_t stacktrace_pc_get(); 60 60 61 61 #endif -
uspace/srv/hid/fb/Makefile.build
rbfd7aac r01a9ef5 72 72 73 73 ifeq ($(UARCH),sparc64) 74 ifeq ($(PROCESSOR), sun4v) 75 SOURCES += niagara.c \ 76 serial_console.c 77 CFLAGS += -DNIAGARA_ENABLED 78 endif 79 80 ifeq ($(MACHINE), serengeti) 81 SOURCES += sgcn.c \ 82 serial_console.c 83 CFLAGS += -DSGCN_ENABLED 84 endif 74 SOURCES += sgcn.c \ 75 serial_console.c 76 CFLAGS += -DSGCN_ENABLED 85 77 endif 86 78 -
uspace/srv/hid/fb/main.c
rbfd7aac r01a9ef5 41 41 #include "ski.h" 42 42 #include "sgcn.h" 43 #include "niagara.h"44 43 #include "main.h" 45 44 … … 89 88 } 90 89 #endif 91 #ifdef NIAGARA_ENABLED92 if ((!initialized) && (sysinfo_value("fb.kind") == 5)) {93 if (niagara_init() == 0)94 initialized = true;95 }96 #endif97 90 #ifdef SKI_ENABLED 98 91 if ((!initialized) && (sysinfo_value("fb") != true)) { -
uspace/srv/hid/kbd/Makefile.build
rbfd7aac r01a9ef5 130 130 131 131 ifeq ($(UARCH),sparc64) 132 ifeq ($( PROCESSOR),sun4v)132 ifeq ($(MACHINE),serengeti) 133 133 SOURCES += \ 134 port/ niagara.c \134 port/sgcn.c \ 135 135 ctl/stty.c 136 136 else 137 ifeq ($(MACHINE),serengeti) 138 SOURCES += \ 139 port/sgcn.c \ 140 ctl/stty.c 141 endif 142 ifeq ($(MACHINE),generic) 143 SOURCES += \ 137 SOURCES += \ 144 138 port/sun.c \ 145 139 port/z8530.c \ 146 140 port/ns16550.c \ 147 141 ctl/sun.c 148 endif149 142 endif 150 endif151 152 ifeq ($(UARCH),abs32le)153 SOURCES += \154 port/dummy.c \155 ctl/pc.c156 143 endif 157 144 -
uspace/srv/loader/include/arch.h
rbfd7aac r01a9ef5 37 37 #define LOADER_ARCH_H_ 38 38 39 externvoid program_run(void *entry_point, void *pcb);39 void program_run(void *entry_point, void *pcb); 40 40 41 41 #endif -
uspace/srv/net/Makefile.module
rbfd7aac r01a9ef5 35 35 36 36 CFLAGS += -Iinclude -I../libadt/include 37 CFLAGS += -Wno-strict-aliasing38 37 39 38 CHECK_CFLAGS = -fsyntax-only -Wextra -Wno-div-by-zero -Wsystem-headers -Wfloat-equal -Wdeclaration-after-statement -Wundef -Wno-endif-labels -Wshadow -Wlarger-than-1500 -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes -Wmissing-declarations -Wmissing-field-initializers -Wmissing-noreturn -Wmissing-format-attribute -Wno-multichar -Wno-deprecated-declarations -Wpacked -Wpadded -Wredundant-decls -Wnested-externs -Wunreachable-code -Winline -Winvalid-pch -Wlong-long -Wvariadic-macros -Wdisabled-optimization -Wno-pointer-sign -
uspace/srv/net/include/byteorder.h
rbfd7aac r01a9ef5 39 39 40 40 #include <byteorder.h> 41 41 42 #include <sys/types.h> 42 43 44 #ifdef ARCH_IS_BIG_ENDIAN 43 45 44 /** Converts the given short number ( 16 bit ) from the host byte order to the network byte order ( big endian ). 45 * @param[in] number The number in the host byte order to be converted. 46 * @returns The number in the network byte order. 47 */ 48 #define htons( number ) host2uint16_t_be( number ) 46 // Already in the network byte order. 49 47 50 /** Converts the given long number ( 32bit ) from the host byte order to the network byte order ( big endian ).51 * @param[in] number The number in the host byte order to be converted.52 * @returns The number in the network byte order.53 */54 #define htonl( number ) host2uint32_t_be( number )48 /** Converts the given short number ( 16 bit ) from the host byte order to the network byte order ( big endian ). 49 * @param[in] number The number in the host byte order to be converted. 50 * @returns The number in the network byte order. 51 */ 52 #define htons( number ) ( number ) 55 53 56 /** Converts the given short number ( 16 bit ) from the network byte order ( big endian ) to the host byte order.57 * @param[in] number The number in the networkbyte order to be converted.58 * @returns The number in the hostbyte order.59 */60 #define ntohs( number ) uint16_t_be2host( number )54 /** Converts the given long number ( 32 bit ) from the host byte order to the network byte order ( big endian ). 55 * @param[in] number The number in the host byte order to be converted. 56 * @returns The number in the network byte order. 57 */ 58 #define htonl( number ) ( number ) 61 59 62 /** Converts the given long number ( 32 bit ) from the network byte order ( big endian ) to the host byte order. 63 * @param[in] number The number in the network byte order to be converted. 64 * @returns The number in the host byte order. 65 */ 66 #define ntohl( number ) uint32_t_be2host( number ) 60 /** Converts the given short number ( 16 bit ) from the network byte order ( big endian ) to the host byte order. 61 * @param[in] number The number in the network byte order to be converted. 62 * @returns The number in the host byte order. 63 */ 64 #define ntohs( number ) ( number ) 65 66 /** Converts the given long number ( 32 bit ) from the network byte order ( big endian ) to the host byte order. 67 * @param[in] number The number in the network byte order to be converted. 68 * @returns The number in the host byte order. 69 */ 70 #define ntohl( number ) ( number ) 71 72 #else 73 74 // Has to be swapped. 75 76 /** Converts the given short number ( 16 bit ) from the host byte order to the network byte order ( big endian ). 77 * @param[in] number The number in the host byte order to be converted. 78 * @returns The number in the network byte order. 79 */ 80 #define htons( number ) uint16_t_byteorder_swap(( uint16_t )( number )) 81 82 /** Converts the given long number ( 32 bit ) from the host byte order to the network byte order ( big endian ). 83 * @param[in] number The number in the host byte order to be converted. 84 * @returns The number in the network byte order. 85 */ 86 #define htonl( number ) uint32_t_byteorder_swap( number ) 87 88 /** Converts the given short number ( 16 bit ) from the network byte order ( big endian ) to the host byte order. 89 * @param[in] number The number in the network byte order to be converted. 90 * @returns The number in the host byte order. 91 */ 92 #define ntohs( number ) uint16_t_byteorder_swap(( uint16_t )( number )) 93 94 /** Converts the given long number ( 32 bit ) from the network byte order ( big endian ) to the host byte order. 95 * @param[in] number The number in the network byte order to be converted. 96 * @returns The number in the host byte order. 97 */ 98 #define ntohl( number ) uint32_t_byteorder_swap( number ) 99 100 #endif 67 101 68 102 #endif -
uspace/srv/net/modules.c
rbfd7aac r01a9ef5 55 55 56 56 int connect_to_service_timeout( services_t need, suseconds_t timeout ){ 57 i pcarg_tphone;58 int 57 int phone; 58 int res; 59 59 60 60 while( true ){ 61 res = async_req_3_5( PHONE_NS, IPC_M_CONNECT_ME_TO, need, 0, 0, NULL, NULL, NULL, NULL, & phone );62 if( res >= 0){61 res = async_req_3_5( PHONE_NS, IPC_M_CONNECT_ME_TO, need, 0, 0, NULL, NULL, NULL, NULL, ( ipcarg_t * ) & phone ); 62 if(( res >= 0 ) && ( phone >= 0 )){ 63 63 return phone; 64 64 } -
uspace/srv/net/netif/dp8390/dp8390.h
rbfd7aac r01a9ef5 353 353 port_t de_data_port; 354 354 int de_16bit; 355 longde_ramsize;355 int de_ramsize; 356 356 int de_offset_page; 357 357 int de_startpage; -
uspace/srv/net/netif/dp8390/dp8390_module.c
rbfd7aac r01a9ef5 208 208 } 209 209 210 int netif_probe_message( device_id_t device_id, int irq, uintptr_t io ){210 int netif_probe_message( device_id_t device_id, int irq, int io ){ 211 211 ERROR_DECLARE; 212 212 … … 280 280 if( device->state != NETIF_ACTIVE ){ 281 281 dep = ( dpeth_t * ) device->specific; 282 dp8390_cmds[ 0 ].addr = ( void * ) ( uint ptr_t ) ( dep->de_dp8390_port + DP_ISR );282 dp8390_cmds[ 0 ].addr = ( void * ) ( uint32_t ) ( dep->de_dp8390_port + DP_ISR ); 283 283 dp8390_cmds[ 2 ].addr = dp8390_cmds[ 0 ].addr; 284 284 ERROR_PROPAGATE( ipc_register_irq( dep->de_irq, device->device_id, device->device_id, & dp8390_code )); -
uspace/srv/net/netif/dp8390/dp8390_port.h
rbfd7aac r01a9ef5 169 169 /** Type definition of a port. 170 170 */ 171 typedef longport_t;171 typedef int port_t; 172 172 173 173 /* dl_eth.h */ … … 256 256 /** Type definition of the virtual addresses and lengths in bytes. 257 257 */ 258 typedef unsigned longvir_bytes;258 typedef unsigned int vir_bytes; 259 259 260 260 /** Type definition of the input/output vector. -
uspace/srv/net/netif/lo/lo.c
rbfd7aac r01a9ef5 165 165 } 166 166 167 int netif_probe_message( device_id_t device_id, int irq, uintptr_t io ){167 int netif_probe_message( device_id_t device_id, int irq, int io ){ 168 168 ERROR_DECLARE; 169 169 -
uspace/srv/net/netif/netif_module.h
rbfd7aac r01a9ef5 60 60 * @returns Other error codes as defined for the specific module message implementation. 61 61 */ 62 int netif_probe_message( device_id_t device_id, int irq, uintptr_t io );62 int netif_probe_message( device_id_t device_id, int irq, int io ); 63 63 64 64 /** Sends the packet queue. -
uspace/srv/net/socket/socket_client.c
rbfd7aac r01a9ef5 541 541 socket_ref new_socket; 542 542 aid_t message_id; 543 ipcarg_t ipc_result; 544 int result; 543 int result; 545 544 ipc_call_t answer; 546 545 … … 593 592 ipc_data_read_start( socket->phone, cliaddr, * addrlen ); 594 593 fibril_rwlock_write_unlock( & socket_globals.lock ); 595 async_wait_for( message_id, & ipc_result ); 596 result = (int) ipc_result; 594 async_wait_for( message_id, ( ipcarg_t * ) & result ); 597 595 if( result > 0 ){ 598 596 if( result != socket_id ){ … … 736 734 socket_ref socket; 737 735 aid_t message_id; 738 ipcarg_t ipc_result; 739 int result; 736 int result; 740 737 size_t fragments; 741 738 size_t * lengths; … … 796 793 } 797 794 } 798 async_wait_for( message_id, & ipc_result ); 799 result = (int) ipc_result; 795 async_wait_for( message_id, ( ipcarg_t * ) & result ); 800 796 // if successful 801 797 if( result == EOK ){ -
uspace/srv/net/structures/packet/packet_remote.c
rbfd7aac r01a9ef5 65 65 ERROR_DECLARE; 66 66 67 ipcarg_tsize;67 unsigned int size; 68 68 packet_t next; 69 69 … … 101 101 ERROR_DECLARE; 102 102 103 ipcarg_tpacket_id;104 ipcarg_t size;103 packet_id_t packet_id; 104 unsigned int size; 105 105 packet_t packet; 106 106 107 if( ERROR_OCCURRED( async_req_4_2( phone, NET_PACKET_CREATE_4, max_content, addr_len, max_prefix, max_suffix, & packet_id, & size ))){107 if( ERROR_OCCURRED( async_req_4_2( phone, NET_PACKET_CREATE_4, max_content, addr_len, max_prefix, max_suffix, ( ipcarg_t * ) & packet_id, & size ))){ 108 108 return NULL; 109 109 } … … 120 120 ERROR_DECLARE; 121 121 122 ipcarg_t packet_id;123 ipcarg_t size;122 packet_id_t packet_id; 123 unsigned int size; 124 124 packet_t packet; 125 125 126 if( ERROR_OCCURRED( async_req_1_2( phone, NET_PACKET_CREATE_1, content, & packet_id, & size ))){126 if( ERROR_OCCURRED( async_req_1_2( phone, NET_PACKET_CREATE_1, content, ( ipcarg_t * ) & packet_id, & size ))){ 127 127 return NULL; 128 128 }
Note:
See TracChangeset
for help on using the changeset viewer.