Changes in / [b0beb9b1:64f85f5] in mainline


Ignore:
Location:
kernel
Files:
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/Makefile

    rb0beb9b1 r64f85f5  
    9494        -fdebug-prefix-map=$(realpath $(ROOT_PATH))=.
    9595
    96 GCC_CFLAGS = -std=gnu11 -Wall -Wextra -Wno-unused-parameter \
     96GCC_CFLAGS = -std=gnu99 -Wall -Wextra -Wno-unused-parameter \
    9797        -Wmissing-prototypes -Werror-implicit-function-declaration \
    9898        -Wwrite-strings -pipe -Wno-cast-function-type
    9999
    100 CLANG_CFLAGS = -std=gnu11 -Wall -Wextra -Wno-unused-parameter \
     100CLANG_CFLAGS = -std=gnu99 -Wall -Wextra -Wno-unused-parameter \
    101101        -Wno-missing-field-initializers -Wno-unused-command-line-argument \
    102102        -Wmissing-prototypes -Werror-implicit-function-declaration \
     
    197197        generic/src/mm/tlb.c \
    198198        generic/src/mm/as.c \
    199         generic/src/mm/malloc.c \
    200199        generic/src/mm/backend_anon.c \
    201200        generic/src/mm/backend_elf.c \
  • kernel/generic/include/bitops.h

    rb0beb9b1 r64f85f5  
    3636#define KERN_BITOPS_H_
    3737
    38 #include <stdint.h>
    3938#include <trace.h>
    4039
  • kernel/generic/include/main/main.h

    rb0beb9b1 r64f85f5  
    4848extern void main_ap(void);
    4949
    50 extern void malloc_init(void);
    51 
    5250#endif
    5351
  • kernel/generic/include/mm/slab.h

    rb0beb9b1 r64f85f5  
    4040#include <atomic.h>
    4141#include <mm/frame.h>
     42
     43/** Minimum size to be allocated by malloc */
     44#define SLAB_MIN_MALLOC_W  4
     45
     46/** Maximum size to be allocated by malloc */
     47#define SLAB_MAX_MALLOC_W  22
    4248
    4349/** Initial Magazine size (TODO: dynamically growing magazines) */
  • kernel/generic/src/main/main.c

    rb0beb9b1 r64f85f5  
    246246        frame_init();
    247247        slab_cache_init();
    248         malloc_init();
    249248        ra_init();
    250249        sysinfo_init();
  • kernel/generic/src/mm/slab.c

    rb0beb9b1 r64f85f5  
    138138static slab_cache_t *slab_extern_cache;
    139139
     140/** Caches for malloc */
     141static slab_cache_t *malloc_caches[SLAB_MAX_MALLOC_W - SLAB_MIN_MALLOC_W + 1];
     142
     143static const char *malloc_names[] =  {
     144        "malloc-16",
     145        "malloc-32",
     146        "malloc-64",
     147        "malloc-128",
     148        "malloc-256",
     149        "malloc-512",
     150        "malloc-1K",
     151        "malloc-2K",
     152        "malloc-4K",
     153        "malloc-8K",
     154        "malloc-16K",
     155        "malloc-32K",
     156        "malloc-64K",
     157        "malloc-128K",
     158        "malloc-256K",
     159        "malloc-512K",
     160        "malloc-1M",
     161        "malloc-2M",
     162        "malloc-4M"
     163};
     164
    140165/** Slab descriptor */
    141166typedef struct {
     
    750775                panic("Destroying cache that is not empty.");
    751776
    752         if (!(cache->flags & SLAB_CACHE_NOMAGAZINE) && cache->mag_cache) {
    753                 slab_free(&slab_mag_cache, cache->mag_cache);
     777        if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) {
     778                slab_t *mag_slab = obj2slab(cache->mag_cache);
     779                _slab_free(mag_slab->cache, cache->mag_cache, mag_slab);
    754780        }
    755781
     
    888914            NULL, NULL, SLAB_CACHE_SLINSIDE | SLAB_CACHE_MAGDEFERRED);
    889915
     916        /* Initialize structures for malloc */
     917        size_t i;
     918        size_t size;
     919
     920        for (i = 0, size = (1 << SLAB_MIN_MALLOC_W);
     921            i < (SLAB_MAX_MALLOC_W - SLAB_MIN_MALLOC_W + 1);
     922            i++, size <<= 1) {
     923                malloc_caches[i] = slab_cache_create(malloc_names[i], size, 0,
     924                    NULL, NULL, SLAB_CACHE_MAGDEFERRED);
     925        }
     926
    890927#ifdef CONFIG_DEBUG
    891928        _slab_initialized = 1;
     
    924961}
    925962
     963void *malloc(size_t size)
     964{
     965        assert(_slab_initialized);
     966        assert(size <= (1 << SLAB_MAX_MALLOC_W));
     967
     968        if (size < (1 << SLAB_MIN_MALLOC_W))
     969                size = (1 << SLAB_MIN_MALLOC_W);
     970
     971        uint8_t idx = fnzb(size - 1) - SLAB_MIN_MALLOC_W + 1;
     972
     973        return slab_alloc(malloc_caches[idx], FRAME_ATOMIC);
     974}
     975
     976void *realloc(void *ptr, size_t size)
     977{
     978        assert(_slab_initialized);
     979        assert(size <= (1 << SLAB_MAX_MALLOC_W));
     980
     981        void *new_ptr;
     982
     983        if (size > 0) {
     984                if (size < (1 << SLAB_MIN_MALLOC_W))
     985                        size = (1 << SLAB_MIN_MALLOC_W);
     986                uint8_t idx = fnzb(size - 1) - SLAB_MIN_MALLOC_W + 1;
     987
     988                new_ptr = slab_alloc(malloc_caches[idx], FRAME_ATOMIC);
     989        } else
     990                new_ptr = NULL;
     991
     992        if ((new_ptr != NULL) && (ptr != NULL)) {
     993                slab_t *slab = obj2slab(ptr);
     994                memcpy(new_ptr, ptr, min(size, slab->cache->size));
     995        }
     996
     997        if (ptr != NULL)
     998                free(ptr);
     999
     1000        return new_ptr;
     1001}
     1002
     1003void free(void *ptr)
     1004{
     1005        if (!ptr)
     1006                return;
     1007
     1008        slab_t *slab = obj2slab(ptr);
     1009        _slab_free(slab->cache, ptr, slab);
     1010}
     1011
    9261012/** @}
    9271013 */
Note: See TracChangeset for help on using the changeset viewer.