diff --git a/contrib/sdk/sources/newlib/libc/crt/gthr-kos32.c b/contrib/sdk/sources/newlib/libc/crt/gthr-kos32.c index ddbed39534..9f7f833581 100644 --- a/contrib/sdk/sources/newlib/libc/crt/gthr-kos32.c +++ b/contrib/sdk/sources/newlib/libc/crt/gthr-kos32.c @@ -21,7 +21,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ #include -#include +#include +#include #include "gthr-kos32.h" #define FUTEX_INIT 0 @@ -35,6 +36,42 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define exchange_release(ptr, new) \ __atomic_exchange_4((ptr), (new), __ATOMIC_RELEASE) +#define TLS_KEY_PID 0 +#define TLS_KEY_TID 4 +#define TLS_KEY_LOW_STACK 8 +#define TLS_KEY_HIGH_STACK 12 +#define TLS_KEY_LIBC 16 + +unsigned int tls_alloc(void); +int tls_free(unsigned int key); + +static inline int tls_set(unsigned int key, void *val) +{ + int ret = -1; + if(key < 4096) + { + __asm__ __volatile__( + "movl %0, %%fs:(%1)" + ::"r"(val),"r"(key)); + ret = 0; + } + return ret; +}; + +static inline void *tls_get(unsigned int key) +{ + void *val = (void*)-1; + if(key < 4096) + { + __asm__ __volatile__( + "movl %%fs:(%1), %0" + :"=r"(val) + :"r"(key)); + }; + return val; +} + + int __gthr_kos32_once (__gthread_once_t *once, void (*func) (void)) { if (once == NULL || func == NULL) @@ -50,7 +87,7 @@ int __gthr_kos32_once (__gthread_once_t *once, void (*func) (void)) else { while (! once->done) - yield(); + _ksys_thread_yield(); } } return 0; @@ -92,25 +129,14 @@ int __gthr_kos32_setspecific (__gthread_key_t key, const void *ptr) void __gthr_kos32_mutex_init_function (__gthread_mutex_t *mutex) { - int handle; - mutex->lock = 0; - - __asm__ volatile( - "int $0x40\t" - :"=a"(handle) - :"a"(77),"b"(FUTEX_INIT),"c"(mutex)); - mutex->handle = handle; + mutex->handle = _ksys_futex_create(mutex); } void __gthr_kos32_mutex_destroy (__gthread_mutex_t *mutex) { int retval; - - __asm__ volatile( - "int $0x40\t" - :"=a"(retval) - :"a"(77),"b"(FUTEX_DESTROY),"c"(mutex->handle)); + _ksys_futex_destroy(mutex->handle); } int __gthr_kos32_mutex_lock (__gthread_mutex_t *mutex) @@ -122,13 +148,9 @@ int __gthr_kos32_mutex_lock (__gthread_mutex_t *mutex) while (exchange_acquire (&mutex->lock, 2) != 0) { - __asm__ volatile( - "int $0x40\t\n" - :"=a"(tmp) - :"a"(77),"b"(FUTEX_WAIT), - "c"(mutex->handle),"d"(2),"S"(0)); - } - return 0; + _ksys_futex_wait(mutex->handle, 2 , 0); + } + return 0; } int __gthr_kos32_mutex_trylock (__gthread_mutex_t *mutex) @@ -146,11 +168,7 @@ int __gthr_kos32_mutex_unlock (__gthread_mutex_t *mutex) if (prev != 1) { - __asm__ volatile( - "int $0x40\t" - :"=a"(prev) - :"a"(77),"b"(FUTEX_WAKE), - "c"(mutex->handle),"d"(1)); + _ksys_futex_wake(mutex->handle, 1); }; return 0; } @@ -158,14 +176,9 @@ int __gthr_kos32_mutex_unlock (__gthread_mutex_t *mutex) void __gthr_kos32_recursive_mutex_init_function (__gthread_recursive_mutex_t *mutex) { int handle; - mutex->lock = 0; - __asm__ volatile( - "int $0x40\t" - :"=a"(handle) - :"a"(77),"b"(FUTEX_INIT),"c"(mutex)); - mutex->handle = handle; + mutex->handle = _ksys_futex_create(mutex); mutex->depth = 0; mutex->owner = 0; @@ -190,11 +203,7 @@ int __gthr_kos32_recursive_mutex_lock (__gthread_recursive_mutex_t *mutex) } else while (exchange_acquire (&mutex->lock, 2) != 0) { - __asm__ volatile( - "int $0x40\t\n" - :"=a"(tmp) - :"a"(77),"b"(FUTEX_WAIT), - "c"(mutex->handle),"d"(2),"S"(0)); + _ksys_futex_wait(mutex->handle, 2, 0); mutex->depth = 1; mutex->owner = me; }; @@ -232,11 +241,7 @@ int __gthr_kos32_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) if (prev != 1) { - __asm__ volatile( - "int $0x40\t" - :"=a"(prev) - :"a"(77),"b"(FUTEX_WAKE), - "c"(mutex->handle),"d"(1)); + _ksys_futex_wake(mutex->handle, 1); }; mutex->owner = 0; }; @@ -247,12 +252,7 @@ int __gthr_kos32_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex) int __gthr_kos32_recursive_mutex_destroy (__gthread_recursive_mutex_t *mutex) { int retval; - - __asm__ volatile( - "int $0x40\t" - :"=a"(retval) - :"a"(77),"b"(FUTEX_DESTROY),"c"(mutex->handle)); - + _ksys_futex_destroy(mutex->handle); return 0; } diff --git a/contrib/sdk/sources/newlib/libc/include/sys/ksys.h b/contrib/sdk/sources/newlib/libc/include/sys/ksys.h index 8fa44cfbfd..b4ca6914ab 100644 --- a/contrib/sdk/sources/newlib/libc/include/sys/ksys.h +++ b/contrib/sdk/sources/newlib/libc/include/sys/ksys.h @@ -22,6 +22,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + #define KOSAPI static inline #define asm_inline __asm__ __volatile__ @@ -1617,7 +1621,7 @@ KOSAPI void _ksys_set_window_title(const char* title) /*============= Function 77, subfunction 0 - create futex object =============*/ -KOSAPI uint32_t _ksys_futex_create(int* futex_ctrl) +KOSAPI uint32_t _ksys_futex_create(void* futex_ctrl) { uint32_t futex_desc; asm_inline( @@ -1722,4 +1726,8 @@ static inline int _ksys_file_write_file(const char* name, unsigned long long off return res.status; } +#ifdef __cplusplus +} +#endif + #endif // _KSYS_H_ diff --git a/contrib/sdk/sources/newlib/libc/pe/crtloader.c b/contrib/sdk/sources/newlib/libc/pe/crtloader.c index 4063598039..64e687d209 100644 --- a/contrib/sdk/sources/newlib/libc/pe/crtloader.c +++ b/contrib/sdk/sources/newlib/libc/pe/crtloader.c @@ -6,7 +6,7 @@ #include #include -#include +#include #include "list.h" #include "pe.h" @@ -97,7 +97,7 @@ void* create_image(void *raw) dos = (PIMAGE_DOS_HEADER)raw; nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); - img_base = user_alloc(nt->OptionalHeader.SizeOfImage); + img_base = _ksys_alloc(nt->OptionalHeader.SizeOfImage); if(unlikely(img_base == NULL)) return 0; @@ -196,9 +196,9 @@ void* load_libc() void *raw_img; size_t raw_size; void *img_base = NULL; - ufile_t uf; + ksys_ufile_t uf; - uf = load_file("/kolibrios/lib/libc.dll"); + uf = _ksys_load_file("/kolibrios/lib/libc.dll"); raw_img = uf.data; raw_size = uf.size; @@ -214,7 +214,7 @@ void* load_libc() img_base = create_image(raw_img); }; - user_free(raw_img); + _ksys_free(raw_img); return img_base; diff --git a/contrib/sdk/sources/newlib/libc/pe/loader.c b/contrib/sdk/sources/newlib/libc/pe/loader.c index 7cbcf7d159..9c691eab58 100644 --- a/contrib/sdk/sources/newlib/libc/pe/loader.c +++ b/contrib/sdk/sources/newlib/libc/pe/loader.c @@ -7,7 +7,7 @@ #include #include -#include +#include #include "list.h" #include "pe.h" @@ -22,6 +22,7 @@ void init_loader(void *libc_image); void* create_image(void *raw); int link_image(void *img_base, PIMAGE_IMPORT_DESCRIPTOR imp); +void* load_library(const char *name); extern char* __appenv; extern int __appenv_size; @@ -266,7 +267,7 @@ void* create_image(void *raw) dos = (PIMAGE_DOS_HEADER)raw; nt = MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew); - img_base = user_alloc(nt->OptionalHeader.SizeOfImage); + img_base = _ksys_alloc(nt->OptionalHeader.SizeOfImage); if(unlikely(img_base == NULL)) return 0; @@ -651,12 +652,12 @@ static void *load_lib_internal(const char *path) PIMAGE_NT_HEADERS32 nt; PIMAGE_EXPORT_DIRECTORY exp; - ufile_t uf; + ksys_ufile_t uf; void *raw_img; size_t raw_size; void *img_base = NULL; - uf = load_file(path); + uf = _ksys_load_file(path); raw_img = uf.data; raw_size = uf.size; @@ -666,12 +667,12 @@ static void *load_lib_internal(const char *path) if( validate_pe(raw_img, raw_size, 0) == 0) { printf("invalide module %s\n", path); - user_free(raw_img); + _ksys_free(raw_img); return NULL; }; img_base = create_image(raw_img); - user_free(raw_img); + _ksys_free(raw_img); if( unlikely(img_base == NULL) ) printf("cannot create image %s\n",path); @@ -797,7 +798,7 @@ err2: free(module->img_path); free(module); err1: - user_free(img_base); + _ksys_free(img_base); return NULL; }; diff --git a/contrib/sdk/sources/newlib/libc/reent/getreent.c b/contrib/sdk/sources/newlib/libc/reent/getreent.c index 0987729471..2cbdbedcc4 100644 --- a/contrib/sdk/sources/newlib/libc/reent/getreent.c +++ b/contrib/sdk/sources/newlib/libc/reent/getreent.c @@ -3,7 +3,7 @@ #include <_ansi.h> #include #include -#include +#include extern _VOID _EXFUN(__sinit,(struct _reent *)); @@ -11,7 +11,7 @@ void init_reent() { struct _reent *ent; - ent = user_alloc(sizeof(struct _reent)); + ent = _ksys_alloc(sizeof(struct _reent)); _REENT_INIT_PTR_ZEROED(ent); diff --git a/contrib/sdk/sources/newlib/libc/stdlib/mallocr.c b/contrib/sdk/sources/newlib/libc/stdlib/mallocr.c index dd8746540e..55d7b92c9f 100644 --- a/contrib/sdk/sources/newlib/libc/stdlib/mallocr.c +++ b/contrib/sdk/sources/newlib/libc/stdlib/mallocr.c @@ -36,7 +36,7 @@ #include #include #include - +#include struct malloc_chunk { @@ -60,33 +60,8 @@ typedef unsigned int flag_t; /* The type of various bit flag sets */ /* The maximum possible size_t value has all bits set */ #define MAX_SIZE_T (~(size_t)0) -void *user_alloc(size_t size) -{ - void *val; - -// __asm__("int3"); - - __asm__ __volatile__( - "int $0x40" - :"=a"(val) - :"a"(68),"b"(12),"c"(size)); - return val; -} - -static inline -int user_free(void *mem) -{ - int val; - -// __asm__("int3"); - - __asm__ __volatile__( - "int $0x40" - :"=a"(val) - :"a"(68),"b"(13),"c"(mem)); - return val; -} - +#define user_alloc(s) _ksys_alloc(s) +#define user_free _ksys_free /* ------------------- size_t and alignment properties -------------------- */ diff --git a/contrib/sdk/sources/newlib/libc/sys/clock_gettime.c b/contrib/sdk/sources/newlib/libc/sys/clock_gettime.c index f5860d0376..f5eab820ed 100644 --- a/contrib/sdk/sources/newlib/libc/sys/clock_gettime.c +++ b/contrib/sdk/sources/newlib/libc/sys/clock_gettime.c @@ -20,14 +20,14 @@ #include #include #include -#include +#include /* Get current value of CLOCK and store it in TP. */ int clock_gettime (clockid_t clock_id, struct timespec *tp) { uint64_t tsc; - tsc = get_ns_count(); + tsc = _ksys_get_ns_count(); tp->tv_sec = tsc / 1000000000; tp->tv_nsec = tsc % 1000000000;