Changes in / [3b10ae36:42964a7] in mainline


Ignore:
Location:
uspace
Files:
20 added
10 deleted
19 edited

Legend:

Unmodified
Added
Removed
  • uspace/Makefile

    r3b10ae36 r42964a7  
    6767        app/redir \
    6868        app/rcutest \
     69        app/rcubench \
    6970        app/sbi \
    7071        app/sportdmp \
  • uspace/Makefile.common

    r3b10ae36 r42964a7  
    3535#   DEFS               compiler defines
    3636#   EXTRA_CFLAGS       additional flags to pass to C compiler
     37#   LINKER_SCRIPT      linker script
    3738#   PRE_DEPEND         targets required for dependency check
    3839#
     
    152153BASE_LIBS += $(LIBSOFTFLOAT_PREFIX)/libsoftfloat.a $(LIBSOFTINT_PREFIX)/libsoftint.a
    153154
    154 ifneq ($(LINK_DYNAMIC),y)
     155ifeq ($(LINK_DYNAMIC),y)
     156        LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld
     157else
    155158        LDFLAGS += -static
    156 endif
     159        LINKER_SCRIPT ?= $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld
     160endif
     161
     162LIB_LINKER_SCRIPT = $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld
    157163
    158164INCLUDES_FLAGS = $(LIBC_INCLUDES_FLAGS)
     
    255261endif
    256262
    257 COMMON_CXXFLAGS = $(COMMON_CFLAGS) -fno-exceptions
     263COMMON_CXXFLAGS = $(COMMON_CFLAGS)
    258264HELENOS_CXXFLAGS = \
    259265        -std=c++17 -frtti \
     
    345351
    346352ifneq ($(filter %.cpp %.cc %.cxx, $(SOURCES)),)
    347 $(BINARY): $(OBJECTS) $(LIBTAGS)
    348         $(CXX) $(CXXFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) -Wl,-Map,$@.map -o $@ $(START_FILES) $(OBJECTS) $(LIBARGS) $(CXX_BASE_LIBS)
    349 else
    350 $(BINARY): $(OBJECTS) $(LIBTAGS)
    351         $(CC) $(CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) -Wl,-Map,$@.map -o $@ $(START_FILES) $(OBJECTS) $(LIBARGS) $(BASE_LIBS)
     353$(BINARY): $(LINKER_SCRIPT) $(OBJECTS) $(LIBTAGS)
     354        $(CXX) $(CXXFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) -T $(LINKER_SCRIPT) -Wl,-Map,$@.map -o $@ $(START_FILES) $(OBJECTS) $(LIBARGS) $(CXX_BASE_LIBS)
     355else
     356$(BINARY): $(LINKER_SCRIPT) $(OBJECTS) $(LIBTAGS)
     357        $(CC) $(CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) -T $(LINKER_SCRIPT) -Wl,-Map,$@.map -o $@ $(START_FILES) $(OBJECTS) $(LIBARGS) $(BASE_LIBS)
    352358endif
    353359
     
    355361
    356362ifneq ($(TEST_BINARY),)
    357 $(TEST_BINARY): $(TEST_OBJECTS) $(TEST_BINARY_LIBS) $(LIBTAGS)
    358         $(CC) $(CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) -Wl,-Map,$@.map -o $@ $(START_FILES) $(TEST_OBJECTS) $(TEST_BINARY_LIBS) $(LIBARGS) $(BASE_LIBS)
     363$(TEST_BINARY): $(LINKER_SCRIPT) $(TEST_OBJECTS) $(TEST_BINARY_LIBS) $(LIBTAGS)
     364        $(CC) $(CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) -T $(LINKER_SCRIPT) -Wl,-Map,$@.map -o $@ $(START_FILES) $(TEST_OBJECTS) $(TEST_BINARY_LIBS) $(LIBARGS) $(BASE_LIBS)
    359365endif
    360366
     
    372378        $(AR) rc $@ $(LOBJECTS)
    373379
    374 $(SLIBRARY): $(LIBRARY).la
    375         $(CC) $(CFLAGS) $(LIB_LDFLAGS) $(EXTRA_LDFLAGS) -Wl,-Map,$@.map -o $@ -Wl,--whole-archive $(LIBRARY).la -Wl,--no-whole-archive $(LIBARGS) $(BASE_LIBS)
     380$(SLIBRARY): $(LIB_LINKER_SCRIPT) $(LIBRARY).la
     381        $(CC) $(CFLAGS) $(LIB_LDFLAGS) $(EXTRA_LDFLAGS) -T $(LIB_LINKER_SCRIPT) -Wl,-Map,$@.map -o $@ -Wl,--whole-archive $(LIBRARY).la -Wl,--no-whole-archive $(LIBARGS) $(BASE_LIBS)
    376382
    377383$(LSONAME):
  • uspace/app/rcutest/rcutest.c

    r3b10ae36 r42964a7  
    4646#include <fibril_synch.h>
    4747#include <compiler/barrier.h>
     48#include <futex.h>
    4849#include <str.h>
    4950
  • uspace/lib/c/Makefile

    r3b10ae36 r42964a7  
    3333CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
    3434
    35 EXTRA_OUTPUT = $(START_FILES)
     35LINKER_SCRIPTS = \
     36        $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld \
     37        $(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld \
     38        $(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld
     39
     40PRE_DEPEND =
     41EXTRA_OUTPUT = $(LINKER_SCRIPTS) $(START_FILES)
     42EXTRA_CLEAN = $(LINKER_SCRIPTS)
    3643EXTRA_TEST_CFLAGS = -Wno-deprecated-declarations
    3744LIBRARY = libc
     
    4451        generic/libc.c \
    4552        generic/ddi.c \
     53        generic/atomic.c \
    4654        generic/as.c \
    4755        generic/bd.c \
     
    7785        generic/strtol.c \
    7886        generic/l18n/langs.c \
     87        generic/fibril.c \
     88        generic/fibril_synch.c \
    7989        generic/pcb.c \
    8090        generic/smc.c \
    8191        generic/smp_memory_barrier.c \
     92        generic/thread.c \
     93        generic/tls.c \
    8294        generic/task.c \
     95        generic/futex.c \
    8396        generic/imath.c \
    8497        generic/inet/addr.c \
     
    129142        generic/stdio/sstream.c \
    130143        generic/stdio/vsprintf.c \
    131         generic/thread/atomic.c \
    132         generic/thread/fibril.c \
    133         generic/thread/fibril_synch.c \
    134         generic/thread/thread.c \
    135         generic/thread/tls.c \
    136         generic/thread/futex.c \
    137         generic/thread/rcu.c \
    138         generic/thread/mpsc.c \
    139144        generic/sysinfo.c \
    140145        generic/ipc.c \
     
    160165        generic/vfs/mtab.c \
    161166        generic/vfs/vfs.c \
     167        generic/rcu.c \
    162168        generic/setjmp.c \
    163169        generic/stack.c \
     
    212218        cp $< $@
    213219
     220$(LIBC_PREFIX)/arch/$(UARCH)/_link.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in
     221        $(CC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -E -x c $< | grep -v "^\#" > $@
     222
     223$(LIBC_PREFIX)/arch/$(UARCH)/_link-shlib.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in
     224        $(CC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DSHLIB -E -x c $< | grep -v "^\#" > $@
     225
     226$(LIBC_PREFIX)/arch/$(UARCH)/_link-dlexe.ld: $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld.in
     227        $(CC) $(DEFS) $(CFLAGS) -DLIBC_PATH=$(CURDIR) -DDLEXE -E -x c $< | grep -v "^\#" > $@
     228
    214229AUTOCHECK = $(realpath $(ROOT_PATH)/tools/autocheck.awk)
    215230
  • uspace/lib/c/generic/async/ports.c

    r3b10ae36 r42964a7  
    5151#include <abi/mm/as.h>
    5252#include "../private/libc.h"
    53 #include "../private/fibril.h"
    5453
    5554/** Interface data */
  • uspace/lib/c/generic/async/server.c

    r3b10ae36 r42964a7  
    124124#define DPRINTF(...)  ((void) 0)
    125125
     126/** Call data */
     127typedef struct {
     128        link_t link;
     129        ipc_call_t call;
     130} msg_t;
     131
    126132/* Client connection data */
    127133typedef struct {
     
    150156        client_t *client;
    151157
    152         /** Channel for messages that should be delivered to this fibril. */
    153         mpsc_t *msg_channel;
     158        /** Message event. */
     159        fibril_event_t msg_arrived;
     160
     161        /** Messages that should be delivered to this fibril. */
     162        list_t msg_queue;
    154163
    155164        /** Call data of the opening call. */
    156165        ipc_call_t call;
     166
     167        /** Identification of the closing call. */
     168        cap_call_handle_t close_chandle;
    157169
    158170        /** Fibril function that will be used to handle the connection. */
     
    411423        async_client_put(client);
    412424
    413         fibril_rmutex_lock(&conn_mutex);
    414 
    415425        /*
    416426         * Remove myself from the connection hash table.
    417427         */
     428        fibril_rmutex_lock(&conn_mutex);
    418429        hash_table_remove(&conn_hash_table, &(conn_key_t){
    419430                .task_id = fibril_connection->in_task_id,
    420431                .phone_hash = fibril_connection->in_phone_hash
    421432        });
    422 
    423         /*
    424          * Close the channel, if it isn't closed already.
    425          */
    426         mpsc_t *c = fibril_connection->msg_channel;
    427         mpsc_close(c);
    428 
    429433        fibril_rmutex_unlock(&conn_mutex);
    430434
     
    432436         * Answer all remaining messages with EHANGUP.
    433437         */
    434         ipc_call_t call;
    435         while (mpsc_receive(c, &call, NULL) == EOK)
    436                 ipc_answer_0(call.cap_handle, EHANGUP);
     438        while (!list_empty(&fibril_connection->msg_queue)) {
     439                msg_t *msg =
     440                    list_get_instance(list_first(&fibril_connection->msg_queue),
     441                    msg_t, link);
     442
     443                list_remove(&msg->link);
     444                ipc_answer_0(msg->call.cap_handle, EHANGUP);
     445                free(msg);
     446        }
    437447
    438448        /*
    439          * Clean up memory.
     449         * If the connection was hung-up, answer the last call,
     450         * i.e. IPC_M_PHONE_HUNGUP.
    440451         */
    441         mpsc_destroy(c);
     452        if (fibril_connection->close_chandle)
     453                ipc_answer_0(fibril_connection->close_chandle, EOK);
     454
    442455        free(fibril_connection);
    443456        return EOK;
     
    475488        conn->in_task_id = in_task_id;
    476489        conn->in_phone_hash = in_phone_hash;
    477         conn->msg_channel = mpsc_create(sizeof(ipc_call_t));
     490        conn->msg_arrived = FIBRIL_EVENT_INIT;
     491        list_initialize(&conn->msg_queue);
     492        conn->close_chandle = CAP_NIL;
    478493        conn->handler = handler;
    479494        conn->data = data;
     
    488503
    489504        if (conn->fid == 0) {
    490                 mpsc_destroy(conn->msg_channel);
    491505                free(conn);
    492506
     
    592606 * @param call Data of the incoming call.
    593607 *
    594  * @return EOK if the call was successfully passed to the respective fibril.
    595  * @return ENOENT if the call doesn't match any connection.
    596  * @return Other error code if routing failed for other reasons.
    597  *
    598  */
    599 static errno_t route_call(ipc_call_t *call)
     608 * @return False if the call doesn't match any connection.
     609 * @return True if the call was passed to the respective connection fibril.
     610 *
     611 */
     612static bool route_call(ipc_call_t *call)
    600613{
    601614        assert(call);
     
    609622        if (!link) {
    610623                fibril_rmutex_unlock(&conn_mutex);
    611                 return ENOENT;
     624                return false;
    612625        }
    613626
    614627        connection_t *conn = hash_table_get_inst(link, connection_t, link);
    615628
    616         errno_t rc = mpsc_send(conn->msg_channel, call);
    617 
    618         if (IPC_GET_IMETHOD(*call) == IPC_M_PHONE_HUNGUP) {
    619                 /* Close the channel, but let the connection fibril answer. */
    620                 mpsc_close(conn->msg_channel);
    621                 // FIXME: Ideally, we should be able to discard/answer the
    622                 //        hungup message here and just close the channel without
    623                 //        passing it out. Unfortunatelly, somehow that breaks
    624                 //        handling of CPU exceptions.
    625         }
     629        // FIXME: malloc in critical section
     630        msg_t *msg = malloc(sizeof(*msg));
     631        if (!msg) {
     632                fibril_rmutex_unlock(&conn_mutex);
     633                return false;
     634        }
     635
     636        msg->call = *call;
     637        list_append(&msg->link, &conn->msg_queue);
     638
     639        if (IPC_GET_IMETHOD(*call) == IPC_M_PHONE_HUNGUP)
     640                conn->close_chandle = call->cap_handle;
    626641
    627642        fibril_rmutex_unlock(&conn_mutex);
    628         return rc;
     643
     644        /* If the connection fibril is waiting for an event, activate it */
     645        fibril_notify(&conn->msg_arrived);
     646        return true;
    629647}
    630648
     
    921939        assert(fibril_connection);
    922940
     941        /*
     942         * Why doing this?
     943         * GCC 4.1.0 coughs on fibril_connection-> dereference.
     944         * GCC 4.1.1 happilly puts the rdhwr instruction in delay slot.
     945         *           I would never expect to find so many errors in
     946         *           a compiler.
     947         */
     948        connection_t *conn = fibril_connection;
     949
    923950        struct timeval tv;
    924951        struct timeval *expires = NULL;
     
    929956        }
    930957
    931         errno_t rc = mpsc_receive(fibril_connection->msg_channel,
    932             call, expires);
    933 
    934         if (rc == ETIMEOUT)
    935                 return false;
    936 
    937         if (rc != EOK) {
    938                 /*
    939                  * The async_get_call_timeout() interface doesn't support
    940                  * propagating errors. Return a null call instead.
    941                  */
    942 
    943                 memset(call, 0, sizeof(ipc_call_t));
    944         }
    945 
     958        fibril_rmutex_lock(&conn_mutex);
     959
     960        /* If nothing in queue, wait until something arrives */
     961        while (list_empty(&conn->msg_queue)) {
     962                if (conn->close_chandle) {
     963                        /*
     964                         * Handle the case when the connection was already
     965                         * closed by the client but the server did not notice
     966                         * the first IPC_M_PHONE_HUNGUP call and continues to
     967                         * call async_get_call_timeout(). Repeat
     968                         * IPC_M_PHONE_HUNGUP until the caller notices.
     969                         */
     970                        memset(call, 0, sizeof(ipc_call_t));
     971                        IPC_SET_IMETHOD(*call, IPC_M_PHONE_HUNGUP);
     972                        fibril_rmutex_unlock(&conn_mutex);
     973                        return true;
     974                }
     975
     976                // TODO: replace with cvar
     977                fibril_rmutex_unlock(&conn_mutex);
     978
     979                errno_t rc = fibril_wait_timeout(&conn->msg_arrived, expires);
     980                if (rc == ETIMEOUT)
     981                        return false;
     982
     983                fibril_rmutex_lock(&conn_mutex);
     984        }
     985
     986        msg_t *msg = list_get_instance(list_first(&conn->msg_queue),
     987            msg_t, link);
     988        list_remove(&msg->link);
     989
     990        *call = msg->call;
     991        free(msg);
     992
     993        fibril_rmutex_unlock(&conn_mutex);
    946994        return true;
    947995}
     
    10231071
    10241072        /* Try to route the call through the connection hash table */
    1025         errno_t rc = route_call(call);
    1026         if (rc == EOK)
     1073        if (route_call(call))
    10271074                return;
    10281075
    1029         // TODO: Log the error.
    1030 
    1031         if (call->cap_handle != CAP_NIL)
    1032                 /* Unknown call from unknown phone - hang it up */
    1033                 ipc_answer_0(call->cap_handle, EHANGUP);
     1076        /* Unknown call from unknown phone - hang it up */
     1077        ipc_answer_0(call->cap_handle, EHANGUP);
    10341078}
    10351079
  • uspace/lib/c/generic/io/kio.c

    r3b10ae36 r42964a7  
    4444#include <macros.h>
    4545#include <libarch/config.h>
    46 
    47 #include "../private/futex.h"
     46#include <futex.h>
    4847
    4948#define KIO_BUFFER_SIZE PAGE_SIZE
  • uspace/lib/c/generic/ipc.c

    r3b10ae36 r42964a7  
    4646#include <errno.h>
    4747#include <adt/list.h>
     48#include <futex.h>
    4849#include <fibril.h>
    4950#include <macros.h>
  • uspace/lib/c/generic/malloc.c

    r3b10ae36 r42964a7  
    4444#include <bitops.h>
    4545#include <mem.h>
     46#include <fibril_synch.h>
    4647#include <stdlib.h>
    4748#include <adt/gcdlcm.h>
    48 
    4949#include "private/malloc.h"
    50 #include "private/fibril.h"
    5150
    5251/** Magic used in heap headers. */
  • uspace/lib/c/generic/private/fibril.h

    r3b10ae36 r42964a7  
    3535#include <abi/proc/uarg.h>
    3636#include <atomic.h>
    37 #include <fibril.h>
    38 
    39 #include "./futex.h"
    40 
    41 typedef struct {
    42         fibril_t *fibril;
    43 } fibril_event_t;
    44 
    45 #define FIBRIL_EVENT_INIT ((fibril_event_t) {0})
     37#include <futex.h>
    4638
    4739struct fibril {
     
    8173extern void __fibrils_init(void);
    8274
    83 extern void fibril_wait_for(fibril_event_t *);
    84 extern errno_t fibril_wait_timeout(fibril_event_t *, const struct timeval *);
    85 extern void fibril_notify(fibril_event_t *);
    86 
    87 extern errno_t fibril_ipc_wait(ipc_call_t *, const struct timeval *);
    88 extern void fibril_ipc_poke(void);
    89 
    90 /**
    91  * "Restricted" fibril mutex.
    92  *
    93  * Similar to `fibril_mutex_t`, but has a set of restrictions placed on its
    94  * use. Within a rmutex critical section, you
    95  *         - may not use any other synchronization primitive,
    96  *           save for another `fibril_rmutex_t`. This includes nonblocking
    97  *           operations like cvar signal and mutex unlock, unless otherwise
    98  *           specified.
    99  *         - may not read IPC messages
    100  *         - may not start a new thread/fibril
    101  *           (creating fibril without starting is fine)
    102  *
    103  * Additionally, locking with a timeout is not possible on this mutex,
    104  * and there is no associated condition variable type.
    105  * This is a design constraint, not a lack of implementation effort.
    106  */
    107 typedef struct {
    108         // TODO: At this point, this is just silly handwaving to hide current
    109         //       futex use behind a fibril based abstraction. Later, the imple-
    110         //       mentation will change, but the restrictions placed on this type
    111         //       will allow it to be simpler and faster than a regular mutex.
    112         //       There might also be optional debug checking of the assumptions.
    113         //
    114         //       Note that a consequence of the restrictions is that if we are
    115         //       running on a single thread, no other fibril can ever get to run
    116         //       while a fibril has a rmutex locked. That means that for
    117         //       single-threaded programs, we can reduce all rmutex locks and
    118         //       unlocks to simple branches on a global bool variable.
    119 
    120         futex_t futex;
    121 } fibril_rmutex_t;
    122 
    123 #define FIBRIL_RMUTEX_INITIALIZER(name) \
    124         { .futex = FUTEX_INITIALIZE(1) }
    125 
    126 #define FIBRIL_RMUTEX_INITIALIZE(name) \
    127         fibril_rmutex_t name = FIBRIL_RMUTEX_INITIALIZER(name)
    128 
    129 extern void fibril_rmutex_initialize(fibril_rmutex_t *);
    130 extern void fibril_rmutex_lock(fibril_rmutex_t *);
    131 extern bool fibril_rmutex_trylock(fibril_rmutex_t *);
    132 extern void fibril_rmutex_unlock(fibril_rmutex_t *);
    133 
    134 
    13575#endif
  • uspace/lib/c/include/fibril.h

    r3b10ae36 r42964a7  
    4949typedef fibril_t *fid_t;
    5050
     51typedef struct {
     52        fibril_t *fibril;
     53} fibril_event_t;
     54
     55#define FIBRIL_EVENT_INIT ((fibril_event_t) {0})
     56
    5157/** Fibril-local variable specifier */
    5258#define fibril_local __thread
     
    7682extern __noreturn void fibril_exit(long);
    7783
     84extern void fibril_wait_for(fibril_event_t *);
     85extern errno_t fibril_wait_timeout(fibril_event_t *, const struct timeval *);
     86extern void fibril_notify(fibril_event_t *);
     87
     88extern errno_t fibril_ipc_wait(ipc_call_t *, const struct timeval *);
     89extern void fibril_ipc_poke(void);
     90
    7891#endif
    7992
  • uspace/lib/c/include/fibril_synch.h

    r3b10ae36 r42964a7  
    4141#include <sys/time.h>
    4242#include <stdbool.h>
     43#include <futex.h>
     44
     45/**
     46 * "Restricted" fibril mutex.
     47 *
     48 * Similar to `fibril_mutex_t`, but has a set of restrictions placed on its
     49 * use. Within a rmutex critical section, you
     50 *         - may not use any other synchronization primitive,
     51 *           save for another `fibril_rmutex_t`. This includes nonblocking
     52 *           operations like cvar signal and mutex unlock.
     53 *         - may not read IPC messages
     54 *         - may not start a new thread/fibril
     55 *           (creating fibril without starting is fine)
     56 *
     57 * Additionally, locking with a timeout is not possible on this mutex,
     58 * and there is no associated condition variable type.
     59 * This is a design constraint, not a lack of implementation effort.
     60 */
     61typedef struct {
     62        // TODO: At this point, this is just silly handwaving to hide current
     63        //       futex use behind a fibril based abstraction. Later, the imple-
     64        //       mentation will change, but the restrictions placed on this type
     65        //       will allow it to be simpler and faster than a regular mutex.
     66        //       There might also be optional debug checking of the assumptions.
     67        //
     68        //       Note that a consequence of the restrictions is that if we are
     69        //       running on a single thread, no other fibril can ever get to run
     70        //       while a fibril has a rmutex locked. That means that for
     71        //       single-threaded programs, we can reduce all rmutex locks and
     72        //       unlocks to simple branches on a global bool variable.
     73
     74        futex_t futex;
     75} fibril_rmutex_t;
     76
     77#define FIBRIL_RMUTEX_INITIALIZER(name) \
     78        { .futex = FUTEX_INITIALIZE(1) }
     79
     80#define FIBRIL_RMUTEX_INITIALIZE(name) \
     81        fibril_rmutex_t name = FIBRIL_RMUTEX_INITIALIZER(name)
    4382
    4483typedef struct {
     
    147186        long int count;
    148187        list_t waiters;
    149         bool closed;
    150188} fibril_semaphore_t;
    151189
     
    163201#define FIBRIL_SEMAPHORE_INITIALIZE(name, cnt) \
    164202        fibril_semaphore_t name = FIBRIL_SEMAPHORE_INITIALIZER(name, cnt)
     203
     204extern void fibril_rmutex_initialize(fibril_rmutex_t *);
     205extern void fibril_rmutex_lock(fibril_rmutex_t *);
     206extern bool fibril_rmutex_trylock(fibril_rmutex_t *);
     207extern void fibril_rmutex_unlock(fibril_rmutex_t *);
    165208
    166209extern void fibril_mutex_initialize(fibril_mutex_t *);
     
    198241extern void fibril_semaphore_up(fibril_semaphore_t *);
    199242extern void fibril_semaphore_down(fibril_semaphore_t *);
    200 extern errno_t fibril_semaphore_down_timeout(fibril_semaphore_t *, suseconds_t);
    201 extern void fibril_semaphore_close(fibril_semaphore_t *);
    202 
    203 typedef struct mpsc mpsc_t;
    204 extern mpsc_t *mpsc_create(size_t);
    205 extern void mpsc_destroy(mpsc_t *);
    206 extern errno_t mpsc_send(mpsc_t *, const void *);
    207 extern errno_t mpsc_receive(mpsc_t *, void *, const struct timeval *);
    208 extern void mpsc_close(mpsc_t *);
    209243
    210244#endif
  • uspace/lib/c/include/ipc/common.h

    r3b10ae36 r42964a7  
    3737
    3838#include <abi/ipc/ipc.h>
     39#include <atomic.h>
    3940#include <abi/proc/task.h>
     41#include <futex.h>
    4042#include <abi/cap.h>
    41 #include <types/common.h>
    4243
    4344#define IPC_FLAG_BLOCKING  0x01
  • uspace/lib/drv/include/dev_iface.h

    r3b10ae36 r42964a7  
    3838#include <ipc/common.h>
    3939#include <ipc/dev_iface.h>
    40 #include <stdbool.h>
    4140
    4241/*
  • uspace/lib/pcut/Makefile

    r3b10ae36 r42964a7  
    3636
    3737test-libpcut-%: $(LIBRARY).a
    38         $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(START_FILES) $^ $(LIBRARY).a $(BASE_LIBS)
     38        $(CC) $(CFLAGS) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $(START_FILES) $^ $(LIBRARY).a $(BASE_LIBS)
    3939
  • uspace/lib/pcut/update-from-master.sh

    r3b10ae36 r42964a7  
    8080
    8181test-libpcut-%: $(LIBRARY).a
    82         $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(START_FILES) $^ $(LIBRARY).a $(BASE_LIBS)
     82        $(CC) $(CFLAGS) $(LDFLAGS) -T $(LINKER_SCRIPT) -o $@ $(START_FILES) $^ $(LIBRARY).a $(BASE_LIBS)
    8383
    8484EOF_MAKEFILE_TAIL
  • uspace/lib/posix/Makefile

    r3b10ae36 r42964a7  
    3636
    3737SPECS = gcc.specs
     38LIBC_LINKER_SCRIPT = $(LIBC_PREFIX)/arch/$(UARCH)/_link.ld
     39EXPORT_LINKER_SCRIPT = link.ld
    3840
    3941EXPORT_FILES = \
     
    4648        $(LIBC_PREFIX)/crt1.o \
    4749        $(LIBRARY).a \
     50        $(EXPORT_LINKER_SCRIPT) \
    4851        $(SPECS)
    4952
     
    5154EXTRA_CLEAN = $(INCLUDE_LIBC)
    5255
    53 EXTRA_OUTPUT = $(SPECS)
     56EXTRA_OUTPUT = $(SPECS) $(EXPORT_LINKER_SCRIPT) $(EXPORT_STARTUP_FILE)
    5457
    5558SOURCES = \
     
    8992EXPORT_LDFLAGS = \
    9093        -L$$(HELENOS_EXPORT_ROOT)/lib \
     94        -T link.ld \
    9195        $$(HELENOS_EXPORT_ROOT)/lib/crt0.o \
    9296        $$(HELENOS_EXPORT_ROOT)/lib/crt1.o
     
    110114        echo '$(EXPORT_LDLIBS)' >> $@.new
    111115        mv $@.new $@
     116
     117$(EXPORT_LINKER_SCRIPT): $(LIBC_LINKER_SCRIPT)
     118        cp $< $@
     119
     120$(EXPORT_STARTUP_FILE): $(LIBC_STARTUP_FILE)
     121        cp $< $@
    112122
    113123$(INCLUDE_LIBC): $(shell find ../c/include -name '*.h')
  • uspace/srv/hid/input/ctl/stty.c

    r3b10ae36 r42964a7  
    3838 */
    3939
    40 #include <errno.h>
    4140#include <io/keycode.h>
    4241#include "../stroke.h"
  • uspace/srv/loader/Makefile

    r3b10ae36 r42964a7  
    2929
    3030USPACE_PREFIX = ../..
    31 ROOT_PATH = $(USPACE_PREFIX)/..
    32 CONFIG_MAKEFILE = $(ROOT_PATH)/Makefile.config
    3331
    34 include $(CONFIG_MAKEFILE)
    35 
    36 ifeq ($(UARCH),ia64)
    37         # IA64 has a peculiar linker script with a fixed data segment address.
    38         # Because the loader is a separate nonrelocatable binary in the same
    39         # address space as the application, we provide a modified copy of
    40         # the default linker script to work around that.
    41         EXTRA_LDFLAGS = -T elf64_ia64_loader.x
    42 else
    43         # On all other architectures, we can simply move the text segment.
    44         EXTRA_LDFLAGS = -Wl,-Ttext-segment=0x70000000
    45 endif
     32EXTRA_LDFLAGS = -Wl,-Ttext-segment=0x70000000
    4633
    4734BINARY = loader
Note: See TracChangeset for help on using the changeset viewer.