Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/lib/rd.c

    r32817cc rb366a6f4  
    3333/**
    3434 * @file
    35  * @brief RAM disk support.
     35 * @brief       RAM disk support.
    3636 *
    3737 * Support for RAM disk images.
     
    3939
    4040#include <lib/rd.h>
     41#include <byteorder.h>
    4142#include <mm/frame.h>
    4243#include <sysinfo/sysinfo.h>
    4344#include <ddi/ddi.h>
     45#include <align.h>
    4446
    45 /** Physical memory area for RAM disk. */
    46 static parea_t rd_parea;
     47static parea_t rd_parea;                /**< Physical memory area for rd. */
    4748
    48 /** RAM disk initialization routine
    49  *
    50  * The information about the RAM disk is provided as sysinfo
    51  * values to the uspace tasks.
    52  *
    53  */
    54 void init_rd(void *data, size_t size)
     49/**
     50 * RAM disk initialization routine. At this point, the RAM disk memory is shared
     51 * and information about the share is provided as sysinfo values to the
     52 * userspace tasks.
     53 */ 
     54int init_rd(rd_header_t *header, size_t size)
    5555{
    56         uintptr_t base = (uintptr_t) data;
    57         ASSERT((base % FRAME_SIZE) == 0);
     56        /* Identify RAM disk */
     57        if ((header->magic[0] != RD_MAG0) || (header->magic[1] != RD_MAG1) ||
     58            (header->magic[2] != RD_MAG2) || (header->magic[3] != RD_MAG3))
     59                return RE_INVALID;
    5860       
    59         rd_parea.pbase = base;
    60         rd_parea.frames = SIZE2FRAMES(size);
     61        /* Identify version */ 
     62        if (header->version != RD_VERSION)
     63                return RE_UNSUPPORTED;
     64       
     65        uint32_t hsize;
     66        uint64_t dsize;
     67        switch (header->data_type) {
     68        case RD_DATA_LSB:
     69                hsize = uint32_t_le2host(header->header_size);
     70                dsize = uint64_t_le2host(header->data_size);
     71                break;
     72        case RD_DATA_MSB:
     73                hsize = uint32_t_be2host(header->header_size);
     74                dsize = uint64_t_be2host(header->data_size);
     75                break;
     76        default:
     77                return RE_UNSUPPORTED;
     78        }
     79       
     80        if ((hsize % FRAME_SIZE) || (dsize % FRAME_SIZE))
     81                return RE_UNSUPPORTED;
     82               
     83        if (hsize > size)
     84                return RE_INVALID;
     85       
     86        if ((uint64_t) hsize + dsize > size)
     87                dsize = size - hsize;
     88       
     89        rd_parea.pbase = ALIGN_DOWN((uintptr_t) KA2PA((void *) header + hsize),
     90            FRAME_SIZE);
     91        rd_parea.frames = SIZE2FRAMES(dsize);
    6192        rd_parea.unpriv = false;
    6293        rd_parea.mapped = false;
    6394        ddi_parea_register(&rd_parea);
    64        
     95
    6596        sysinfo_set_item_val("rd", NULL, true);
    66         sysinfo_set_item_val("rd.size", NULL, size);
    67         sysinfo_set_item_val("rd.address.physical", NULL, (sysarg_t) base);
     97        sysinfo_set_item_val("rd.header_size", NULL, hsize);   
     98        sysinfo_set_item_val("rd.size", NULL, dsize);
     99        sysinfo_set_item_val("rd.address.physical", NULL,
     100            (sysarg_t) KA2PA((void *) header + hsize));
     101
     102        return RE_OK;
    68103}
    69104
Note: See TracChangeset for help on using the changeset viewer.