Changeset 7c34822e in mainline


Ignore:
Timestamp:
2006-11-30T15:38:45Z (18 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7bf7ef7
Parents:
8c19cf28
Message:

update rd

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/lib/rd.h

    r8c19cf28 r7c34822e  
    7676} rd_header;
    7777
    78 extern int init_rd(rd_header * addr);
     78extern int init_rd(rd_header * addr, size_t size);
    7979
    8080#endif
  • kernel/generic/src/lib/rd.c

    r8c19cf28 r7c34822e  
    4040#include <lib/rd.h>
    4141#include <arch/byteorder.h>
     42#include <mm/frame.h>
     43#include <sysinfo/sysinfo.h>
    4244
    43 int init_rd(rd_header * header)
     45int init_rd(rd_header * header, size_t size)
    4446{
    4547        /* Identify RAM disk */
     
    5153                return RE_UNSUPPORTED;
    5254       
    53         uint64_t hsize;
     55        uint32_t hsize;
     56        uint64_t dsize;
    5457        switch (header->data_type) {
    5558        case RD_DATA_LSB:
    56                 hsize = uint64_t_le2host(header->header_size);
     59                hsize = uint32_t_le2host(header->header_size);
     60                dsize = uint64_t_le2host(header->data_size);
    5761                break;
    58 //      case RD_DATA_MSB:
    59 //              hsize = uint64_t_be2host(header->header_size);
    60 //              break;
     62        case RD_DATA_MSB:
     63                hsize = uint32_t_be2host(header->header_size);
     64                dsize = uint64_t_le2host(header->data_size);
     65                break;
    6166        default:
    6267                return RE_UNSUPPORTED;
    6368        }
    64                
     69       
     70        if ((hsize % FRAME_SIZE) || (dsize % FRAME_SIZE))
     71                return RE_UNSUPPORTED;
     72       
     73        if (hsize > size)
     74                return RE_INVALID;
     75       
     76        if ((uint64_t) hsize + dsize > size)
     77                dsize = size - hsize;
     78       
     79        sysinfo_set_item_val("rd", NULL, true);
     80        sysinfo_set_item_val("rd.size", NULL, dsize);
     81        sysinfo_set_item_val("rd.address.physical", NULL, (unative_t) KA2PA((void *) header + hsize));
    6582
    6683        return RE_OK;
  • kernel/generic/src/main/kinit.c

    r8c19cf28 r7c34822e  
    181181                                ipc_phone_0 = &utask->answerbox;
    182182                } else {
    183                         int rd = init_rd((void *) init.tasks[i].addr);
     183                        int rd = init_rd((rd_header *) init.tasks[i].addr, init.tasks[i].size);
    184184                       
    185185                        if (rd != RE_OK)
  • uspace/libc/generic/sysinfo.c

    r8c19cf28 r7c34822e  
    3939sysarg_t sysinfo_value(char *name)
    4040{
    41         return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t ) name, (sysarg_t) strlen(name) );
     41        return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t ) name, (sysarg_t) strlen(name));
    4242}
    4343
    4444/** @}
    4545 */
    46  
    47  
  • uspace/rd/rd.c

    r8c19cf28 r7c34822e  
    3939#include <ipc/services.h>
    4040#include <ipc/ns.h>
     41#include <sysinfo.h>
     42#include <as.h>
     43#include <ddi.h>
     44#include <align.h>
     45#include <bool.h>
    4146#include <errno.h>
    4247#include <async.h>
     
    6570
    6671
     72static bool rd_init(void)
     73{
     74        size_t rd_size = sysinfo_value("rd.size");
     75        void * rd_ph_addr = (void *) sysinfo_value("rd.address.physical");
     76       
     77        if (rd_size == 0)
     78                return false;
     79       
     80        void * rd_addr = as_get_mappable_page(rd_size);
     81       
     82        map_physmem(rd_ph_addr, rd_addr, ALIGN_UP(rd_size, PAGE_SIZE) >> PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE);
     83       
     84        return true;
     85}
     86
     87
    6788int main(int argc, char **argv)
    6889{
    69         ipcarg_t phonead;
     90        if (rd_init()) {
     91                ipcarg_t phonead;
     92               
     93                async_set_client_connection(rd_connection);
     94               
     95                /* Register service at nameserver */
     96                if (ipc_connect_to_me(PHONE_NS, SERVICE_RD, 0, &phonead) != 0)
     97                        return -1;
     98               
     99                async_manager();
     100               
     101                /* Never reached */
     102                return 0;
     103        }
    70104       
    71         async_set_client_connection(rd_connection);
    72        
    73         /* Register service at nameserver */
    74         if (ipc_connect_to_me(PHONE_NS, SERVICE_RD, 0, &phonead) != 0)
    75                 return -1;
    76 
    77         async_manager();
    78 
    79         /* Never reached */
    80         return 0;
     105        return -1;
    81106}
    82107
Note: See TracChangeset for help on using the changeset viewer.