Changeset 04803bf in mainline for uspace/lib/c/arch/ia32
- Timestamp:
- 2011-03-21T22:00:17Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 143932e3
- Parents:
- b50b5af2 (diff), 7308e84 (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:
- uspace/lib/c/arch/ia32
- Files:
-
- 6 added
- 18 moved
-
Makefile.common (added)
-
Makefile.inc (moved) (moved from uspace/lib/libc/arch/ia64/Makefile.inc ) (1 diff)
-
_link.ld.in (added)
-
include/atomic.h (moved) (moved from uspace/lib/libc/arch/ia32/include/atomic.h ) (2 diffs)
-
include/config.h (moved) (moved from uspace/lib/libc/arch/ia32/include/config.h )
-
include/ddi.h (moved) (moved from uspace/lib/libc/arch/ia32/include/ddi.h )
-
include/faddr.h (moved) (moved from uspace/lib/libc/arch/ia32/include/faddr.h )
-
include/fibril.h (moved) (moved from uspace/lib/libc/arch/ia32/include/fibril.h ) (2 diffs)
-
include/inttypes.h (added)
-
include/istate.h (added)
-
include/limits.h (moved) (moved from uspace/lib/libc/arch/ia32/include/limits.h )
-
include/stackarg.h (moved) (moved from uspace/lib/libc/arch/ia32/include/stackarg.h )
-
include/syscall.h (moved) (moved from uspace/lib/libc/arch/ia32/include/syscall.h ) (1 diff)
-
include/thread.h (moved) (moved from uspace/lib/libc/arch/ia32/include/thread.h )
-
include/tls.h (moved) (moved from uspace/lib/libc/arch/ia32/include/tls.h ) (1 diff)
-
include/types.h (moved) (moved from uspace/lib/libc/arch/ia32/include/types.h ) (2 diffs)
-
src/entry.s (moved) (moved from uspace/lib/libc/arch/ia32/src/entry.s ) (3 diffs)
-
src/fibril.S (moved) (moved from uspace/lib/libc/arch/ia32/src/fibril.S )
-
src/setjmp.S (moved) (moved from uspace/lib/libc/arch/ia32/src/setjmp.S )
-
src/stacktrace.c (added)
-
src/stacktrace_asm.S (added)
-
src/syscall.S (moved) (moved from uspace/lib/libc/arch/ia32/src/syscall.S ) (4 diffs)
-
src/thread_entry.s (moved) (moved from uspace/lib/libc/arch/ia32/src/thread_entry.s ) (1 diff)
-
src/tls.c (moved) (moved from uspace/lib/libc/arch/ia32/src/tls.c )
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/arch/ia32/Makefile.inc
rb50b5af2 r04803bf 27 27 # 28 28 29 ## Toolchain configuration 30 # 31 32 TARGET = ia64-pc-linux-gnu 33 TOOLCHAIN_DIR = $(CROSS_PREFIX)/ia64/bin 34 35 ARCH_SOURCES += arch/$(UARCH)/src/syscall.S \ 29 ARCH_SOURCES = \ 30 arch/$(UARCH)/src/entry.s \ 31 arch/$(UARCH)/src/thread_entry.s \ 32 arch/$(UARCH)/src/syscall.S \ 36 33 arch/$(UARCH)/src/fibril.S \ 37 34 arch/$(UARCH)/src/tls.c \ 38 arch/$(UARCH)/src/ddi.c 35 arch/$(UARCH)/src/setjmp.S \ 36 arch/$(UARCH)/src/stacktrace.c \ 37 arch/$(UARCH)/src/stacktrace_asm.S 39 38 40 CFLAGS += -fno-unwind-tables 41 LFLAGS += -N $(SOFTINT_PREFIX)/libsoftint.a 42 43 ENDIANESS = LE 44 45 BFD_NAME = elf64-ia64-little 46 BFD_ARCH = ia64-elf64 39 .PRECIOUS: arch/$(UARCH)/src/entry.o -
uspace/lib/c/arch/ia32/include/atomic.h
rb50b5af2 r04803bf 36 36 #define LIBC_ia32_ATOMIC_H_ 37 37 38 static inline void atomic_inc(atomic_t *val) { 39 asm volatile ("lock incl %0\n" : "+m" (val->count)); 38 #define LIBC_ARCH_ATOMIC_H_ 39 40 #include <atomicdflt.h> 41 42 static inline void atomic_inc(atomic_t *val) 43 { 44 asm volatile ( 45 "lock incl %[count]\n" 46 : [count] "+m" (val->count) 47 ); 40 48 } 41 49 42 static inline void atomic_dec(atomic_t *val) { 43 asm volatile ("lock decl %0\n" : "+m" (val->count)); 50 static inline void atomic_dec(atomic_t *val) 51 { 52 asm volatile ( 53 "lock decl %[count]\n" 54 : [count] "+m" (val->count) 55 ); 44 56 } 45 57 46 static inline long atomic_postinc(atomic_t *val)58 static inline atomic_count_t atomic_postinc(atomic_t *val) 47 59 { 48 long r; 49 50 asm volatile ( 51 "movl $1, %0\n" 52 "lock xaddl %0, %1\n" 53 : "=r" (r), "+m" (val->count) 54 ); 55 56 return r; 57 } 58 59 static inline long atomic_postdec(atomic_t *val) 60 { 61 long r; 60 atomic_count_t r = 1; 62 61 63 62 asm volatile ( 64 " movl $-1, %0\n"65 "lock xaddl %0, %1\n"66 : "=r" (r), "+m" (val->count)63 "lock xaddl %[r], %[count]\n" 64 : [count] "+m" (val->count), 65 [r] "+r" (r) 67 66 ); 68 67 … … 70 69 } 71 70 72 #define atomic_preinc(val) (atomic_postinc(val) + 1) 73 #define atomic_predec(val) (atomic_postdec(val) - 1) 71 static inline atomic_count_t atomic_postdec(atomic_t *val) 72 { 73 atomic_count_t r = -1; 74 75 asm volatile ( 76 "lock xaddl %[r], %[count]\n" 77 : [count] "+m" (val->count), 78 [r] "+r" (r) 79 ); 80 81 return r; 82 } 83 84 #define atomic_preinc(val) (atomic_postinc(val) + 1) 85 #define atomic_predec(val) (atomic_postdec(val) - 1) 74 86 75 87 #endif -
uspace/lib/c/arch/ia32/include/fibril.h
rb50b5af2 r04803bf 44 44 #define SP_DELTA (12) 45 45 46 #define context_set(c, _pc, stack, size, ptls) \ 47 do { \ 48 (c)->pc = (sysarg_t) (_pc); \ 49 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 50 (c)->tls = (sysarg_t) (ptls); \ 51 (c)->ebp = 0; \ 52 } while (0) 53 46 54 /* We include only registers that must be preserved 47 55 * during function call … … 59 67 } context_t; 60 68 69 static inline uintptr_t context_get_fp(context_t *ctx) 70 { 71 return ctx->ebp; 72 } 73 61 74 #endif 62 75 -
uspace/lib/c/arch/ia32/include/syscall.h
rb50b5af2 r04803bf 40 40 #include <kernel/syscall/syscall.h> 41 41 42 #define __syscall0 __syscall_sysenter43 #define __syscall1 __syscall_sysenter44 #define __syscall2 __syscall_sysenter45 #define __syscall3 __syscall_sysenter46 #define __syscall4 __syscall_sysenter47 #define __syscall5 __syscall_int48 #define __syscall6 __syscall_int42 #define __syscall0 __syscall_fast_func 43 #define __syscall1 __syscall_fast_func 44 #define __syscall2 __syscall_fast_func 45 #define __syscall3 __syscall_fast_func 46 #define __syscall4 __syscall_fast_func 47 #define __syscall5 __syscall_slow 48 #define __syscall6 __syscall_slow 49 49 50 extern sysarg_t 51 __syscall_sysenter(const sysarg_t, const sysarg_t, const sysarg_t, const sysarg_t,52 const sysarg_t, const sysarg_t,const syscall_t);50 extern sysarg_t (* __syscall_fast_func)(const sysarg_t, const sysarg_t, 51 const sysarg_t, const sysarg_t, const sysarg_t, const sysarg_t, 52 const syscall_t); 53 53 54 extern sysarg_t 55 __syscall_int(const sysarg_t, const sysarg_t, const sysarg_t, const sysarg_t, 56 const sysarg_t, const sysarg_t, const syscall_t); 54 extern sysarg_t __syscall_slow(const sysarg_t, const sysarg_t, const sysarg_t, 55 const sysarg_t, const sysarg_t, const sysarg_t, const syscall_t); 57 56 58 57 #endif -
uspace/lib/c/arch/ia32/include/tls.h
rb50b5af2 r04803bf 53 53 { 54 54 void *retval; 55 56 asm ("movl %%gs:0, %0" : "=r"(retval)); 55 56 asm ( 57 "movl %%gs:0, %0" 58 : "=r" (retval) 59 ); 60 57 61 return retval; 58 62 } -
uspace/lib/c/arch/ia32/include/types.h
rb50b5af2 r04803bf 36 36 #define LIBC_ia32_TYPES_H_ 37 37 38 typedef unsigned int sysarg_t; 38 #define __32_BITS__ 39 39 40 typedef char int8_t; 41 typedef short int int16_t; 42 typedef int int32_t; 43 typedef long long int int64_t; 40 #include <libarch/common.h> 44 41 45 typedef unsigned char uint8_t; 46 typedef unsigned short int uint16_t; 47 typedef unsigned int uint32_t; 48 typedef unsigned long long int uint64_t; 42 #define SIZE_MIN UINT32_MIN 43 #define SIZE_MAX UINT32_MAX 44 45 #define SSIZE_MIN INT32_MIN 46 #define SSIZE_MAX INT32_MAX 47 48 typedef uint32_t sysarg_t; 49 49 50 50 typedef int32_t ssize_t; … … 52 52 53 53 typedef uint32_t uintptr_t; 54 typedef uint32_t atomic_count_t; 55 typedef int32_t atomic_signed_t; 54 56 55 57 #endif -
uspace/lib/c/arch/ia32/src/entry.s
rb50b5af2 r04803bf 27 27 # 28 28 29 INTEL_CPUID_STANDARD = 1 30 INTEL_SEP = 11 31 29 32 .section .init, "ax" 30 33 … … 35 38 ## User-space task entry point 36 39 # 37 # %e bxcontains the PCB pointer40 # %edi contains the PCB pointer 38 41 # 39 42 __entry: … … 43 46 mov %ax, %fs 44 47 # Do not set %gs, it contains descriptor that can see TLS 45 48 49 # Detect the mechanism used for making syscalls 50 movl $(INTEL_CPUID_STANDARD), %eax 51 cpuid 52 bt $(INTEL_SEP), %edx 53 jnc 0f 54 leal __syscall_fast_func, %eax 55 movl $__syscall_fast, (%eax) 56 0: 57 # 58 # Create the first stack frame. 59 # 60 pushl $0 61 movl %esp, %ebp 62 46 63 # Pass the PCB pointer to __main as the first argument 47 pushl %e bx64 pushl %edi 48 65 call __main 49 50 call __exit -
uspace/lib/c/arch/ia32/src/syscall.S
rb50b5af2 r04803bf 27 27 # 28 28 29 .data 30 31 .global __syscall_fast_func 32 __syscall_fast_func: 33 .long __syscall_slow 34 29 35 .text 30 36 … … 35 41 * could benefit from this and not save unused registers on the stack. 36 42 */ 37 .global __syscall_ int38 __syscall_ int:43 .global __syscall_slow 44 __syscall_slow: 39 45 pushl %ebx 40 46 pushl %esi … … 64 70 * segment, otherwise the SYSENTER wouldn't work in the first place). 65 71 */ 66 .global __syscall_ sysenter67 .type __syscall_ sysenter, @function72 .global __syscall_fast 73 .type __syscall_fast, @function 68 74 69 __syscall_ sysenter:75 __syscall_fast: 70 76 pushl %ebx 71 77 pushl %esi … … 92 98 ret 93 99 94 .size __syscall_ sysenter, . - __syscall_sysenter100 .size __syscall_fast, . - __syscall_fast -
uspace/lib/c/arch/ia32/src/thread_entry.s
rb50b5af2 r04803bf 42 42 43 43 # 44 # Create the first stack frame. 45 # 46 pushl $0 47 mov %esp, %ebp 48 49 # 44 50 # EAX contains address of uarg. 45 51 #
Note:
See TracChangeset
for help on using the changeset viewer.
