Changes in uspace/srv/bd/rd/rd.c [d9fae235:08232ee] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/rd/rd.c
rd9fae235 r08232ee 32 32 /** @addtogroup rd 33 33 * @{ 34 */ 34 */ 35 35 36 36 /** 37 * @file 38 * @brief 37 * @file rd.c 38 * @brief Initial RAM disk for HelenOS. 39 39 */ 40 40 … … 61 61 /** Pointer to the ramdisk's image */ 62 62 static void *rd_addr; 63 64 63 /** Size of the ramdisk */ 65 64 static size_t rd_size; … … 71 70 static int rd_write_blocks(uint64_t ba, size_t cnt, const void *buf); 72 71 73 /** This rwlock protects the ramdisk's data.74 * 72 /** 73 * This rwlock protects the ramdisk's data. 75 74 * 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 */ 80 78 fibril_rwlock_t rd_lock; 81 79 82 80 /** Handle one connection to ramdisk. 83 81 * 84 * @param iid 85 * @param icall 82 * @param iid Hash of the request that opened the connection. 83 * @param icall Call data of the request that opened the connection. 86 84 */ 87 85 static void rd_connection(ipc_callid_t iid, ipc_call_t *icall) … … 94 92 size_t cnt; 95 93 size_t comm_size; 96 94 97 95 /* 98 96 * Answer the first IPC_M_CONNECT_ME_TO call. 99 97 */ 100 98 ipc_answer_0(iid, EOK); 101 99 102 100 /* 103 101 * Now we wait for the client to send us its communication as_area. … … 110 108 } else { 111 109 ipc_answer_0(callid, EHANGUP); 112 return; 110 return; 113 111 } 114 112 } else { … … 180 178 return ELIMIT; 181 179 } 182 180 183 181 fibril_rwlock_read_lock(&rd_lock); 184 182 memcpy(buf, rd_addr + ba * block_size, block_size * cnt); 185 183 fibril_rwlock_read_unlock(&rd_lock); 186 184 187 185 return EOK; 188 186 } … … 195 193 return ELIMIT; 196 194 } 197 195 198 196 fibril_rwlock_write_lock(&rd_lock); 199 197 memcpy(rd_addr + ba * block_size, buf, block_size * cnt); 200 198 fibril_rwlock_write_unlock(&rd_lock); 201 199 202 200 return EOK; 203 201 } … … 206 204 static bool rd_init(void) 207 205 { 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"); 218 211 return false; 219 212 } … … 222 215 223 216 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, 225 218 ALIGN_UP(rd_size, PAGE_SIZE) >> PAGE_WIDTH, flags); 226 219 227 220 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); 233 226 234 227 int rc = devmap_driver_register(NAME, rd_connection); 235 228 if (rc < 0) { 236 printf( "%s: Unable to register driver (%d)\n", NAME, rc);229 printf(NAME ": Unable to register driver (%d)\n", rc); 237 230 return false; 238 231 } … … 241 234 if (devmap_device_register("bd/initrd", &dev_handle) != EOK) { 242 235 devmap_hangup_phone(DEVMAP_DRIVER); 243 printf( "%s: Unable to register device\n", NAME);236 printf(NAME ": Unable to register device\n"); 244 237 return false; 245 238 } … … 252 245 int main(int argc, char **argv) 253 246 { 254 printf( "%s: HelenOS RAM disk server\n", NAME);247 printf(NAME ": HelenOS RAM disk server\n"); 255 248 256 249 if (!rd_init()) 257 250 return -1; 258 251 259 printf( "%s: Accepting connections\n", NAME);252 printf(NAME ": Accepting connections\n"); 260 253 async_manager(); 261 254
Note:
See TracChangeset
for help on using the changeset viewer.