Changeset 98e4507 in mainline for uspace


Ignore:
Timestamp:
2011-05-20T01:13:40Z (15 years ago)
Author:
Petr Koupy <petr.koupy@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5c460cc
Parents:
a0bb65af (diff), 326bf65 (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.
Message:

Merge mainline changes.

Location:
uspace
Files:
6 added
35 edited

Legend:

Unmodified
Added
Removed
  • uspace/Makefile.common

    ra0bb65af r98e4507  
    155155        -finput-charset=UTF-8 -ffreestanding -fno-builtin -nostdlib -nostdinc \
    156156        -Wall -Wextra -Wno-clobbered -Wno-unused-parameter -Wmissing-prototypes \
    157         -Werror-implicit-function-declaration -Wwrite-strings \
     157        -std=gnu99 -Werror-implicit-function-declaration -Wwrite-strings \
    158158        -pipe -g -D__$(ENDIANESS)__
    159159
  • uspace/app/klog/klog.c

    ra0bb65af r98e4507  
    4444#include <io/klog.h>
    4545#include <sysinfo.h>
     46#include <malloc.h>
     47#include <fibril_synch.h>
     48#include <adt/list.h>
     49#include <adt/prodcons.h>
    4650
    4751#define NAME       "klog"
    4852#define LOG_FNAME  "/log/klog"
     53
     54/* Producer/consumer buffers */
     55typedef struct {
     56        link_t link;
     57        size_t length;
     58        wchar_t *data;
     59} item_t;
     60
     61static prodcons_t pc;
    4962
    5063/* Pointer to klog area */
     
    5265static size_t klog_length;
    5366
    54 static FILE *log;
    55 
    56 static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
    57 {
     67/* Notification mutex */
     68static FIBRIL_MUTEX_INITIALIZE(mtx);
     69
     70/** Klog producer
     71 *
     72 * Copies the contents of a character buffer to local
     73 * producer/consumer queue.
     74 *
     75 * @param length Number of characters to copy.
     76 * @param data   Pointer to the kernel klog buffer.
     77 *
     78 */
     79static void producer(size_t length, wchar_t *data)
     80{
     81        item_t *item = (item_t *) malloc(sizeof(item_t));
     82        if (item == NULL)
     83                return;
     84       
     85        size_t sz = sizeof(wchar_t) * length;
     86        wchar_t *buf = (wchar_t *) malloc(sz);
     87        if (data == NULL) {
     88                free(item);
     89                return;
     90        }
     91       
     92        memcpy(buf, data, sz);
     93       
     94        link_initialize(&item->link);
     95        item->length = length;
     96        item->data = buf;
     97        prodcons_produce(&pc, &item->link);
     98}
     99
     100/** Klog consumer
     101 *
     102 * Waits in an infinite loop for the character data created by
     103 * the producer and outputs them to stdout and optionally into
     104 * a file.
     105 *
     106 * @param data Unused.
     107 *
     108 * @return Always EOK (unreachable).
     109 *
     110 */
     111static int consumer(void *data)
     112{
     113        FILE *log = fopen(LOG_FNAME, "a");
     114        if (log == NULL)
     115                printf("%s: Unable to create log file %s (%s)\n", NAME, LOG_FNAME,
     116                    str_error(errno));
     117       
     118        while (true) {
     119                link_t *link = prodcons_consume(&pc);
     120                item_t *item = list_get_instance(link, item_t, link);
     121               
     122                for (size_t i = 0; i < item->length; i++)
     123                        putchar(item->data[i]);
     124               
     125                if (log != NULL) {
     126                        for (size_t i = 0; i < item->length; i++)
     127                                fputc(item->data[i], log);
     128                       
     129                        fflush(log);
     130                        fsync(fileno(log));
     131                }
     132               
     133                free(item->data);
     134                free(item);
     135        }
     136       
     137        fclose(log);
     138        return EOK;
     139}
     140
     141/** Kernel notification handler
     142 *
     143 * Receives kernel klog notifications.
     144 *
     145 * @param callid IPC call ID.
     146 * @param call   IPC call structure.
     147 *
     148 */
     149static void notification_received(ipc_callid_t callid, ipc_call_t *call)
     150{
     151        /*
     152         * Make sure we process only a single notification
     153         * at any time to limit the chance of the consumer
     154         * starving.
     155         *
     156         * Note: Usually the automatic masking of the klog
     157         * notifications on the kernel side does the trick
     158         * of limiting the chance of accidentally copying
     159         * the same data multiple times. However, due to
     160         * the non-blocking architecture of klog notifications,
     161         * this possibility cannot be generally avoided.
     162         */
     163       
     164        fibril_mutex_lock(&mtx);
     165       
    58166        size_t klog_start = (size_t) IPC_GET_ARG1(*call);
    59167        size_t klog_len = (size_t) IPC_GET_ARG2(*call);
    60168        size_t klog_stored = (size_t) IPC_GET_ARG3(*call);
    61         size_t i;
    62        
    63         for (i = klog_len - klog_stored; i < klog_len; i++) {
    64                 wchar_t ch = klog[(klog_start + i) % klog_length];
    65                
    66                 putchar(ch);
    67                
    68                 if (log != NULL)
    69                         fputc(ch, log);
    70         }
    71        
    72         if (log != NULL) {
    73                 fflush(log);
    74                 fsync(fileno(log));
    75         }
     169       
     170        size_t offset = (klog_start + klog_len - klog_stored) % klog_length;
     171       
     172        /* Copy data from the ring buffer */
     173        if (offset + klog_stored >= klog_length) {
     174                size_t split = klog_length - offset;
     175               
     176                producer(split, klog + offset);
     177                producer(klog_stored - split, klog);
     178        } else
     179                producer(klog_stored, klog + offset);
     180       
     181        event_unmask(EVENT_KLOG);
     182        fibril_mutex_unlock(&mtx);
    76183}
    77184
     
    111218        }
    112219       
     220        prodcons_initialize(&pc);
     221        async_set_interrupt_received(notification_received);
    113222        rc = event_subscribe(EVENT_KLOG, 0);
    114223        if (rc != EOK) {
     
    118227        }
    119228       
    120         log = fopen(LOG_FNAME, "a");
    121         if (log == NULL)
    122                 printf("%s: Unable to create log file %s (%s)\n", NAME, LOG_FNAME,
    123                     str_error(errno));
    124        
    125         async_set_interrupt_received(interrupt_received);
     229        fid_t fid = fibril_create(consumer, NULL);
     230        if (!fid) {
     231                fprintf(stderr, "%s: Unable to create consumer fibril\n",
     232                    NAME);
     233                return ENOMEM;
     234        }
     235       
     236        fibril_add_ready(fid);
     237        event_unmask(EVENT_KLOG);
    126238        klog_update();
     239       
     240        task_retval(0);
    127241        async_manager();
    128242       
  • uspace/app/tester/Makefile

    ra0bb65af r98e4507  
    4848        ipc/ping_pong.c \
    4949        loop/loop1.c \
     50        mm/common.c \
    5051        mm/malloc1.c \
    5152        mm/malloc2.c \
     53        mm/malloc3.c \
    5254        devs/devman1.c \
    5355        hw/misc/virtchar1.c \
  • uspace/app/tester/mm/malloc1.c

    ra0bb65af r98e4507  
    3030
    3131#include <stdio.h>
    32 #include <unistd.h>
    3332#include <stdlib.h>
    34 #include <malloc.h>
     33#include "common.h"
    3534#include "../tester.h"
    3635
     
    4544 */
    4645
    47 /**
    48  * sizeof_array
    49  * @array array to determine the size of
    50  *
    51  * Returns the size of @array in array elements.
    52  */
    53 #define sizeof_array(array) \
    54         (sizeof(array) / sizeof((array)[0]))
    55 
    56 #define MAX_ALLOC (16 * 1024 * 1024)
    57 
    58 /*
    59  * Subphase control structures: subphase termination conditions,
    60  * probabilities of individual actions, subphase control structure.
    61  */
    62 
    63 typedef struct {
    64         unsigned int max_cycles;
    65         unsigned int no_memory;
    66         unsigned int no_allocated;
    67 } sp_term_cond_s;
    68 
    69 typedef struct {
    70         unsigned int alloc;
    71         unsigned int free;
    72 } sp_action_prob_s;
    73 
    74 typedef struct {
    75         const char *name;
    76         sp_term_cond_s cond;
    77         sp_action_prob_s prob;
    78 } subphase_s;
    79 
    80 
    81 /*
    82  * Phase control structures: The minimum and maximum block size that
    83  * can be allocated during the phase execution, phase control structure.
    84  */
    85 
    86 typedef struct {
    87         size_t min_block_size;
    88         size_t max_block_size;
    89 } ph_alloc_size_s;
    90 
    91 typedef struct {
    92         const char *name;
    93         ph_alloc_size_s alloc;
    94         subphase_s *subphases;
    95 } phase_s;
    96 
    97 
    9846/*
    9947 * Subphases are defined separately here. This is for two reasons:
     
    10149 * how many subphases a phase contains.
    10250 */
    103 static subphase_s subphases_32B[] = {
     51static subphase_t subphases_32B[] = {
    10452        {
    10553                .name = "Allocation",
     
    14088};
    14189
    142 static subphase_s subphases_128K[] = {
     90static subphase_t subphases_128K[] = {
    14391        {
    14492                .name = "Allocation",
     
    179127};
    180128
    181 static subphase_s subphases_default[] = {
     129static subphase_t subphases_default[] = {
    182130        {
    183131                .name = "Allocation",
     
    217165        }
    218166};
    219 
    220167
    221168/*
    222169 * Phase definitions.
    223170 */
    224 static phase_s phases[] = {
     171static phase_t phases[] = {
    225172        {
    226173                .name = "32 B memory blocks",
     
    257204};
    258205
    259 
    260 /*
    261  * Global error flag. The flag is set if an error
    262  * is encountered (overlapping blocks, inconsistent
    263  * block data, etc.)
    264  */
    265 static bool error_flag = false;
    266 
    267 /*
    268  * Memory accounting: the amount of allocated memory and the
    269  * number and list of allocated blocks.
    270  */
    271 static size_t mem_allocated;
    272 static size_t mem_blocks_count;
    273 
    274 static LIST_INITIALIZE(mem_blocks);
    275 
    276 typedef struct {
    277         /* Address of the start of the block */
    278         void *addr;
    279        
    280         /* Size of the memory block */
    281         size_t size;
    282        
    283         /* link to other blocks */
    284         link_t link;
    285 } mem_block_s;
    286 
    287 typedef mem_block_s *mem_block_t;
    288 
    289 
    290 /** init_mem
    291  *
    292  * Initializes the memory accounting structures.
    293  *
    294  */
    295 static void init_mem(void)
     206static void do_subphase(phase_t *phase, subphase_t *subphase)
    296207{
    297         mem_allocated = 0;
    298         mem_blocks_count = 0;
    299 }
    300 
    301 
    302 static bool overlap_match(link_t *entry, void *addr, size_t size)
    303 {
    304         mem_block_t mblk = list_get_instance(entry, mem_block_s, link);
    305        
    306         /* Entry block control structure <mbeg, mend) */
    307         uint8_t *mbeg = (uint8_t *) mblk;
    308         uint8_t *mend = (uint8_t *) mblk + sizeof(mem_block_s);
    309        
    310         /* Entry block memory <bbeg, bend) */
    311         uint8_t *bbeg = (uint8_t *) mblk->addr;
    312         uint8_t *bend = (uint8_t *) mblk->addr + mblk->size;
    313        
    314         /* Data block <dbeg, dend) */
    315         uint8_t *dbeg = (uint8_t *) addr;
    316         uint8_t *dend = (uint8_t *) addr + size;
    317        
    318         /* Check for overlaps */
    319         if (((mbeg >= dbeg) && (mbeg < dend)) ||
    320                 ((mend > dbeg) && (mend <= dend)) ||
    321                 ((bbeg >= dbeg) && (bbeg < dend)) ||
    322                 ((bend > dbeg) && (bend <= dend)))
    323                 return true;
    324        
    325         return false;
    326 }
    327 
    328 
    329 /** test_overlap
    330  *
    331  * Test whether a block starting at @addr overlaps with another, previously
    332  * allocated memory block or its control structure.
    333  *
    334  * @param addr Initial address of the block
    335  * @param size Size of the block
    336  *
    337  * @return false if the block does not overlap.
    338  *
    339  */
    340 static int test_overlap(void *addr, size_t size)
    341 {
    342         link_t *entry;
    343         bool fnd = false;
    344        
    345         for (entry = mem_blocks.next; entry != &mem_blocks; entry = entry->next) {
    346                 if (overlap_match(entry, addr, size)) {
    347                         fnd = true;
    348                         break;
    349                 }
    350         }
    351        
    352         return fnd;
    353 }
    354 
    355 
    356 /** checked_malloc
    357  *
    358  * Allocate @size bytes of memory and check whether the chunk comes
    359  * from the non-mapped memory region and whether the chunk overlaps
    360  * with other, previously allocated, chunks.
    361  *
    362  * @param size Amount of memory to allocate
    363  *
    364  * @return NULL if the allocation failed. Sets the global error_flag to
    365  *         true if the allocation succeeded but is illegal.
    366  *
    367  */
    368 static void *checked_malloc(size_t size)
    369 {
    370         void *data;
    371        
    372         /* Allocate the chunk of memory */
    373         data = malloc(size);
    374         if (data == NULL)
    375                 return NULL;
    376        
    377         /* Check for overlaps with other chunks */
    378         if (test_overlap(data, size)) {
    379                 TPRINTF("\nError: Allocated block overlaps with another "
    380                         "previously allocated block.\n");
    381                 error_flag = true;
    382         }
    383        
    384         return data;
    385 }
    386 
    387 
    388 /** alloc_block
    389  *
    390  * Allocate a block of memory of @size bytes and add record about it into
    391  * the mem_blocks list. Return a pointer to the block holder structure or
    392  * NULL if the allocation failed.
    393  *
    394  * If the allocation is illegal (e.g. the memory does not come from the
    395  * right region or some of the allocated blocks overlap with others),
    396  * set the global error_flag.
    397  *
    398  * @param size Size of the memory block
    399  *
    400  */
    401 static mem_block_t alloc_block(size_t size)
    402 {
    403         /* Check for allocation limit */
    404         if (mem_allocated >= MAX_ALLOC)
    405                 return NULL;
    406        
    407         /* Allocate the block holder */
    408         mem_block_t block = (mem_block_t) checked_malloc(sizeof(mem_block_s));
    409         if (block == NULL)
    410                 return NULL;
    411        
    412         link_initialize(&block->link);
    413        
    414         /* Allocate the block memory */
    415         block->addr = checked_malloc(size);
    416         if (block->addr == NULL) {
    417                 free(block);
    418                 return NULL;
    419         }
    420        
    421         block->size = size;
    422        
    423         /* Register the allocated block */
    424         list_append(&block->link, &mem_blocks);
    425         mem_allocated += size + sizeof(mem_block_s);
    426         mem_blocks_count++;
    427        
    428         return block;
    429 }
    430 
    431 
    432 /** free_block
    433  *
    434  * Free the block of memory and the block control structure allocated by
    435  * alloc_block. Set the global error_flag if an error occurs.
    436  *
    437  * @param block Block control structure
    438  *
    439  */
    440 static void free_block(mem_block_t block)
    441 {
    442         /* Unregister the block */
    443         list_remove(&block->link);
    444         mem_allocated -= block->size + sizeof(mem_block_s);
    445         mem_blocks_count--;
    446        
    447         /* Free the memory */
    448         free(block->addr);
    449         free(block);
    450 }
    451 
    452 
    453 /** expected_value
    454  *
    455  * Compute the expected value of a byte located at @pos in memory
    456  * block described by @blk.
    457  *
    458  * @param blk Memory block control structure
    459  * @param pos Position in the memory block data area
    460  *
    461  */
    462 static inline uint8_t expected_value(mem_block_t blk, uint8_t *pos)
    463 {
    464         return ((unsigned long) blk ^ (unsigned long) pos) & 0xff;
    465 }
    466 
    467 
    468 /** fill_block
    469  *
    470  * Fill the memory block controlled by @blk with data.
    471  *
    472  * @param blk Memory block control structure
    473  *
    474  */
    475 static void fill_block(mem_block_t blk)
    476 {
    477         uint8_t *pos;
    478         uint8_t *end;
    479        
    480         for (pos = blk->addr, end = pos + blk->size; pos < end; pos++)
    481                 *pos = expected_value(blk, pos);
    482 }
    483 
    484 
    485 /** check_block
    486  *
    487  * Check whether the block @blk contains the data it was filled with.
    488  * Set global error_flag if an error occurs.
    489  *
    490  * @param blk Memory block control structure
    491  *
    492  */
    493 static void check_block(mem_block_t blk)
    494 {
    495         uint8_t *pos;
    496         uint8_t *end;
    497        
    498         for (pos = blk->addr, end = pos + blk->size; pos < end; pos++) {
    499                 if (*pos != expected_value (blk, pos)) {
    500                         TPRINTF("\nError: Corrupted content of a data block.\n");
    501                         error_flag = true;
    502                         return;
    503                 }
    504         }
    505 }
    506 
    507 
    508 static link_t *list_get_nth(link_t *list, unsigned int i)
    509 {
    510         unsigned int cnt = 0;
    511         link_t *entry;
    512        
    513         for (entry = list->next; entry != list; entry = entry->next) {
    514                 if (cnt == i)
    515                         return entry;
    516                
    517                 cnt++;
    518         }
    519        
    520         return NULL;
    521 }
    522 
    523 
    524 /** get_random_block
    525  *
    526  * Select a random memory block from the list of allocated blocks.
    527  *
    528  * @return Block control structure or NULL if the list is empty.
    529  *
    530  */
    531 static mem_block_t get_random_block(void)
    532 {
    533         if (mem_blocks_count == 0)
    534                 return NULL;
    535        
    536         unsigned int blkidx = rand() % mem_blocks_count;
    537         link_t *entry = list_get_nth(&mem_blocks, blkidx);
    538        
    539         if (entry == NULL) {
    540                 TPRINTF("\nError: Corrupted list of allocated memory blocks.\n");
    541                 error_flag = true;
    542         }
    543        
    544         return list_get_instance(entry, mem_block_s, link);
    545 }
    546 
    547 
    548 #define RETURN_IF_ERROR \
    549 { \
    550         if (error_flag) \
    551                 return; \
    552 }
    553 
    554 
    555 static void do_subphase(phase_s *phase, subphase_s *subphase)
    556 {
    557         unsigned int cycles;
    558         for (cycles = 0; /* always */; cycles++) {
    559                
    560                 if (subphase->cond.max_cycles &&
    561                         cycles >= subphase->cond.max_cycles) {
     208        for (unsigned int cycles = 0; /* always */; cycles++) {
     209               
     210                if ((subphase->cond.max_cycles) &&
     211                    (cycles >= subphase->cond.max_cycles)) {
    562212                        /*
    563213                         * We have performed the required number of
     
    572222                unsigned int rnd = rand() % 100;
    573223                if (rnd < subphase->prob.alloc) {
    574                         /* Compute a random number lying in interval <min_block_size, max_block_size> */
     224                        /*
     225                         * Compute a random number lying in interval
     226                         * <min_block_size, max_block_size>
     227                         */
    575228                        int alloc = phase->alloc.min_block_size +
    576229                            (rand() % (phase->alloc.max_block_size - phase->alloc.min_block_size + 1));
    577230                       
    578                         mem_block_t blk = alloc_block(alloc);
     231                        mem_block_t *blk = alloc_block(alloc);
    579232                        RETURN_IF_ERROR;
    580233                       
     
    585238                                        break;
    586239                                }
    587                                
    588240                        } else {
    589241                                TPRINTF("A");
     
    592244                       
    593245                } else if (rnd < subphase->prob.free) {
    594                         mem_block_t blk = get_random_block();
     246                        mem_block_t *blk = get_random_block();
    595247                        if (blk == NULL) {
    596248                                TPRINTF("F(R)");
     
    599251                                        break;
    600252                                }
    601                                
    602253                        } else {
    603254                                TPRINTF("R");
     
    614265}
    615266
    616 
    617 static void do_phase(phase_s *phase)
     267static void do_phase(phase_t *phase)
    618268{
    619         unsigned int subno;
    620        
    621         for (subno = 0; subno < 3; subno++) {
    622                 subphase_s *subphase = & phase->subphases [subno];
     269        for (unsigned int subno = 0; subno < 3; subno++) {
     270                subphase_t *subphase = &phase->subphases[subno];
    623271               
    624272                TPRINTF(".. Sub-phase %u (%s)\n", subno + 1, subphase->name);
     
    632280        init_mem();
    633281       
    634         unsigned int phaseno;
    635         for (phaseno = 0; phaseno < sizeof_array(phases); phaseno++) {
    636                 phase_s *phase = &phases[phaseno];
     282        for (unsigned int phaseno = 0; phaseno < sizeof_array(phases);
     283            phaseno++) {
     284                phase_t *phase = &phases[phaseno];
    637285               
    638286                TPRINTF("Entering phase %u (%s)\n", phaseno + 1, phase->name);
     
    645293        }
    646294       
     295        TPRINTF("Cleaning up.\n");
     296        done_mem();
    647297        if (error_flag)
    648298                return "Test failed";
  • uspace/app/tester/tester.c

    ra0bb65af r98e4507  
    6363#include "mm/malloc1.def"
    6464#include "mm/malloc2.def"
     65#include "mm/malloc3.def"
    6566#include "hw/serial/serial1.def"
    6667#include "hw/misc/virtchar1.def"
  • uspace/app/tester/tester.h

    ra0bb65af r98e4507  
    4646extern char **test_argv;
    4747
     48/**
     49 * sizeof_array
     50 * @array array to determine the size of
     51 *
     52 * Returns the size of @array in array elements.
     53 */
     54#define sizeof_array(array) \
     55        (sizeof(array) / sizeof((array)[0]))
     56
    4857#define TPRINTF(format, ...) \
    49         { \
     58        do { \
    5059                if (!test_quiet) { \
    51                         fprintf(stderr, format, ##__VA_ARGS__); \
     60                        fprintf(stderr, (format), ##__VA_ARGS__); \
    5261                } \
    53         }
     62        } while (0)
    5463
    5564typedef const char *(*test_entry_t)(void);
     
    7988extern const char *test_malloc1(void);
    8089extern const char *test_malloc2(void);
     90extern const char *test_malloc3(void);
    8191extern const char *test_serial1(void);
    8292extern const char *test_virtchar1(void);
  • uspace/lib/c/Makefile

    ra0bb65af r98e4507  
    108108        generic/adt/measured_strings.c \
    109109        generic/adt/char_map.c \
     110        generic/adt/prodcons.c \
    110111        generic/time.c \
    111112        generic/stdlib.c \
  • uspace/lib/c/arch/ia32/Makefile.common

    ra0bb65af r98e4507  
    2828
    2929CLANG_ARCH = i386
    30 GCC_CFLAGS += -march=pentium
     30GCC_CFLAGS += -march=pentium -fno-omit-frame-pointer
    3131
    3232ENDIANESS = LE
  • uspace/lib/c/generic/as.c

    ra0bb65af r98e4507  
    5151 *
    5252 */
    53 void *as_area_create(void *address, size_t size, int flags)
     53void *as_area_create(void *address, size_t size, unsigned int flags)
    5454{
    5555        return (void *) __SYSCALL3(SYS_AS_AREA_CREATE, (sysarg_t) address,
     
    6767 *
    6868 */
    69 int as_area_resize(void *address, size_t size, int flags)
     69int as_area_resize(void *address, size_t size, unsigned int flags)
    7070{
    7171        return __SYSCALL3(SYS_AS_AREA_RESIZE, (sysarg_t) address,
     
    9595 *
    9696 */
    97 int as_area_change_flags(void *address, int flags)
     97int as_area_change_flags(void *address, unsigned int flags)
    9898{
    9999        return __SYSCALL2(SYS_AS_AREA_CHANGE_FLAGS, (sysarg_t) address,
  • uspace/lib/c/generic/event.c

    ra0bb65af r98e4507  
    4141#include <kernel/ipc/event_types.h>
    4242
    43 /** Subscribe for event notifications.
     43/** Subscribe event notifications.
    4444 *
    45  * @param evno   Event number.
    46  * @param method Use this method for notifying me.
     45 * @param evno    Event type to subscribe.
     46 * @param imethod Use this interface and method for notifying me.
    4747 *
    4848 * @return Value returned by the kernel.
     49 *
    4950 */
    50 int event_subscribe(event_type_t e, sysarg_t method)
     51int event_subscribe(event_type_t evno, sysarg_t imethod)
    5152{
    52         return __SYSCALL2(SYS_EVENT_SUBSCRIBE, (sysarg_t) e, (sysarg_t) method);
     53        return __SYSCALL2(SYS_EVENT_SUBSCRIBE, (sysarg_t) evno,
     54            (sysarg_t) imethod);
     55}
     56
     57/** Unmask event notifications.
     58 *
     59 * @param evno Event type to unmask.
     60 *
     61 * @return Value returned by the kernel.
     62 *
     63 */
     64int event_unmask(event_type_t evno)
     65{
     66        return __SYSCALL1(SYS_EVENT_UNMASK, (sysarg_t) evno);
    5367}
    5468
  • uspace/lib/c/generic/malloc.c

    ra0bb65af r98e4507  
    6565#define BASE_ALIGN  16
    6666
     67/** Heap shrink granularity
     68 *
     69 * Try not to pump and stress the heap to much
     70 * by shrinking and enlarging it too often.
     71 * A heap area won't shrunk if it the released
     72 * free block is smaller than this constant.
     73 *
     74 */
     75#define SHRINK_GRANULARITY  (64 * PAGE_SIZE)
     76
    6777/** Overhead of each heap block. */
    6878#define STRUCT_OVERHEAD \
     
    8696 *
    8797 */
    88 #define AREA_FIRST_BLOCK(area) \
     98#define AREA_FIRST_BLOCK_HEAD(area) \
    8999        (ALIGN_UP(((uintptr_t) (area)) + sizeof(heap_area_t), BASE_ALIGN))
     100
     101/** Get last block in heap area.
     102 *
     103 */
     104#define AREA_LAST_BLOCK_FOOT(area) \
     105        (((uintptr_t) (area)->end) - sizeof(heap_block_foot_t))
     106
     107/** Get header in heap block.
     108 *
     109 */
     110#define BLOCK_HEAD(foot) \
     111        ((heap_block_head_t *) \
     112            (((uintptr_t) (foot)) + sizeof(heap_block_foot_t) - (foot)->size))
    90113
    91114/** Get footer in heap block.
     
    94117#define BLOCK_FOOT(head) \
    95118        ((heap_block_foot_t *) \
    96             (((uintptr_t) head) + head->size - sizeof(heap_block_foot_t)))
     119            (((uintptr_t) (head)) + (head)->size - sizeof(heap_block_foot_t)))
    97120
    98121/** Heap area.
     
    115138        void *end;
    116139       
     140        /** Previous heap area */
     141        struct heap_area *prev;
     142       
    117143        /** Next heap area */
    118144        struct heap_area *next;
     
    212238/** Check a heap area structure
    213239 *
     240 * Should be called only inside the critical section.
     241 *
    214242 * @param addr Address of the heap area.
    215243 *
     
    220248       
    221249        assert(area->magic == HEAP_AREA_MAGIC);
     250        assert(addr == area->start);
    222251        assert(area->start < area->end);
    223252        assert(((uintptr_t) area->start % PAGE_SIZE) == 0);
     
    227256/** Create new heap area
    228257 *
    229  * @param start Preffered starting address of the new area.
    230  * @param size  Size of the area.
     258 * Should be called only inside the critical section.
     259 *
     260 * @param size Size of the area.
    231261 *
    232262 */
     
    248278       
    249279        area->start = astart;
    250         area->end = (void *)
    251             ALIGN_DOWN((uintptr_t) astart + asize, BASE_ALIGN);
     280        area->end = (void *) ((uintptr_t) astart + asize);
     281        area->prev = NULL;
    252282        area->next = NULL;
    253283        area->magic = HEAP_AREA_MAGIC;
    254284       
    255         void *block = (void *) AREA_FIRST_BLOCK(area);
     285        void *block = (void *) AREA_FIRST_BLOCK_HEAD(area);
    256286        size_t bsize = (size_t) (area->end - block);
    257287       
     
    262292                last_heap_area = area;
    263293        } else {
     294                area->prev = last_heap_area;
    264295                last_heap_area->next = area;
    265296                last_heap_area = area;
     
    271302/** Try to enlarge a heap area
    272303 *
     304 * Should be called only inside the critical section.
     305 *
    273306 * @param area Heap area to grow.
    274  * @param size Gross size of item to allocate (bytes).
     307 * @param size Gross size to grow (bytes).
     308 *
     309 * @return True if successful.
    275310 *
    276311 */
     
    282317        area_check(area);
    283318       
    284         size_t asize = ALIGN_UP((size_t) (area->end - area->start) + size,
    285             PAGE_SIZE);
    286        
    287319        /* New heap area size */
    288         void *end = (void *)
    289             ALIGN_DOWN((uintptr_t) area->start + asize, BASE_ALIGN);
     320        size_t gross_size = (size_t) (area->end - area->start) + size;
     321        size_t asize = ALIGN_UP(gross_size, PAGE_SIZE);
     322        void *end = (void *) ((uintptr_t) area->start + asize);
    290323       
    291324        /* Check for overflow */
     
    299332       
    300333        /* Add new free block */
    301         block_init(area->end, (size_t) (end - area->end), true, area);
     334        size_t net_size = (size_t) (end - area->end);
     335        if (net_size > 0)
     336                block_init(area->end, net_size, true, area);
    302337       
    303338        /* Update heap area parameters */
     
    309344/** Try to enlarge any of the heap areas
    310345 *
     346 * Should be called only inside the critical section.
     347 *
    311348 * @param size Gross size of item to allocate (bytes).
    312349 *
     
    318355       
    319356        /* First try to enlarge some existing area */
    320         heap_area_t *area;
    321         for (area = first_heap_area; area != NULL; area = area->next) {
     357        for (heap_area_t *area = first_heap_area; area != NULL;
     358            area = area->next) {
    322359                if (area_grow(area, size))
    323360                        return true;
     
    325362       
    326363        /* Eventually try to create a new area */
    327         return area_create(AREA_FIRST_BLOCK(size));
    328 }
    329 
    330 /** Try to shrink heap space
    331  *
     364        return area_create(AREA_FIRST_BLOCK_HEAD(size));
     365}
     366
     367/** Try to shrink heap
     368 *
     369 * Should be called only inside the critical section.
    332370 * In all cases the next pointer is reset.
    333371 *
    334  */
    335 static void heap_shrink(void)
    336 {
     372 * @param area Last modified heap area.
     373 *
     374 */
     375static void heap_shrink(heap_area_t *area)
     376{
     377        area_check(area);
     378       
     379        heap_block_foot_t *last_foot =
     380            (heap_block_foot_t *) AREA_LAST_BLOCK_FOOT(area);
     381        heap_block_head_t *last_head = BLOCK_HEAD(last_foot);
     382       
     383        block_check((void *) last_head);
     384        assert(last_head->area == area);
     385       
     386        if (last_head->free) {
     387                /*
     388                 * The last block of the heap area is
     389                 * unused. The area might be potentially
     390                 * shrunk.
     391                 */
     392               
     393                heap_block_head_t *first_head =
     394                    (heap_block_head_t *) AREA_FIRST_BLOCK_HEAD(area);
     395               
     396                block_check((void *) first_head);
     397                assert(first_head->area == area);
     398               
     399                size_t shrink_size = ALIGN_DOWN(last_head->size, PAGE_SIZE);
     400               
     401                if (first_head == last_head) {
     402                        /*
     403                         * The entire heap area consists of a single
     404                         * free heap block. This means we can get rid
     405                         * of it entirely.
     406                         */
     407                       
     408                        heap_area_t *prev = area->prev;
     409                        heap_area_t *next = area->next;
     410                       
     411                        if (prev != NULL) {
     412                                area_check(prev);
     413                                prev->next = next;
     414                        } else
     415                                first_heap_area = next;
     416                       
     417                        if (next != NULL) {
     418                                area_check(next);
     419                                next->prev = prev;
     420                        } else
     421                                last_heap_area = prev;
     422                       
     423                        as_area_destroy(area->start);
     424                } else if (shrink_size >= SHRINK_GRANULARITY) {
     425                        /*
     426                         * Make sure that we always shrink the area
     427                         * by a multiple of page size and update
     428                         * the block layout accordingly.
     429                         */
     430                       
     431                        size_t asize = (size_t) (area->end - area->start) - shrink_size;
     432                        void *end = (void *) ((uintptr_t) area->start + asize);
     433                       
     434                        /* Resize the address space area */
     435                        int ret = as_area_resize(area->start, asize, 0);
     436                        if (ret != EOK)
     437                                abort();
     438                       
     439                        /* Update heap area parameters */
     440                        area->end = end;
     441                       
     442                        /* Update block layout */
     443                        void *last = (void *) last_head;
     444                        size_t excess = (size_t) (area->end - last);
     445                       
     446                        if (excess > 0) {
     447                                if (excess >= STRUCT_OVERHEAD) {
     448                                        /*
     449                                         * The previous block cannot be free and there
     450                                         * is enough free space left in the area to
     451                                         * create a new free block.
     452                                         */
     453                                        block_init(last, excess, true, area);
     454                                } else {
     455                                        /*
     456                                         * The excess is small. Therefore just enlarge
     457                                         * the previous block.
     458                                         */
     459                                        heap_block_foot_t *prev_foot = (heap_block_foot_t *)
     460                                            (((uintptr_t) last_head) - sizeof(heap_block_foot_t));
     461                                        heap_block_head_t *prev_head = BLOCK_HEAD(prev_foot);
     462                                       
     463                                        block_check((void *) prev_head);
     464                                       
     465                                        block_init(prev_head, prev_head->size + excess,
     466                                            prev_head->free, area);
     467                                }
     468                        }
     469                }
     470        }
     471       
    337472        next = NULL;
    338473}
     
    398533{
    399534        area_check((void *) area);
    400         assert((void *) first_block >= (void *) AREA_FIRST_BLOCK(area));
     535        assert((void *) first_block >= (void *) AREA_FIRST_BLOCK_HEAD(area));
    401536        assert((void *) first_block < area->end);
    402537       
    403         heap_block_head_t *cur;
    404         for (cur = first_block; (void *) cur < area->end;
     538        for (heap_block_head_t *cur = first_block; (void *) cur < area->end;
    405539            cur = (heap_block_head_t *) (((void *) cur) + cur->size)) {
    406540                block_check(cur);
     
    436570                                         * data in (including alignment).
    437571                                         */
    438                                         if ((void *) cur > (void *) AREA_FIRST_BLOCK(area)) {
     572                                        if ((void *) cur > (void *) AREA_FIRST_BLOCK_HEAD(area)) {
    439573                                                /*
    440574                                                 * There is a block before the current block.
     
    496630                                                        size_t reduced_size = cur->size - excess;
    497631                                                        cur = (heap_block_head_t *)
    498                                                             (AREA_FIRST_BLOCK(area) + excess);
     632                                                            (AREA_FIRST_BLOCK_HEAD(area) + excess);
    499633                                                       
    500                                                         block_init((void *) AREA_FIRST_BLOCK(area), excess,
    501                                                             true, area);
     634                                                        block_init((void *) AREA_FIRST_BLOCK_HEAD(area),
     635                                                            excess, true, area);
    502636                                                        block_init(cur, reduced_size, true, area);
    503637                                                        split_mark(cur, real_size);
     
    552686       
    553687        /* Search the entire heap */
    554         heap_area_t *area;
    555         for (area = first_heap_area; area != NULL; area = area->next) {
     688        for (heap_area_t *area = first_heap_area; area != NULL;
     689            area = area->next) {
    556690                heap_block_head_t *first = (heap_block_head_t *)
    557                     AREA_FIRST_BLOCK(area);
     691                    AREA_FIRST_BLOCK_HEAD(area);
    558692               
    559693                void *addr = malloc_area(area, first, split, real_size,
     
    657791       
    658792        area_check(area);
    659         assert((void *) head >= (void *) AREA_FIRST_BLOCK(area));
     793        assert((void *) head >= (void *) AREA_FIRST_BLOCK_HEAD(area));
    660794        assert((void *) head < area->end);
    661795       
     
    675809                        block_init((void *) head + real_size,
    676810                            orig_size - real_size, true, area);
    677                         heap_shrink();
     811                        heap_shrink(area);
    678812                }
    679813               
     
    734868       
    735869        area_check(area);
    736         assert((void *) head >= (void *) AREA_FIRST_BLOCK(area));
     870        assert((void *) head >= (void *) AREA_FIRST_BLOCK_HEAD(area));
    737871        assert((void *) head < area->end);
    738872       
     
    751885       
    752886        /* Look at the previous block. If it is free, merge the two. */
    753         if ((void *) head > (void *) AREA_FIRST_BLOCK(area)) {
     887        if ((void *) head > (void *) AREA_FIRST_BLOCK_HEAD(area)) {
    754888                heap_block_foot_t *prev_foot =
    755889                    (heap_block_foot_t *) (((void *) head) - sizeof(heap_block_foot_t));
     
    765899        }
    766900       
    767         heap_shrink();
     901        heap_shrink(area);
    768902       
    769903        futex_up(&malloc_futex);
  • uspace/lib/c/include/adt/fifo.h

    ra0bb65af r98e4507  
    5151typedef unsigned long fifo_index_t;
    5252
    53 #define FIFO_CREATE_STATIC(name, t, itms)               \
    54         struct {                                        \
    55                 t fifo[(itms)];                         \
    56                 fifo_count_t items;                     \
    57                 fifo_index_t head;                      \
    58                 fifo_index_t tail;                      \
     53#define FIFO_CREATE_STATIC(name, t, itms) \
     54        struct { \
     55                t fifo[(itms)]; \
     56                fifo_count_t items; \
     57                fifo_index_t head; \
     58                fifo_index_t tail; \
    5959        } name
    6060
  • uspace/lib/c/include/adt/list.h

    ra0bb65af r98e4507  
    4747 *
    4848 * @param name Name of the new statically allocated list.
    49  */
    50 #define LIST_INITIALIZE(name)  link_t name = { \
    51         .prev = &name, \
    52         .next = &name \
    53 }
     49 *
     50 */
     51#define LIST_INITIALIZE(name) \
     52        link_t name = { \
     53                .prev = &name, \
     54                .next = &name \
     55        }
     56
     57#define list_get_instance(link, type, member) \
     58        ((type *) (((void *)(link)) - ((void *) &(((type *) NULL)->member))))
     59
     60#define list_foreach(list, iterator) \
     61        for (link_t *iterator = (list).next; \
     62            iterator != &(list); iterator = iterator->next)
    5463
    5564/** Initialize doubly-linked circular list link
     
    5867 *
    5968 * @param link Pointer to link_t structure to be initialized.
     69 *
    6070 */
    6171static inline void link_initialize(link_t *link)
     
    6979 * Initialize doubly-linked circular list.
    7080 *
    71  * @param head Pointer to link_t structure representing head of the list.
    72  */
    73 static inline void list_initialize(link_t *head)
    74 {
    75         head->prev = head;
    76         head->next = head;
     81 * @param list Pointer to link_t structure representing the list.
     82 *
     83 */
     84static inline void list_initialize(link_t *list)
     85{
     86        list->prev = list;
     87        list->next = list;
    7788}
    7889
     
    8293 *
    8394 * @param link Pointer to link_t structure to be added.
    84  * @param head Pointer to link_t structure representing head of the list.
    85  */
    86 static inline void list_prepend(link_t *link, link_t *head)
    87 {
    88         link->next = head->next;
    89         link->prev = head;
    90         head->next->prev = link;
    91         head->next = link;
     95 * @param list Pointer to link_t structure representing the list.
     96 *
     97 */
     98static inline void list_prepend(link_t *link, link_t *list)
     99{
     100        link->next = list->next;
     101        link->prev = list;
     102        list->next->prev = link;
     103        list->next = link;
    92104}
    93105
     
    97109 *
    98110 * @param link Pointer to link_t structure to be added.
    99  * @param head Pointer to link_t structure representing head of the list.
    100  */
    101 static inline void list_append(link_t *link, link_t *head)
    102 {
    103         link->prev = head->prev;
    104         link->next = head;
    105         head->prev->next = link;
    106         head->prev = link;
    107 }
    108 
    109 /** Insert item before another item in doubly-linked circular list. */
    110 static inline void list_insert_before(link_t *l, link_t *r)
    111 {
    112         list_append(l, r);
    113 }
    114 
    115 /** Insert item after another item in doubly-linked circular list. */
    116 static inline void list_insert_after(link_t *r, link_t *l)
    117 {
    118         list_prepend(l, r);
     111 * @param list Pointer to link_t structure representing the list.
     112 *
     113 */
     114static inline void list_append(link_t *link, link_t *list)
     115{
     116        link->prev = list->prev;
     117        link->next = list;
     118        list->prev->next = link;
     119        list->prev = link;
     120}
     121
     122/** Insert item before another item in doubly-linked circular list.
     123 *
     124 */
     125static inline void list_insert_before(link_t *link, link_t *list)
     126{
     127        list_append(link, list);
     128}
     129
     130/** Insert item after another item in doubly-linked circular list.
     131 *
     132 */
     133static inline void list_insert_after(link_t *link, link_t *list)
     134{
     135        list_prepend(list, link);
    119136}
    120137
     
    123140 * Remove item from doubly-linked circular list.
    124141 *
    125  * @param link Pointer to link_t structure to be removed from the list it is contained in.
     142 * @param link Pointer to link_t structure to be removed from the list
     143 *             it is contained in.
     144 *
    126145 */
    127146static inline void list_remove(link_t *link)
     
    136155 * Query emptiness of doubly-linked circular list.
    137156 *
    138  * @param head Pointer to link_t structure representing head of the list.
    139  */
    140 static inline int list_empty(link_t *head)
    141 {
    142         return ((head->next == head) ? 1 : 0);
    143 }
    144 
     157 * @param list Pointer to link_t structure representing the list.
     158 *
     159 */
     160static inline int list_empty(link_t *list)
     161{
     162        return (list->next == list);
     163}
     164
     165/** Get head item of a list.
     166 *
     167 * @param list Pointer to link_t structure representing the list.
     168 *
     169 * @return Head item of the list.
     170 * @return NULL if the list is empty.
     171 *
     172 */
     173static inline link_t *list_head(link_t *list)
     174{
     175        return ((list->next == list) ? NULL : list->next);
     176}
    145177
    146178/** Split or concatenate headless doubly-linked circular list
     
    151183 * concatenates splitted lists and splits concatenated lists.
    152184 *
    153  * @param part1 Pointer to link_t structure leading the first (half of the headless) list.
    154  * @param part2 Pointer to link_t structure leading the second (half of the headless) list.
     185 * @param part1 Pointer to link_t structure leading the first
     186 *              (half of the headless) list.
     187 * @param part2 Pointer to link_t structure leading the second
     188 *              (half of the headless) list.
     189 *
    155190 */
    156191static inline void headless_list_split_or_concat(link_t *part1, link_t *part2)
     
    165200}
    166201
    167 
    168202/** Split headless doubly-linked circular list
    169203 *
    170204 * Split headless doubly-linked circular list.
    171205 *
    172  * @param part1 Pointer to link_t structure leading the first half of the headless list.
    173  * @param part2 Pointer to link_t structure leading the second half of the headless list.
     206 * @param part1 Pointer to link_t structure leading
     207 *              the first half of the headless list.
     208 * @param part2 Pointer to link_t structure leading
     209 *              the second half of the headless list.
     210 *
    174211 */
    175212static inline void headless_list_split(link_t *part1, link_t *part2)
     
    182219 * Concatenate two headless doubly-linked circular lists.
    183220 *
    184  * @param part1 Pointer to link_t structure leading the first headless list.
    185  * @param part2 Pointer to link_t structure leading the second headless list.
     221 * @param part1 Pointer to link_t structure leading
     222 *              the first headless list.
     223 * @param part2 Pointer to link_t structure leading
     224 *              the second headless list.
     225 *
    186226 */
    187227static inline void headless_list_concat(link_t *part1, link_t *part2)
     
    190230}
    191231
    192 #define list_get_instance(link, type, member)  ((type *) (((void *)(link)) - ((void *) &(((type *) NULL)->member))))
    193 
    194 extern int list_member(const link_t *link, const link_t *head);
    195 extern void list_concat(link_t *head1, link_t *head2);
    196 extern unsigned int list_count(const link_t *link);
     232/** Get n-th item of a list.
     233 *
     234 * @param list Pointer to link_t structure representing the list.
     235 * @param n    Item number (indexed from zero).
     236 *
     237 * @return n-th item of the list.
     238 * @return NULL if no n-th item found.
     239 *
     240 */
     241static inline link_t *list_nth(link_t *list, unsigned int n)
     242{
     243        unsigned int cnt = 0;
     244       
     245        list_foreach(*list, link) {
     246                if (cnt == n)
     247                        return link;
     248               
     249                cnt++;
     250        }
     251       
     252        return NULL;
     253}
     254
     255extern int list_member(const link_t *, const link_t *);
     256extern void list_concat(link_t *, link_t *);
     257extern unsigned int list_count(const link_t *);
    197258
    198259#endif
  • uspace/lib/c/include/adt/measured_strings.h

    ra0bb65af r98e4507  
    6161extern measured_string_t *measured_string_create_bulk(const uint8_t *, size_t);
    6262extern measured_string_t *measured_string_copy(measured_string_t *);
     63
    6364extern int measured_strings_receive(measured_string_t **, uint8_t **, size_t);
    6465extern int measured_strings_reply(const measured_string_t *, size_t);
  • uspace/lib/c/include/as.h

    ra0bb65af r98e4507  
    5454}
    5555
    56 extern void *as_area_create(void *address, size_t size, int flags);
    57 extern int as_area_resize(void *address, size_t size, int flags);
    58 extern int as_area_change_flags(void *address, int flags);
    59 extern int as_area_destroy(void *address);
    60 extern void *set_maxheapsize(size_t mhs);
    61 extern void * as_get_mappable_page(size_t sz);
     56extern void *as_area_create(void *, size_t, unsigned int);
     57extern int as_area_resize(void *, size_t, unsigned int);
     58extern int as_area_change_flags(void *, unsigned int);
     59extern int as_area_destroy(void *);
     60extern void *set_maxheapsize(size_t);
     61extern void *as_get_mappable_page(size_t);
    6262
    6363#endif
  • uspace/lib/c/include/event.h

    ra0bb65af r98e4507  
    3939
    4040extern int event_subscribe(event_type_t, sysarg_t);
     41extern int event_unmask(event_type_t);
    4142
    4243#endif
  • uspace/lib/c/include/fibril.h

    ra0bb65af r98e4507  
    7070        int (*func)(void *);
    7171        tcb_t *tcb;
    72 
     72       
    7373        struct fibril *clean_after_me;
    7474        int retval;
    7575        int flags;
    76 
     76       
    7777        fibril_owner_info_t *waits_for;
    7878} fibril_t;
  • uspace/lib/softfloat/generic/add.c

    ra0bb65af r98e4507  
    2727 */
    2828
    29 /** @addtogroup softfloat       
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #include<sftypes.h>
    36 #include<add.h>
    37 #include<comparison.h>
     35#include <sftypes.h>
     36#include <add.h>
     37#include <comparison.h>
    3838
    3939/** Add two Float32 numbers with same signs
     
    139139        a.parts.exp = exp1;
    140140       
    141         /*Clear hidden bit and shift */
     141        /* Clear hidden bit and shift */
    142142        a.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)) ;
    143143        return a;
    144144}
    145 
    146145
    147146/** Add two Float64 numbers with same signs
     
    250249       
    251250        a.parts.exp = exp1;
    252         /*Clear hidden bit and shift */
     251        /* Clear hidden bit and shift */
    253252        a.parts.fraction = ( (frac1 >> 6 ) & (~FLOAT64_HIDDEN_BIT_MASK));
    254253       
  • uspace/lib/softfloat/generic/common.c

    ra0bb65af r98e4507  
    2727 */
    2828
    29 /** @addtogroup softfloat       
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #include<sftypes.h>
    36 #include<common.h>
     35#include <sftypes.h>
     36#include <common.h>
    3737
    3838/* Table for fast leading zeroes counting */
     
    213213/** @}
    214214 */
    215 
  • uspace/lib/softfloat/generic/comparison.c

    ra0bb65af r98e4507  
    2727 */
    2828
    29 /** @addtogroup softfloat       
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #include<sftypes.h>
    36 #include<comparison.h>
     35#include <sftypes.h>
     36#include <comparison.h>
    3737
    38 inline int isFloat32NaN(float32 f)
    39 {       /* NaN : exp = 0xff and nonzero fraction */
    40         return ((f.parts.exp==0xFF)&&(f.parts.fraction));
     38/* NaN : exp = 0xff and nonzero fraction */
     39int isFloat32NaN(float32 f)
     40{
     41        return ((f.parts.exp == 0xFF) && (f.parts.fraction));
    4142}
    4243
    43 inline int isFloat64NaN(float64 d)
    44 {       /* NaN : exp = 0x7ff and nonzero fraction */
    45         return ((d.parts.exp==0x7FF)&&(d.parts.fraction));
     44/* NaN : exp = 0x7ff and nonzero fraction */
     45int isFloat64NaN(float64 d)
     46{
     47        return ((d.parts.exp == 0x7FF) && (d.parts.fraction));
    4648}
    4749
    48 inline int isFloat32SigNaN(float32 f)
    49 {       /* SigNaN : exp = 0xff fraction = 0xxxxx..x (binary), where at least one x is nonzero */
    50         return ((f.parts.exp==0xFF)&&(f.parts.fraction<0x400000)&&(f.parts.fraction));
     50/* SigNaN : exp = 0xff fraction = 0xxxxx..x (binary), where at least one x is nonzero */
     51int isFloat32SigNaN(float32 f)
     52{
     53        return ((f.parts.exp == 0xFF) && (f.parts.fraction < 0x400000) && (f.parts.fraction));
    5154}
    5255
    53 inline int isFloat64SigNaN(float64 d)
    54 {       /* SigNaN : exp = 0x7ff fraction = 0xxxxx..x (binary), where at least one x is nonzero */
    55         return ((d.parts.exp==0x7FF)&&(d.parts.fraction)&&(d.parts.fraction<0x8000000000000ll));
     56/* SigNaN : exp = 0x7ff fraction = 0xxxxx..x (binary), where at least one x is nonzero */
     57int isFloat64SigNaN(float64 d)
     58{
     59        return ((d.parts.exp == 0x7FF) && (d.parts.fraction) && (d.parts.fraction < 0x8000000000000ll));
    5660}
    5761
    58 inline int isFloat32Infinity(float32 f)
     62int isFloat32Infinity(float32 f)
    5963{
    60         return ((f.parts.exp==0xFF)&&(f.parts.fraction==0x0));
     64        return ((f.parts.exp == 0xFF) && (f.parts.fraction == 0x0));
    6165}
    6266
    63 inline int isFloat64Infinity(float64 d)
     67int isFloat64Infinity(float64 d)
    6468{
    65         return ((d.parts.exp==0x7FF)&&(d.parts.fraction==0x0));
     69        return ((d.parts.exp == 0x7FF) && (d.parts.fraction == 0x0));
    6670}
    6771
    68 inline int isFloat32Zero(float32 f)
     72int isFloat32Zero(float32 f)
    6973{
    7074        return (((f.binary) & 0x7FFFFFFF) == 0);
    7175}
    7276
    73 inline int isFloat64Zero(float64 d)
     77int isFloat64Zero(float64 d)
    7478{
    7579        return (((d.binary) & 0x7FFFFFFFFFFFFFFFll) == 0);
     
    7781
    7882/**
    79  * @return 1, if both floats are equal - but NaNs are not recognized
     83 * @return 1 if both floats are equal - but NaNs are not recognized
    8084 */
    81 inline int isFloat32eq(float32 a, float32 b)
     85int isFloat32eq(float32 a, float32 b)
    8286{
    83         return ((a.binary==b.binary)||(((a.binary| b.binary)&0x7FFFFFFF)==0)); /* a equals to b or both are zeros (with any sign) */
     87        /* a equals to b or both are zeros (with any sign) */
     88        return ((a.binary==b.binary) || (((a.binary | b.binary) & 0x7FFFFFFF) == 0));
    8489}
    8590
    8691/**
    87  * @return 1, if a<b - but NaNs are not recognized
     92 * @return 1 if a < b - but NaNs are not recognized
    8893 */
    89 inline int isFloat32lt(float32 a, float32 b)
     94int isFloat32lt(float32 a, float32 b)
    9095{
    91         if (((a.binary| b.binary)&0x7FFFFFFF)==0) {
     96        if (((a.binary | b.binary) & 0x7FFFFFFF) == 0)
    9297                return 0; /* +- zeroes */
    93         };
    9498       
    95         if ((a.parts.sign)&&(b.parts.sign)) {
    96                 /*if both are negative, smaller is that with greater binary value*/
    97                 return (a.binary>b.binary);
    98                 };
     99        if ((a.parts.sign) && (b.parts.sign))
     100                /* if both are negative, smaller is that with greater binary value */
     101                return (a.binary > b.binary);
    99102       
    100         /* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison)*/
    101         a.parts.sign=!a.parts.sign;
    102         b.parts.sign=!b.parts.sign;
    103         return (a.binary<b.binary);
    104                        
     103        /* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison) */
     104        a.parts.sign = !a.parts.sign;
     105        b.parts.sign = !b.parts.sign;
     106        return (a.binary < b.binary);
    105107}
    106108
    107109/**
    108  * @return 1, if a>b - but NaNs are not recognized
     110 * @return 1 if a > b - but NaNs are not recognized
    109111 */
    110 inline int isFloat32gt(float32 a, float32 b)
     112int isFloat32gt(float32 a, float32 b)
    111113{
    112         if (((a.binary| b.binary)&0x7FFFFFFF)==0) {
     114        if (((a.binary | b.binary) & 0x7FFFFFFF) == 0)
    113115                return 0; /* zeroes are equal with any sign */
    114         };
    115116       
    116         if ((a.parts.sign)&&(b.parts.sign)) {
    117                 /*if both are negative, greater is that with smaller binary value*/
    118                 return (a.binary<b.binary);
    119                 };
     117        if ((a.parts.sign) && (b.parts.sign))
     118                /* if both are negative, greater is that with smaller binary value */
     119                return (a.binary < b.binary);
    120120       
    121         /* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison)*/
    122         a.parts.sign=!a.parts.sign;
    123         b.parts.sign=!b.parts.sign;
    124         return (a.binary>b.binary);
    125                        
     121        /* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison) */
     122        a.parts.sign = !a.parts.sign;
     123        b.parts.sign = !b.parts.sign;
     124        return (a.binary > b.binary);
    126125}
    127126
  • uspace/lib/softfloat/generic/div.c

    ra0bb65af r98e4507  
    2727 */
    2828
    29 /** @addtogroup softfloat       
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #include<sftypes.h>
    36 #include<add.h>
    37 #include<div.h>
    38 #include<comparison.h>
    39 #include<mul.h>
    40 #include<common.h>
    41 
     35#include <sftypes.h>
     36#include <add.h>
     37#include <div.h>
     38#include <comparison.h>
     39#include <mul.h>
     40#include <common.h>
    4241
    4342float32 divFloat32(float32 a, float32 b)
  • uspace/lib/softfloat/generic/mul.c

    ra0bb65af r98e4507  
    2727 */
    2828
    29 /** @addtogroup softfloat       
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #include<sftypes.h>
    36 #include<mul.h>
    37 #include<comparison.h>
    38 #include<common.h>
     35#include <sftypes.h>
     36#include <mul.h>
     37#include <comparison.h>
     38#include <common.h>
    3939
    4040/** Multiply two 32 bit float numbers
  • uspace/lib/softfloat/generic/other.c

    ra0bb65af r98e4507  
    2727 */
    2828
    29 /** @addtogroup softfloat       
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
  • uspace/lib/softfloat/generic/softfloat.c

    ra0bb65af r98e4507  
    3535 */
    3636
    37 #include<softfloat.h>
    38 #include<sftypes.h>
    39 
    40 #include<add.h>
    41 #include<sub.h>
    42 #include<mul.h>
    43 #include<div.h>
    44 
    45 #include<conversion.h>
    46 #include<comparison.h>
    47 #include<other.h>
    48 
    49 #include<functions.h>
     37#include <softfloat.h>
     38#include <sftypes.h>
     39
     40#include <add.h>
     41#include <sub.h>
     42#include <mul.h>
     43#include <div.h>
     44
     45#include <conversion.h>
     46#include <comparison.h>
     47#include <other.h>
     48
     49#include <functions.h>
    5050
    5151/* Arithmetic functions */
     
    494494}
    495495
    496 
    497496/** @}
    498497 */
    499 
  • uspace/lib/softfloat/generic/sub.c

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3333 */
    3434
    35 #include<sftypes.h>
    36 #include<sub.h>
    37 #include<comparison.h>
     35#include <sftypes.h>
     36#include <sub.h>
     37#include <comparison.h>
    3838
    3939/** Subtract two float32 numbers with same signs
     
    260260}
    261261
    262 
    263  /** @}
    264  */
    265 
     262/** @}
     263 */
  • uspace/lib/softfloat/include/add.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3636#define __ADD_H__
    3737
    38 float32 addFloat32(float32 a, float32 b);
    39 
    40 float64 addFloat64(float64 a, float64 b);
     38extern float32 addFloat32(float32, float32);
     39extern float64 addFloat64(float64, float64);
    4140
    4241#endif
    4342
    44 
    45  /** @}
     43/** @}
    4644 */
    47 
  • uspace/lib/softfloat/include/common.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3636#define __COMMON_H__
    3737
    38 #include<sftypes.h>
     38#include <sftypes.h>
    3939
    40 float64 finishFloat64(int32_t cexp, uint64_t cfrac, char sign);
     40extern float64 finishFloat64(int32_t, uint64_t, char);
    4141
    42 int countZeroes64(uint64_t i);
    43 int countZeroes32(uint32_t i);
    44 int countZeroes8(uint8_t i);
     42extern int countZeroes64(uint64_t);
     43extern int countZeroes32(uint32_t);
     44extern int countZeroes8(uint8_t);
    4545
    46 void roundFloat32(int32_t *exp, uint32_t *fraction);
    47 void roundFloat64(int32_t *exp, uint64_t *fraction);
     46extern void roundFloat32(int32_t *, uint32_t *);
     47extern void roundFloat64(int32_t *, uint64_t *);
    4848
    4949#endif
    5050
    51  /** @}
     51/** @}
    5252 */
    53 
  • uspace/lib/softfloat/include/comparison.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3636#define __COMPARISON_H__
    3737
    38 inline int isFloat32NaN(float32 f);
    39 inline int isFloat32SigNaN(float32 f);
     38extern int isFloat32NaN(float32);
     39extern int isFloat32SigNaN(float32);
    4040
    41 inline int isFloat32Infinity(float32 f);
    42 inline int isFloat32Zero(float32 f);
     41extern int isFloat32Infinity(float32);
     42extern int isFloat32Zero(float32);
    4343
    44 inline int isFloat64NaN(float64 d);
    45 inline int isFloat64SigNaN(float64 d);
     44extern int isFloat64NaN(float64);
     45extern int isFloat64SigNaN(float64);
    4646
    47 inline int isFloat64Infinity(float64 d);
    48 inline int isFloat64Zero(float64 d);
     47extern int isFloat64Infinity(float64);
     48extern int isFloat64Zero(float64);
    4949
    50 inline int isFloat32eq(float32 a, float32 b);
    51 inline int isFloat32lt(float32 a, float32 b);
    52 inline int isFloat32gt(float32 a, float32 b);
     50extern int isFloat32eq(float32, float32);
     51extern int isFloat32lt(float32, float32);
     52extern int isFloat32gt(float32, float32);
    5353
    5454#endif
    5555
    56 
    57  /** @}
     56/** @}
    5857 */
    59 
  • uspace/lib/softfloat/include/conversion.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29 /** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3636#define __CONVERSION_H__
    3737
    38 float64 convertFloat32ToFloat64(float32 a);
     38extern float64 convertFloat32ToFloat64(float32);
     39extern float32 convertFloat64ToFloat32(float64);
    3940
    40 float32 convertFloat64ToFloat32(float64 a);
     41extern uint32_t float32_to_uint32(float32);
     42extern int32_t float32_to_int32(float32);
    4143
    42 uint32_t float32_to_uint32(float32 a);
    43 int32_t float32_to_int32(float32 a);
     44extern uint64_t float32_to_uint64(float32);
     45extern int64_t float32_to_int64(float32);
    4446
    45 uint64_t float32_to_uint64(float32 a);
    46 int64_t float32_to_int64(float32 a);
     47extern uint64_t float64_to_uint64(float64);
     48extern int64_t float64_to_int64(float64);
    4749
    48 uint64_t float64_to_uint64(float64 a);
    49 int64_t float64_to_int64(float64 a);
     50extern uint32_t float64_to_uint32(float64);
     51extern int32_t float64_to_int32(float64);
    5052
    51 uint32_t float64_to_uint32(float64 a);
    52 int32_t float64_to_int32(float64 a);
     53extern float32 uint32_to_float32(uint32_t);
     54extern float32 int32_to_float32(int32_t);
    5355
    54 float32 uint32_to_float32(uint32_t i);
    55 float32 int32_to_float32(int32_t i);
     56extern float32 uint64_to_float32(uint64_t);
     57extern float32 int64_to_float32(int64_t);
    5658
    57 float32 uint64_to_float32(uint64_t i);
    58 float32 int64_to_float32(int64_t i);
     59extern float64 uint32_to_float64(uint32_t);
     60extern float64 int32_to_float64(int32_t);
    5961
    60 float64 uint32_to_float64(uint32_t i);
    61 float64 int32_to_float64(int32_t i);
    62 
    63 float64 uint64_to_float64(uint64_t i);
    64 float64 int64_to_float64(int64_t i);
     62extern float64 uint64_to_float64(uint64_t);
     63extern float64 int64_to_float64(int64_t);
    6564
    6665#endif
    6766
    68 
    69  /** @}
     67/** @}
    7068 */
    71 
  • uspace/lib/softfloat/include/div.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3636#define __DIV_H__
    3737
    38 float32 divFloat32(float32 a, float32 b);
    39 float64 divFloat64(float64 a, float64 b);
     38extern float32 divFloat32(float32, float32);
     39extern float64 divFloat64(float64, float64);
    4040
    41 uint64_t divFloat64estim(uint64_t a, uint64_t b);
     41extern uint64_t divFloat64estim(uint64_t, uint64_t);
    4242
    4343#endif
    4444
    45 
    46  /** @}
     45/** @}
    4746 */
    48 
  • uspace/lib/softfloat/include/mul.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3636#define __MUL_H__
    3737
    38 float32 mulFloat32(float32 a, float32 b);
     38extern float32 mulFloat32(float32, float32);
     39extern float64 mulFloat64(float64, float64);
    3940
    40 float64 mulFloat64(float64 a, float64 b);
    41 
    42 void mul64integers(uint64_t a,uint64_t b, uint64_t *lo, uint64_t *hi);
     41extern void mul64integers(uint64_t, uint64_t, uint64_t *, uint64_t *);
    4342
    4443#endif
    4544
    46 
    47  /** @}
     45/** @}
    4846 */
    49 
  • uspace/lib/softfloat/include/other.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3838#endif
    3939
    40 
    41  /** @}
     40/** @}
    4241 */
    43 
  • uspace/lib/softfloat/include/sftypes.h

    ra0bb65af r98e4507  
    5555        #error Unknown endianess
    5656#endif
    57                 } parts __attribute__ ((packed));
     57        } parts __attribute__ ((packed));
    5858} float32;
    5959
     
    7777} float64;
    7878
    79 #define FLOAT32_MAX 0x7f800000
    80 #define FLOAT32_MIN 0xff800000
     79#define FLOAT32_MAX  0x7f800000
     80#define FLOAT32_MIN  0xff800000
    8181#define FLOAT64_MAX
    8282#define FLOAT64_MIN
     
    8686 * comparing with these constants is not sufficient.
    8787 */
    88 #define FLOAT32_NAN 0x7FC00001
    89 #define FLOAT32_SIGNAN 0x7F800001
    90 #define FLOAT32_INF 0x7F800000
    9188
    92 #define FLOAT64_NAN 0x7FF8000000000001ll
    93 #define FLOAT64_SIGNAN 0x7FF0000000000001ll
    94 #define FLOAT64_INF 0x7FF0000000000000ll
     89#define FLOAT32_NAN     0x7FC00001
     90#define FLOAT32_SIGNAN  0x7F800001
     91#define FLOAT32_INF     0x7F800000
    9592
    96 #define FLOAT32_FRACTION_SIZE 23
    97 #define FLOAT64_FRACTION_SIZE 52
     93#define FLOAT64_NAN     0x7FF8000000000001ll
     94#define FLOAT64_SIGNAN  0x7FF0000000000001ll
     95#define FLOAT64_INF     0x7FF0000000000000ll
    9896
    99 #define FLOAT32_HIDDEN_BIT_MASK 0x800000
    100 #define FLOAT64_HIDDEN_BIT_MASK 0x10000000000000ll
     97#define FLOAT32_FRACTION_SIZE  23
     98#define FLOAT64_FRACTION_SIZE  52
    10199
    102 #define FLOAT32_MAX_EXPONENT 0xFF
    103 #define FLOAT64_MAX_EXPONENT 0x7FF
     100#define FLOAT32_HIDDEN_BIT_MASK  0x800000
     101#define FLOAT64_HIDDEN_BIT_MASK  0x10000000000000ll
    104102
    105 #define FLOAT32_BIAS 0x7F
    106 #define FLOAT64_BIAS 0x3FF
    107 #define FLOAT80_BIAS 0x3FFF
     103#define FLOAT32_MAX_EXPONENT  0xFF
     104#define FLOAT64_MAX_EXPONENT  0x7FF
    108105
     106#define FLOAT32_BIAS  0x7F
     107#define FLOAT64_BIAS  0x3FF
     108#define FLOAT80_BIAS  0x3FFF
    109109
    110110#endif
  • uspace/lib/softfloat/include/softfloat.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3636#define __SOFTFLOAT_H__
    3737
    38 float __addsf3(float a, float b);
    39 double __adddf3(double a, double b);
    40 long double __addtf3(long double a, long double b);
    41 long double __addxf3(long double a, long double b);
    42  
    43 float __subsf3(float a, float b);
    44 double __subdf3(double a, double b);
    45 long double __subtf3(long double a, long double b);
    46 long double __subxf3(long double a, long double b);
    47  
    48 float __mulsf3(float a, float b);
    49 double __muldf3(double a, double b);
    50 long double __multf3(long double a, long double b);
    51 long double __mulxf3(long double a, long double b);
    52  
    53 float __divsf3(float a, float b);
    54 double __divdf3(double a, double b);
    55 long double __divtf3(long double a, long double b);
    56 long double __divxf3(long double a, long double b);
    57  
    58 float __negsf2(float a);
    59 double __negdf2(double a);
    60 long double __negtf2(long double a);
    61 long double __negxf2(long double a);
    62  
    63 double __extendsfdf2(float a);
    64 long double __extendsftf2(float a);
    65 long double __extendsfxf2(float a);
    66 long double __extenddftf2(double a);
    67 long double __extenddfxf2(double a);
    68  
    69 double __truncxfdf2(long double a);
    70 double __trunctfdf2(long double a);
    71 float __truncxfsf2(long double a);
    72 float __trunctfsf2(long double a);
    73 float __truncdfsf2(double a);
    74  
    75 int __fixsfsi(float a);
    76 int __fixdfsi(double a);
    77 int __fixtfsi(long double a);
    78 int __fixxfsi(long double a);
    79  
    80 long __fixsfdi(float a);
    81 long __fixdfdi(double a);
    82 long __fixtfdi(long double a);
    83 long __fixxfdi(long double a);
    84  
    85 long long __fixsfti(float a);
    86 long long __fixdfti(double a);
    87 long long __fixtfti(long double a);
    88 long long __fixxfti(long double a);
    89  
    90 unsigned int __fixunssfsi(float a);
    91 unsigned int __fixunsdfsi(double a);
    92 unsigned int __fixunstfsi(long double a);
    93 unsigned int __fixunsxfsi(long double a);
    94  
    95 unsigned long __fixunssfdi(float a);
    96 unsigned long __fixunsdfdi(double a);
    97 unsigned long __fixunstfdi(long double a);
    98 unsigned long __fixunsxfdi(long double a);
    99  
    100 unsigned long long __fixunssfti(float a);
    101 unsigned long long __fixunsdfti(double a);
    102 unsigned long long __fixunstfti(long double a);
    103 unsigned long long __fixunsxfti(long double a);
    104  
    105 float __floatsisf(int i);
    106 double __floatsidf(int i);
    107 long double __floatsitf(int i);
    108 long double __floatsixf(int i);
    109  
    110 float __floatdisf(long i);
    111 double __floatdidf(long i);
    112 long double __floatditf(long i);
    113 long double __floatdixf(long i);
    114  
    115 float __floattisf(long long i);
    116 double __floattidf(long long i);
    117 long double __floattitf(long long i);
    118 long double __floattixf(long long i);
    119  
    120 float __floatunsisf(unsigned int i);
    121 double __floatunsidf(unsigned int i);
    122 long double __floatunsitf(unsigned int i);
    123 long double __floatunsixf(unsigned int i);
    124  
    125 float __floatundisf(unsigned long i);
    126 double __floatundidf(unsigned long i);
    127 long double __floatunditf(unsigned long i);
    128 long double __floatundixf(unsigned long i);
    129  
    130 float __floatuntisf(unsigned long long i);
    131 double __floatuntidf(unsigned long long i);
    132 long double __floatuntitf(unsigned long long i);
    133 long double __floatuntixf(unsigned long long i);
    134  
    135 int __cmpsf2(float a, float b);
    136 int __cmpdf2(double a, double b);
    137 int __cmptf2(long double a, long double b);
    138  
    139 int __unordsf2(float a, float b);
    140 int __unorddf2(double a, double b);
    141 int __unordtf2(long double a, long double b);
    142  
    143 int __eqsf2(float a, float b);
    144 int __eqdf2(double a, double b);
    145 int __eqtf2(long double a, long double b);
    146  
    147 int __nesf2(float a, float b);
    148 int __nedf2(double a, double b);
    149 int __netf2(long double a, long double b);
    150  
    151 int __gesf2(float a, float b);
    152 int __gedf2(double a, double b);
    153 int __getf2(long double a, long double b);
    154  
    155 int __ltsf2(float a, float b);
    156 int __ltdf2(double a, double b);
    157 int __lttf2(long double a, long double b);
    158 int __lesf2(float a, float b);
    159 int __ledf2(double a, double b);
    160 int __letf2(long double a, long double b);
    161  
    162 int __gtsf2(float a, float b);
    163 int __gtdf2(double a, double b);
    164 int __gttf2(long double a, long double b);
    165  
    166 /* Not implemented yet*/
    167 float __powisf2(float a, int b);
     38extern float __addsf3(float, float);
     39extern double __adddf3(double, double);
     40extern long double __addtf3(long double, long double);
     41extern long double __addxf3(long double, long double);
     42
     43extern float __subsf3(float, float);
     44extern double __subdf3(double, double);
     45extern long double __subtf3(long double, long double);
     46extern long double __subxf3(long double, long double);
     47
     48extern float __mulsf3(float, float);
     49extern double __muldf3(double, double);
     50extern long double __multf3(long double, long double);
     51extern long double __mulxf3(long double, long double);
     52
     53extern float __divsf3(float, float);
     54extern double __divdf3(double, double);
     55extern long double __divtf3(long double, long double);
     56extern long double __divxf3(long double, long double);
     57
     58extern float __negsf2(float);
     59extern double __negdf2(double);
     60extern long double __negtf2(long double);
     61extern long double __negxf2(long double);
     62
     63extern double __extendsfdf2(float);
     64extern long double __extendsftf2(float);
     65extern long double __extendsfxf2(float);
     66extern long double __extenddftf2(double);
     67extern long double __extenddfxf2(double);
     68
     69extern double __truncxfdf2(long double);
     70extern double __trunctfdf2(long double);
     71extern float __truncxfsf2(long double);
     72extern float __trunctfsf2(long double);
     73extern float __truncdfsf2(double);
     74
     75extern int __fixsfsi(float);
     76extern int __fixdfsi(double);
     77extern int __fixtfsi(long double);
     78extern int __fixxfsi(long double);
     79
     80extern long __fixsfdi(float);
     81extern long __fixdfdi(double);
     82extern long __fixtfdi(long double);
     83extern long __fixxfdi(long double);
     84
     85extern long long __fixsfti(float);
     86extern long long __fixdfti(double);
     87extern long long __fixtfti(long double);
     88extern long long __fixxfti(long double);
     89
     90extern unsigned int __fixunssfsi(float);
     91extern unsigned int __fixunsdfsi(double);
     92extern unsigned int __fixunstfsi(long double);
     93extern unsigned int __fixunsxfsi(long double);
     94
     95extern unsigned long __fixunssfdi(float);
     96extern unsigned long __fixunsdfdi(double);
     97extern unsigned long __fixunstfdi(long double);
     98extern unsigned long __fixunsxfdi(long double);
     99
     100extern unsigned long long __fixunssfti(float);
     101extern unsigned long long __fixunsdfti(double);
     102extern unsigned long long __fixunstfti(long double);
     103extern unsigned long long __fixunsxfti(long double);
     104
     105extern float __floatsisf(int);
     106extern double __floatsidf(int);
     107extern long double __floatsitf(int);
     108extern long double __floatsixf(int);
     109
     110extern float __floatdisf(long);
     111extern double __floatdidf(long);
     112extern long double __floatditf(long);
     113extern long double __floatdixf(long);
     114
     115extern float __floattisf(long long);
     116extern double __floattidf(long long);
     117extern long double __floattitf(long long);
     118extern long double __floattixf(long long);
     119
     120extern float __floatunsisf(unsigned int);
     121extern double __floatunsidf(unsigned int);
     122extern long double __floatunsitf(unsigned int);
     123extern long double __floatunsixf(unsigned int);
     124
     125extern float __floatundisf(unsigned long);
     126extern double __floatundidf(unsigned long);
     127extern long double __floatunditf(unsigned long);
     128extern long double __floatundixf(unsigned long);
     129
     130extern float __floatuntisf(unsigned long long);
     131extern double __floatuntidf(unsigned long long);
     132extern long double __floatuntitf(unsigned long long);
     133extern long double __floatuntixf(unsigned long long);
     134
     135extern int __cmpsf2(float, float);
     136extern int __cmpdf2(double, double);
     137extern int __cmptf2(long double, long double);
     138
     139extern int __unordsf2(float, float);
     140extern int __unorddf2(double, double);
     141extern int __unordtf2(long double, long double);
     142
     143extern int __eqsf2(float, float);
     144extern int __eqdf2(double, double);
     145extern int __eqtf2(long double, long double);
     146
     147extern int __nesf2(float, float);
     148extern int __nedf2(double, double);
     149extern int __netf2(long double, long double);
     150
     151extern int __gesf2(float, float);
     152extern int __gedf2(double, double);
     153extern int __getf2(long double, long double);
     154
     155extern int __ltsf2(float, float);
     156extern int __ltdf2(double, double);
     157extern int __lttf2(long double, long double);
     158extern int __lesf2(float, float);
     159extern int __ledf2(double, double);
     160extern int __letf2(long double, long double);
     161
     162extern int __gtsf2(float, float);
     163extern int __gtdf2(double, double);
     164extern int __gttf2(long double, long double);
     165
     166/* Not implemented yet */
     167extern float __powisf2(float, int);
    168168
    169169#endif
    170170
    171 
    172  /** @}
     171/** @}
    173172 */
    174 
  • uspace/lib/softfloat/include/sub.h

    ra0bb65af r98e4507  
    2727 */
    2828
    29  /** @addtogroup softfloat     
     29/** @addtogroup softfloat
    3030 * @{
    3131 */
     
    3636#define __SUB_H__
    3737
    38 float32 subFloat32(float32 a, float32 b);
    39 
    40 float64 subFloat64(float64 a, float64 b);
     38extern float32 subFloat32(float32, float32);
     39extern float64 subFloat64(float64, float64);
    4140
    4241#endif
    4342
    44 
    45  /** @}
     43/** @}
    4644 */
    47 
Note: See TracChangeset for help on using the changeset viewer.