Changeset 5f70118 in mainline for kernel/arch/ia32
- Timestamp:
- 2010-01-10T12:16:59Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c77a64f
- Parents:
- 309ede1 (diff), 1ac3a52 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- kernel/arch/ia32
- Files:
-
- 1 added
- 17 edited
- 1 moved
-
Makefile.inc (modified) (3 diffs)
-
_link.ld.in (modified) (1 diff)
-
include/context.h (modified) (1 diff)
-
include/cpu.h (modified) (2 diffs)
-
include/cpuid.h (modified) (1 diff)
-
include/interrupt.h (modified) (2 diffs)
-
include/mm/page.h (modified) (1 diff)
-
include/types.h (modified) (1 diff)
-
src/asm.S (modified) (3 diffs)
-
src/boot/boot.S (modified) (3 diffs)
-
src/cpu/cpu.c (modified) (5 diffs)
-
src/debug/stacktrace.c (moved) (moved from uspace/lib/libc/arch/mips32/include/stackarg.h ) (2 diffs)
-
src/debug/stacktrace_asm.S (added)
-
src/ia32.c (modified) (3 diffs)
-
src/interrupt.c (modified) (4 diffs)
-
src/mm/page.c (modified) (1 diff)
-
src/proc/scheduler.c (modified) (1 diff)
-
src/smp/ap.S (modified) (1 diff)
-
src/userspace.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/Makefile.inc
r309ede1 r5f70118 34 34 BFD = binary 35 35 TARGET = i686-pc-linux-gnu 36 CLANG_ARCH = i386 36 37 TOOLCHAIN_DIR = $(CROSS_PREFIX)/ia32 37 38 … … 43 44 ICC_CFLAGS += $(CMN1) 44 45 SUNCC_CFLAGS += $(CMN1) 46 CLANG_CFLAGS += $(CMN1) 45 47 46 48 ## Accepted CPUs … … 71 73 GCC_CFLAGS += $(CMN2) 72 74 ICC_CFLAGS += $(CMN2) 75 CLANG_CFLAGS += $(CMN2) 73 76 74 77 ARCH_SOURCES = \ 75 78 arch/$(KARCH)/src/context.S \ 76 79 arch/$(KARCH)/src/debug/panic.s \ 80 arch/$(KARCH)/src/debug/stacktrace.c \ 81 arch/$(KARCH)/src/debug/stacktrace_asm.S \ 77 82 arch/$(KARCH)/src/delay.s \ 78 83 arch/$(KARCH)/src/asm.S \ -
kernel/arch/ia32/_link.ld.in
r309ede1 r5f70118 42 42 hardcoded_unmapped_kdata_size = .; 43 43 LONG(unmapped_kdata_end - unmapped_kdata_start); 44 . = ALIGN(8); 44 45 symbol_table = .; 45 46 *(symtab.*); /* Symbol table, must be LAST symbol! */ -
kernel/arch/ia32/include/context.h
r309ede1 r5f70118 49 49 #define SP_DELTA (8 + STACK_ITEM_SIZE) 50 50 51 #define context_set(c, _pc, stack, size) \ 52 do { \ 53 (c)->pc = (uintptr_t) (_pc); \ 54 (c)->sp = ((uintptr_t) (stack)) + (size) - SP_DELTA; \ 55 (c)->ebp = 0; \ 56 } while (0) 57 51 58 #endif /* KERNEL */ 52 59 -
kernel/arch/ia32/include/cpu.h
r309ede1 r5f70118 50 50 #include <arch/pm.h> 51 51 #include <arch/asm.h> 52 #include <arch/cpuid.h> 52 53 53 54 typedef struct { … … 56 57 unsigned int model; 57 58 unsigned int stepping; 59 cpuid_feature_info fi; 60 58 61 tss_t *tss; 59 62 -
kernel/arch/ia32/include/cpuid.h
r309ede1 r5f70118 63 63 64 64 struct __cpuid_feature_info { 65 unsigned : 23; 65 unsigned : 11; 66 unsigned sep : 1; 67 unsigned : 11; 66 68 unsigned mmx : 1; 67 69 unsigned fxsr : 1; -
kernel/arch/ia32/include/interrupt.h
r309ede1 r5f70118 69 69 #define VECTOR_DEBUG_IPI (IVT_FREEBASE + 2) 70 70 71 typedef struct {71 typedef struct istate { 72 72 uint32_t eax; 73 73 uint32_t ecx; 74 74 uint32_t edx; 75 uint32_t ebp; 75 76 76 77 uint32_t gs; … … 102 103 } 103 104 105 static inline unative_t istate_get_fp(istate_t *istate) 106 { 107 return istate->ebp; 108 } 109 104 110 extern void (* disable_irqs_function)(uint16_t irqmask); 105 111 extern void (* enable_irqs_function)(uint16_t irqmask); -
kernel/arch/ia32/include/mm/page.h
r309ede1 r5f70118 146 146 #define PFERR_CODE_RSVD (1 << 3) 147 147 148 static inline int get_pt_flags(pte_t *pt, size_t i) 148 /** Page Table Entry. */ 149 typedef struct { 150 unsigned present : 1; 151 unsigned writeable : 1; 152 unsigned uaccessible : 1; 153 unsigned page_write_through : 1; 154 unsigned page_cache_disable : 1; 155 unsigned accessed : 1; 156 unsigned dirty : 1; 157 unsigned pat : 1; 158 unsigned global : 1; 159 unsigned soft_valid : 1; /**< Valid content even if the present bit is not set. */ 160 unsigned avl : 2; 161 unsigned frame_address : 20; 162 } __attribute__ ((packed)) pte_t; 163 164 static inline unsigned int get_pt_flags(pte_t *pt, size_t i) 149 165 { 150 166 pte_t *p = &pt[i]; -
kernel/arch/ia32/include/types.h
r309ede1 r5f70118 80 80 #define PRIxn "x" /**< Format for hexadecimal (u)native_t. */ 81 81 82 /** Page Table Entry. */83 typedef struct {84 unsigned present : 1;85 unsigned writeable : 1;86 unsigned uaccessible : 1;87 unsigned page_write_through : 1;88 unsigned page_cache_disable : 1;89 unsigned accessed : 1;90 unsigned dirty : 1;91 unsigned pat : 1;92 unsigned global : 1;93 unsigned soft_valid : 1; /**< Valid content even if the present bit is not set. */94 unsigned avl : 2;95 unsigned frame_address : 20;96 } __attribute__ ((packed)) pte_t;97 98 82 #endif 99 83 -
kernel/arch/ia32/src/asm.S
r309ede1 r5f70118 269 269 pushl %gs 270 270 271 pushl %ebp 271 272 pushl %edx 272 273 pushl %ecx … … 278 279 movw %ax, %es 279 280 280 cld 281 # stop stack traces here 282 xorl %ebp, %ebp 281 283 282 284 pushl %esp # *istate … … 290 292 popl %ecx 291 293 popl %edx 294 popl %ebp 292 295 293 296 popl %gs -
kernel/arch/ia32/src/boot/boot.S
r309ede1 r5f70118 85 85 pse_supported: 86 86 87 bt $(INTEL_SEP), %edx88 jc sep_supported89 90 movl $sep_msg, %esi91 jmp error_halt92 93 sep_supported:94 95 87 #include "vesa_prot.inc" 96 88 … … 102 94 pushl grub_eax 103 95 call arch_pre_main 96 97 # Create the first stack frame 98 pushl $0 99 movl %esp, %ebp 104 100 105 101 call main_bsp … … 225 221 .asciz "Page Size Extension not supported. System halted." 226 222 227 sep_msg:228 .asciz "SYSENTER/SYSEXIT not supported. System halted." -
kernel/arch/ia32/src/cpu/cpu.c
r309ede1 r5f70118 92 92 void cpu_arch_init(void) 93 93 { 94 cpuid_feature_info fi;95 94 cpuid_extended_feature_info efi; 96 95 cpu_info_t info; … … 102 101 CPU->fpu_owner = NULL; 103 102 104 cpuid( 1, &info);103 cpuid(INTEL_CPUID_STANDARD, &info); 105 104 106 fi.word = info.cpuid_edx;105 CPU->arch.fi.word = info.cpuid_edx; 107 106 efi.word = info.cpuid_ecx; 108 107 109 if ( fi.bits.fxsr)108 if (CPU->arch.fi.bits.fxsr) 110 109 fpu_fxsr(); 111 110 else 112 111 fpu_fsr(); 113 112 114 if ( fi.bits.sse) {113 if (CPU->arch.fi.bits.sse) { 115 114 asm volatile ( 116 115 "mov %%cr4, %[help]\n" … … 122 121 } 123 122 124 /* Setup fast SYSENTER/SYSEXIT syscalls */ 125 syscall_setup_cpu(); 123 if (CPU->arch.fi.bits.sep) { 124 /* Setup fast SYSENTER/SYSEXIT syscalls */ 125 syscall_setup_cpu(); 126 } 126 127 } 127 128 … … 132 133 CPU->arch.vendor = VendorUnknown; 133 134 if (has_cpuid()) { 134 cpuid( 0, &info);135 cpuid(INTEL_CPUID_LEVEL, &info); 135 136 136 137 /* … … 150 151 CPU->arch.vendor = VendorIntel; 151 152 152 cpuid( 1, &info);153 cpuid(INTEL_CPUID_STANDARD, &info); 153 154 CPU->arch.family = (info.cpuid_eax >> 8) & 0x0f; 154 155 CPU->arch.model = (info.cpuid_eax >> 4) & 0x0f; -
kernel/arch/ia32/src/debug/stacktrace.c
r309ede1 r5f70118 1 1 /* 2 * Copyright (c) 20 06 Josef Cejka2 * Copyright (c) 2010 Jakub Jermar 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup libcmips3229 /** @addtogroup ia32 30 30 * @{ 31 31 */ 32 32 /** @file 33 * @ingroup libcmips32eb34 33 */ 35 34 36 #ifndef LIBC_mips32_STACKARG_H_ 37 #define LIBC_mips32_STACKARG_H_ 35 #include <stacktrace.h> 36 #include <syscall/copy.h> 37 #include <arch/types.h> 38 #include <typedefs.h> 38 39 39 /* dont allow to define it second time in stdarg.h */ 40 #define __VARARGS_DEFINED40 #define FRAME_OFFSET_FP_PREV 0 41 #define FRAME_OFFSET_RA 1 41 42 42 #include <sys/types.h> 43 bool kernel_frame_pointer_validate(uintptr_t fp) 44 { 45 return fp != 0; 46 } 43 47 44 /** 45 * va_arg macro for MIPS32 - problem is that 64 bit values must be aligned on an 8-byte boundary (32bit values not) 46 * To satisfy this, paddings must be sometimes inserted. 47 */ 48 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 49 { 50 uint32_t *stack = (void *) fp; 51 *prev = stack[FRAME_OFFSET_FP_PREV]; 52 return true; 53 } 48 54 49 typedef uint8_t* va_list; 55 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 56 { 57 uint32_t *stack = (void *) fp; 58 *ra = stack[FRAME_OFFSET_RA]; 59 return true; 60 } 50 61 51 #define va_start(ap, lst) \ 52 ((ap) = (va_list)&(lst) + sizeof(lst)) 62 bool uspace_frame_pointer_validate(uintptr_t fp) 63 { 64 return fp != 0; 65 } 53 66 54 #define va_arg(ap, type) \ 55 (((type *)((ap) = (va_list)( (sizeof(type) <= 4) ? ((uint32_t)((ap) + 2*4 - 1) & (~3)) : ((uint32_t)((ap) + 2*8 -1) & (~7)) )))[-1]) 67 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 68 { 69 return !copy_from_uspace((void *) prev, 70 (uint32_t *) fp + FRAME_OFFSET_FP_PREV, sizeof(*prev)); 71 } 56 72 57 #define va_end(ap) 58 59 #endif 73 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 74 { 75 return !copy_from_uspace((void *) ra, (uint32_t *) fp + FRAME_OFFSET_RA, 76 sizeof(*ra)); 77 } 60 78 61 79 /** @} -
kernel/arch/ia32/src/ia32.c
r309ede1 r5f70118 68 68 #include <sysinfo/sysinfo.h> 69 69 #include <arch/boot/boot.h> 70 #include <memstr.h> 70 71 71 72 #ifdef CONFIG_SMP … … 169 170 i8042_wire(i8042_instance, kbrd); 170 171 trap_virtual_enable_irqs(1 << IRQ_KBD); 172 trap_virtual_enable_irqs(1 << IRQ_MOUSE); 171 173 } 172 174 } … … 176 178 * self-sufficient. 177 179 */ 178 sysinfo_set_item_val("kbd", NULL, true); 179 sysinfo_set_item_val("kbd.inr", NULL, IRQ_KBD); 180 sysinfo_set_item_val("kbd.address.physical", NULL, 180 sysinfo_set_item_val("i8042", NULL, true); 181 sysinfo_set_item_val("i8042.inr_a", NULL, IRQ_KBD); 182 sysinfo_set_item_val("i8042.inr_b", NULL, IRQ_MOUSE); 183 sysinfo_set_item_val("i8042.address.physical", NULL, 181 184 (uintptr_t) I8042_BASE); 182 sysinfo_set_item_val(" kbd.address.kernel", NULL,185 sysinfo_set_item_val("i8042.address.kernel", NULL, 183 186 (uintptr_t) I8042_BASE); 184 187 #endif -
kernel/arch/ia32/src/interrupt.c
r309ede1 r5f70118 53 53 #include <ddi/irq.h> 54 54 #include <symtab.h> 55 #include <stacktrace.h> 55 56 56 57 /* … … 79 80 printf("stack: %#lx, %#lx, %#lx, %#lx\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]); 80 81 printf(" %#lx, %#lx, %#lx, %#lx\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]); 82 83 stack_trace_istate(istate); 81 84 } 82 85 … … 96 99 decode_istate(istate); 97 100 panic("Unserviced interrupt: %d.", n); 101 } 102 103 static void de_fault(int n, istate_t *istate) 104 { 105 fault_if_from_uspace(istate, "Divide error."); 106 107 decode_istate(istate); 108 panic("Divide error."); 98 109 } 99 110 … … 215 226 } 216 227 228 exc_register(0, "de_fault", (iroutine) de_fault); 217 229 exc_register(7, "nm_fault", (iroutine) nm_fault); 218 230 exc_register(12, "ss_fault", (iroutine) ss_fault); -
kernel/arch/ia32/src/mm/page.c
r309ede1 r5f70118 80 80 { 81 81 if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) 82 panic("Unable to map physical memory %p (%d bytes).", physaddr, size) 82 panic("Unable to map physical memory %p (%d bytes).", physaddr, size); 83 83 84 84 uintptr_t virtaddr = PA2KA(last_frame); -
kernel/arch/ia32/src/proc/scheduler.c
r309ede1 r5f70118 61 61 SP_DELTA]; 62 62 63 /* Set kernel stack for CP3 -> CPL0 switch via SYSENTER */ 64 write_msr(IA32_MSR_SYSENTER_ESP, kstk); 63 if (CPU->arch.fi.bits.sep) { 64 /* Set kernel stack for CP3 -> CPL0 switch via SYSENTER */ 65 write_msr(IA32_MSR_SYSENTER_ESP, kstk); 66 } 65 67 66 68 /* Set kernel stack for CPL3 -> CPL0 switch via interrupt */ -
kernel/arch/ia32/src/smp/ap.S
r309ede1 r5f70118 78 78 addl $0x80000000, %esp # PA2KA(ctx.sp) 79 79 80 pushl $0 # create the first stack frame 81 movl %esp, %ebp 82 80 83 jmpl $KTEXT, $main_ap 81 84 -
kernel/arch/ia32/src/userspace.c
r309ede1 r5f70118 70 70 "movl %[uarg], %%eax\n" 71 71 72 /* %e bxis defined to hold pcb_ptr - set it to 0 */73 "xorl %%e bx, %%ebx\n"72 /* %edi is defined to hold pcb_ptr - set it to 0 */ 73 "xorl %%edi, %%edi\n" 74 74 75 75 "iret\n"
Note:
See TracChangeset
for help on using the changeset viewer.
