Changes in uspace/srv/bd/rd/rd.c [d9fae235:08232ee] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/rd/rd.c

    rd9fae235 r08232ee  
    3232/** @addtogroup rd
    3333 * @{
    34  */
     34 */ 
    3535
    3636/**
    37  * @file rd.c
    38  * @brief Initial RAM disk for HelenOS.
     37 * @file        rd.c
     38 * @brief       Initial RAM disk for HelenOS.
    3939 */
    4040
     
    6161/** Pointer to the ramdisk's image */
    6262static void *rd_addr;
    63 
    6463/** Size of the ramdisk */
    6564static size_t rd_size;
     
    7170static int rd_write_blocks(uint64_t ba, size_t cnt, const void *buf);
    7271
    73 /** This rwlock protects the ramdisk's data.
    74  *
     72/**
     73 * This rwlock protects the ramdisk's data.
    7574 * If we were to serve multiple requests (read + write or several writes)
    76  * concurrently (i.e. from two or more threads), each read and write needs to
    77  * be protected by this rwlock.
    78  *
    79  */
     75 * concurrently (i.e. from two or more threads), each read and write needs to be
     76 * protected by this rwlock.
     77 */
    8078fibril_rwlock_t rd_lock;
    8179
    8280/** Handle one connection to ramdisk.
    8381 *
    84  * @param iid   Hash of the request that opened the connection.
    85  * @param icall Call data of the request that opened the connection.
     82 * @param iid           Hash of the request that opened the connection.
     83 * @param icall         Call data of the request that opened the connection.
    8684 */
    8785static void rd_connection(ipc_callid_t iid, ipc_call_t *icall)
     
    9492        size_t cnt;
    9593        size_t comm_size;
    96        
     94
    9795        /*
    9896         * Answer the first IPC_M_CONNECT_ME_TO call.
    9997         */
    10098        ipc_answer_0(iid, EOK);
    101        
     99
    102100        /*
    103101         * Now we wait for the client to send us its communication as_area.
     
    110108                } else {
    111109                        ipc_answer_0(callid, EHANGUP);
    112                         return;
     110                        return;         
    113111                }
    114112        } else {
     
    180178                return ELIMIT;
    181179        }
    182        
     180
    183181        fibril_rwlock_read_lock(&rd_lock);
    184182        memcpy(buf, rd_addr + ba * block_size, block_size * cnt);
    185183        fibril_rwlock_read_unlock(&rd_lock);
    186        
     184
    187185        return EOK;
    188186}
     
    195193                return ELIMIT;
    196194        }
    197        
     195
    198196        fibril_rwlock_write_lock(&rd_lock);
    199197        memcpy(rd_addr + ba * block_size, buf, block_size * cnt);
    200198        fibril_rwlock_write_unlock(&rd_lock);
    201        
     199
    202200        return EOK;
    203201}
     
    206204static bool rd_init(void)
    207205{
    208         int ret = sysinfo_get_value("rd.size", &rd_size);
    209         if ((ret != EOK) || (rd_size == 0)) {
    210                 printf("%s: No RAM disk found\n", NAME);
    211                 return false;
    212         }
    213        
    214         sysarg_t rd_ph_addr;
    215         ret = sysinfo_get_value("rd.address.physical", &rd_ph_addr);
    216         if ((ret != EOK) || (rd_ph_addr == 0)) {
    217                 printf("%s: Invalid RAM disk physical address\n", NAME);
     206        rd_size = sysinfo_value("rd.size");
     207        void *rd_ph_addr = (void *) sysinfo_value("rd.address.physical");
     208       
     209        if (rd_size == 0) {
     210                printf(NAME ": No RAM disk found\n");
    218211                return false;
    219212        }
     
    222215       
    223216        int flags = AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE;
    224         int retval = physmem_map((void *) rd_ph_addr, rd_addr,
     217        int retval = physmem_map(rd_ph_addr, rd_addr,
    225218            ALIGN_UP(rd_size, PAGE_SIZE) >> PAGE_WIDTH, flags);
    226219       
    227220        if (retval < 0) {
    228                 printf("%s: Error mapping RAM disk\n", NAME);
    229                 return false;
    230         }
    231        
    232         printf("%s: Found RAM disk at %p, %d bytes\n", NAME, rd_ph_addr, rd_size);
     221                printf(NAME ": Error mapping RAM disk\n");
     222                return false;
     223        }
     224       
     225        printf(NAME ": Found RAM disk at %p, %d bytes\n", rd_ph_addr, rd_size);
    233226       
    234227        int rc = devmap_driver_register(NAME, rd_connection);
    235228        if (rc < 0) {
    236                 printf("%s: Unable to register driver (%d)\n", NAME, rc);
     229                printf(NAME ": Unable to register driver (%d)\n", rc);
    237230                return false;
    238231        }
     
    241234        if (devmap_device_register("bd/initrd", &dev_handle) != EOK) {
    242235                devmap_hangup_phone(DEVMAP_DRIVER);
    243                 printf("%s: Unable to register device\n", NAME);
     236                printf(NAME ": Unable to register device\n");
    244237                return false;
    245238        }
     
    252245int main(int argc, char **argv)
    253246{
    254         printf("%s: HelenOS RAM disk server\n", NAME);
     247        printf(NAME ": HelenOS RAM disk server\n");
    255248       
    256249        if (!rd_init())
    257250                return -1;
    258251       
    259         printf("%s: Accepting connections\n", NAME);
     252        printf(NAME ": Accepting connections\n");
    260253        async_manager();
    261254
Note: See TracChangeset for help on using the changeset viewer.