Changeset 3f03199 in mainline for uspace/lib/c/generic
- Timestamp:
- 2013-09-15T06:33:53Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9348862
- Parents:
- dd7078c (diff), 1c0cef0 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace/lib/c/generic
- Files:
-
- 2 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/adt/hash_table.c
rdd7078c r3f03199 227 227 228 228 /* Check for duplicates. */ 229 list_foreach(h->bucket[idx], cur) {229 list_foreach(h->bucket[idx], link, ht_link_t, cur_link) { 230 230 /* 231 231 * We could filter out items using their hashes first, but 232 232 * calling equal() might very well be just as fast. 233 233 */ 234 ht_link_t *cur_link = member_to_inst(cur, ht_link_t, link);235 234 if (h->op->equal(cur_link, item)) 236 235 return false; … … 258 257 size_t idx = h->op->key_hash(key) % h->bucket_cnt; 259 258 260 list_foreach(h->bucket[idx], cur) { 261 ht_link_t *cur_link = member_to_inst(cur, ht_link_t, link); 259 list_foreach(h->bucket[idx], link, ht_link_t, cur_link) { 262 260 /* 263 261 * Is this is the item we are looking for? We could have first -
uspace/lib/c/generic/adt/list.c
rdd7078c r3f03199 102 102 unsigned int count = 0; 103 103 104 list_foreach(*list, link) { 104 link_t *link = list_first(list); 105 while (link != NULL) { 105 106 count++; 107 link = list_next(link, list); 106 108 } 107 109 -
uspace/lib/c/generic/cfg.c
rdd7078c r3f03199 83 83 return true; 84 84 85 list_foreach(data->sections, link) { 86 const cfg_section_t *section = cfg_section_instance(link); 87 85 cfg_file_foreach(data, section) { 88 86 if (!list_empty(§ion->entries)) 89 87 return false; … … 413 411 const cfg_section_t *cfg_find_section(const cfg_file_t *data, const char *title) 414 412 { 415 list_foreach(data->sections, link) { 416 const cfg_section_t *section = cfg_section_instance(link); 417 413 cfg_file_foreach(data, section) { 418 414 if (str_cmp(section->title, title) == 0) 419 415 return section; … … 434 430 const char *cfg_find_value(const cfg_section_t *section, const char *key) 435 431 { 436 list_foreach(section->entries, link) { 437 const cfg_entry_t *entry = cfg_entry_instance(link); 438 432 cfg_section_foreach(section, entry) { 439 433 if (str_cmp(entry->key, key) == 0) 440 434 return entry->value; -
uspace/lib/c/generic/ddi.c
rdd7078c r3f03199 42 42 #include <ddi.h> 43 43 #include <libarch/ddi.h> 44 #include <device/hw_res.h> 45 #include <device/hw_res_parsed.h> 46 #include <device/pio_window.h> 44 47 #include <libc.h> 45 48 #include <task.h> … … 76 79 * 77 80 */ 78 int physmem_map( void *phys, size_t pages, unsigned int flags, void **virt)81 int physmem_map(uintptr_t phys, size_t pages, unsigned int flags, void **virt) 79 82 { 80 83 return __SYSCALL5(SYS_PHYSMEM_MAP, (sysarg_t) phys, … … 83 86 84 87 int dmamem_map(void *virt, size_t size, unsigned int map_flags, 85 unsigned int flags, void **phys)88 unsigned int flags, uintptr_t *phys) 86 89 { 87 90 return (int) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size, … … 90 93 } 91 94 92 int dmamem_map_anonymous(size_t size, unsigned int map_flags, 93 unsigned int flags, void **phys, void **virt) 94 { 95 int dmamem_map_anonymous(size_t size, uintptr_t constraint, 96 unsigned int map_flags, unsigned int flags, uintptr_t *phys, void **virt) 97 { 98 *phys = constraint; 99 95 100 return (int) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size, 96 101 (sysarg_t) map_flags, (sysarg_t) flags | DMAMEM_FLAGS_ANONYMOUS, … … 132 137 133 138 return __SYSCALL1(SYS_IOSPACE_ENABLE, (sysarg_t) &arg); 139 } 140 141 /** Enable PIO for specified address range. 142 * 143 * @param range I/O range to be enable. 144 * @param virt Virtual address for application's PIO operations. 145 */ 146 int pio_enable_range(addr_range_t *range, void **virt) 147 { 148 return pio_enable(RNGABSPTR(*range), RNGSZ(*range), virt); 149 } 150 151 /** Enable PIO for specified HW resource wrt. to the PIO window. 152 * 153 * @param win PIO window. May be NULL if the resources are known to be 154 * absolute. 155 * @param res Resources specifying the I/O range wrt. to the PIO window. 156 * @param virt Virtual address for application's PIO operations. 157 * 158 * @return EOK on success. 159 * @return Negative error code on failure. 160 * 161 */ 162 int pio_enable_resource(pio_window_t *win, hw_resource_t *res, void **virt) 163 { 164 uintptr_t addr; 165 size_t size; 166 167 switch (res->type) { 168 case IO_RANGE: 169 addr = res->res.io_range.address; 170 if (res->res.io_range.relative) { 171 if (!win) 172 return EINVAL; 173 addr += win->io.base; 174 } 175 size = res->res.io_range.size; 176 break; 177 case MEM_RANGE: 178 addr = res->res.mem_range.address; 179 if (res->res.mem_range.relative) { 180 if (!win) 181 return EINVAL; 182 addr += win->mem.base; 183 } 184 size = res->res.mem_range.size; 185 break; 186 default: 187 return EINVAL; 188 } 189 190 return pio_enable((void *) addr, size, virt); 134 191 } 135 192 … … 158 215 if (!virt) 159 216 return EINVAL; 160 161 void *phys_frame =162 (void *)ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE);163 size_t offset = pio_addr - phys_frame;217 218 uintptr_t phys_frame = 219 ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE); 220 size_t offset = (uintptr_t) pio_addr - phys_frame; 164 221 size_t pages = SIZE2PAGES(offset + size); 165 222 -
uspace/lib/c/generic/device/hw_res.c
rdd7078c r3f03199 42 42 { 43 43 sysarg_t count = 0; 44 44 45 45 async_exch_t *exch = async_exchange_begin(sess); 46 if (exch == NULL) 47 return ENOMEM; 46 48 47 int rc = async_req_1_1(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE), 49 48 HW_RES_GET_RESOURCE_LIST, &count); 50 49 51 50 if (rc != EOK) { 52 51 async_exchange_end(exch); 53 52 return rc; 54 53 } 55 54 56 55 size_t size = count * sizeof(hw_resource_t); 57 56 hw_resource_t *resources = (hw_resource_t *) malloc(size); … … 61 60 return ENOMEM; 62 61 } 63 62 64 63 rc = async_data_read_start(exch, resources, size); 65 64 async_exchange_end(exch); 66 65 67 66 if (rc != EOK) { 68 67 free(resources); 69 68 return rc; 70 69 } 71 70 72 71 hw_resources->resources = resources; 73 72 hw_resources->count = count; 74 73 75 74 return EOK; 76 75 } … … 79 78 { 80 79 async_exch_t *exch = async_exchange_begin(sess); 81 if (exch == NULL) 82 return false; 80 83 81 int rc = async_req_1_0(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE), 84 82 HW_RES_ENABLE_INTERRUPT); 85 83 async_exchange_end(exch); 86 84 87 85 return (rc == EOK); 88 86 } 89 87 90 /** 91 * Setup DMA channel to specified place and mode.92 * @param channel DMA Channel 1,2,3 for 8 bit transfers, 5,6,7 for 16 bit.93 * @param pa Physical address of the buffer. Must be < 16MB for 16 bit and < 1MB94 * for 8 bit transfers.95 * @param size DMA buffer size, limited to 64K.96 * @param mode Mode of the DMA channel:97 * - Read or Write98 * - Allow automatic reset99 * - Use address decrement instead of increment100 * - Use SINGLE/BLOCK/ON DEMAND transfer mode88 /** Setup DMA channel to specified place and mode. 89 * 90 * @param channel DMA channel. 91 * @param pa Physical address of the buffer. 92 * @param size DMA buffer size. 93 * @param mode Mode of the DMA channel: 94 * - Read or Write 95 * - Allow automatic reset 96 * - Use address decrement instead of increment 97 * - Use SINGLE/BLOCK/ON DEMAND transfer mode 98 * 101 99 * @return Error code. 100 * 102 101 */ 103 102 int hw_res_dma_channel_setup(async_sess_t *sess, … … 105 104 { 106 105 async_exch_t *exch = async_exchange_begin(sess); 107 if (exch == NULL) 108 return ENOMEM; 106 109 107 const uint32_t packed = (channel & 0xffff) | (mode << 16); 110 108 const int ret = async_req_4_0(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE), 111 109 HW_RES_DMA_CHANNEL_SETUP, packed, pa, size); 110 112 111 async_exchange_end(exch); 113 112 114 113 return ret; 115 114 } 116 115 117 /** 118 * Query remaining bytes in the buffer. 119 * @param channel DMA Channel 1,2,3 for 8 bit transfers, 5,6,7 for 16 bit. 120 * @return Number of bytes remaining in the buffer(>=0) or error code(<0). 116 /** Query remaining bytes in the buffer. 117 * 118 * @param channel DMA channel. 119 * 120 * @return Number of bytes remaining in the buffer if positive. 121 * @return Error code if negative. 122 * 121 123 */ 122 124 int hw_res_dma_channel_remain(async_sess_t *sess, unsigned channel) 123 125 { 124 126 async_exch_t *exch = async_exchange_begin(sess); 125 if (exch == NULL) 126 return ENOMEM; 127 127 128 sysarg_t remain; 128 129 const int ret = async_req_2_1(exch, DEV_IFACE_ID(HW_RES_DEV_IFACE), 129 130 HW_RES_DMA_CHANNEL_REMAIN, channel, &remain); 131 130 132 async_exchange_end(exch); 133 131 134 if (ret == EOK) 132 135 return remain; 136 133 137 return ret; 134 138 } -
uspace/lib/c/generic/device/hw_res_parsed.c
rdd7078c r3f03199 80 80 } 81 81 82 static uint64_t absolutize(uint64_t addr, bool relative, uint64_t base) 83 { 84 if (!relative) 85 return addr; 86 else 87 return addr + base; 88 } 89 90 static uint64_t relativize(uint64_t addr, bool relative, uint64_t base) 91 { 92 if (relative) 93 return addr; 94 else 95 return addr - base; 96 } 97 82 98 static void hw_res_parse_add_io_range(hw_res_list_parsed_t *out, 83 const hw_resource_t *res, int flags) 84 { 99 const pio_window_t *win, const hw_resource_t *res, int flags) 100 { 101 endianness_t endianness; 102 uint64_t absolute; 103 uint64_t relative; 104 size_t size; 105 85 106 assert(res && (res->type == IO_RANGE)); 86 107 87 uint64_t address = res->res.io_range.address; 88 endianness_t endianness = res->res.io_range.endianness; 89 size_t size = res->res.io_range.size; 108 absolute = absolutize(res->res.io_range.address, 109 res->res.io_range.relative, win->io.base); 110 relative = relativize(res->res.io_range.address, 111 res->res.io_range.relative, win->io.base); 112 size = res->res.io_range.size; 113 endianness = res->res.io_range.endianness; 90 114 91 115 if ((size == 0) && (!(flags & HW_RES_KEEP_ZERO_AREA))) … … 97 121 if (!keep_duplicit) { 98 122 for (size_t i = 0; i < count; i++) { 99 uint64_t s_address = out->io_ranges.ranges[i].address; 100 size_t s_size = out->io_ranges.ranges[i].size; 123 uint64_t s_address; 124 size_t s_size; 125 126 s_address = RNGABS(out->io_ranges.ranges[i]); 127 s_size = RNGSZ(out->io_ranges.ranges[i]); 101 128 102 if ((address == s_address) && (size == s_size)) 103 return; 104 } 105 } 106 107 out->io_ranges.ranges[count].address = address; 129 if ((absolute == s_address) && (size == s_size)) 130 return; 131 } 132 } 133 134 RNGABS(out->io_ranges.ranges[count]) = absolute; 135 RNGREL(out->io_ranges.ranges[count]) = relative; 136 RNGSZ(out->io_ranges.ranges[count]) = size; 108 137 out->io_ranges.ranges[count].endianness = endianness; 109 out->io_ranges.ranges[count].size = size;110 138 out->io_ranges.count++; 111 139 } 112 140 113 141 static void hw_res_parse_add_mem_range(hw_res_list_parsed_t *out, 114 const hw_resource_t *res, int flags) 115 { 142 const pio_window_t *win, const hw_resource_t *res, int flags) 143 { 144 endianness_t endianness; 145 uint64_t absolute; 146 uint64_t relative; 147 size_t size; 148 116 149 assert(res && (res->type == MEM_RANGE)); 117 150 118 uint64_t address = res->res.mem_range.address; 119 endianness_t endianness = res->res.mem_range.endianness; 120 size_t size = res->res.mem_range.size; 151 absolute = absolutize(res->res.mem_range.address, 152 res->res.mem_range.relative, win->mem.base); 153 relative = relativize(res->res.mem_range.address, 154 res->res.mem_range.relative, win->mem.base); 155 size = res->res.mem_range.size; 156 endianness = res->res.mem_range.endianness; 121 157 122 158 if ((size == 0) && (!(flags & HW_RES_KEEP_ZERO_AREA))) … … 128 164 if (!keep_duplicit) { 129 165 for (size_t i = 0; i < count; ++i) { 130 uint64_t s_address = out->mem_ranges.ranges[i].address; 131 size_t s_size = out->mem_ranges.ranges[i].size; 166 uint64_t s_address; 167 size_t s_size; 168 169 s_address = RNGABS(out->mem_ranges.ranges[i]);; 170 s_size = RNGSZ(out->mem_ranges.ranges[i]); 132 171 133 if ((address == s_address) && (size == s_size)) 134 return; 135 } 136 } 137 138 out->mem_ranges.ranges[count].address = address; 172 if ((absolute == s_address) && (size == s_size)) 173 return; 174 } 175 } 176 177 RNGABS(out->mem_ranges.ranges[count]) = absolute; 178 RNGREL(out->mem_ranges.ranges[count]) = relative; 179 RNGSZ(out->mem_ranges.ranges[count]) = size; 139 180 out->mem_ranges.ranges[count].endianness = endianness; 140 out->mem_ranges.ranges[count].size = size;141 181 out->mem_ranges.count++; 142 182 } … … 144 184 /** Parse list of hardware resources 145 185 * 146 * @param hw_resources Original structure resource147 * @param [out] out Output parsed resources148 * @param flags Flags of the parsing.149 * HW_RES_KEEP_ZERO_AREA for keeping150 * zero-size areas, HW_RES_KEEP_DUPLICITIES151 * for keep duplicit areas186 * @param win PIO window. 187 * @param res Original structure resource. 188 * @param[out] out Output parsed resources. 189 * @param flags Flags of the parsing: 190 * HW_RES_KEEP_ZERO_AREA for keeping zero-size areas, 191 * HW_RES_KEEP_DUPLICITIES to keep duplicit areas. 152 192 * 153 193 * @return EOK if succeed, error code otherwise. 154 194 * 155 195 */ 156 int hw_res_list_parse(const hw_resource_list_t *hw_resources,157 hw_res_list_parsed_t *out, int flags)158 { 159 if ( (!hw_resources) || (!out))196 int hw_res_list_parse(const pio_window_t *win, 197 const hw_resource_list_t *res, hw_res_list_parsed_t *out, int flags) 198 { 199 if (!res || !out) 160 200 return EINVAL; 161 201 162 size_t res_count = hw_resources->count;202 size_t res_count = res->count; 163 203 hw_res_list_parsed_clean(out); 164 204 … … 174 214 175 215 for (size_t i = 0; i < res_count; ++i) { 176 const hw_resource_t *resource = & (hw_resources->resources[i]);177 216 const hw_resource_t *resource = &res->resources[i]; 217 178 218 switch (resource->type) { 179 219 case INTERRUPT: … … 181 221 break; 182 222 case IO_RANGE: 183 hw_res_parse_add_io_range(out, resource, flags);223 hw_res_parse_add_io_range(out, win, resource, flags); 184 224 break; 185 225 case MEM_RANGE: 186 hw_res_parse_add_mem_range(out, resource, flags);226 hw_res_parse_add_mem_range(out, win, resource, flags); 187 227 break; 188 228 case DMA_CHANNEL_8: … … 195 235 } 196 236 } 197 237 198 238 return EOK; 199 239 }; … … 216 256 hw_res_list_parsed_t *hw_res_parsed, int flags) 217 257 { 258 pio_window_t pio_window; 259 int rc; 260 218 261 if (!hw_res_parsed) 219 262 return EBADMEM; … … 222 265 hw_res_list_parsed_clean(hw_res_parsed); 223 266 memset(&hw_resources, 0, sizeof(hw_resource_list_t)); 224 225 int rc = hw_res_get_resource_list(sess, &hw_resources); 267 268 rc = pio_window_get(sess, &pio_window); 269 if (rc != EOK) 270 return rc; 271 272 rc = hw_res_get_resource_list(sess, &hw_resources); 226 273 if (rc != EOK) 227 274 return rc; 228 229 rc = hw_res_list_parse(&hw_resources, hw_res_parsed, flags); 275 276 rc = hw_res_list_parse(&pio_window, &hw_resources, hw_res_parsed, 277 flags); 230 278 hw_res_clean_resource_list(&hw_resources); 231 279 -
uspace/lib/c/generic/devman.c
rdd7078c r3f03199 1 1 /* 2 2 * Copyright (c) 2007 Josef Cejka 3 * Copyright (c) 201 1Jiri Svoboda3 * Copyright (c) 2013 Jiri Svoboda 4 4 * Copyright (c) 2010 Lenka Trochtova 5 5 * All rights reserved. … … 230 230 } 231 231 232 match_id_t *match_id = NULL; 233 234 list_foreach(match_ids->ids, link) { 235 match_id = list_get_instance(link, match_id_t, link); 236 232 list_foreach(match_ids->ids, link, match_id_t, match_id) { 237 233 ipc_call_t answer2; 238 234 aid_t req2 = async_send_1(exch, DEVMAN_ADD_MATCH_ID, … … 405 401 } 406 402 407 static int devman_get_str_internal(sysarg_t method, sysarg_t arg1, char *buf,408 s ize_t buf_size)403 static int devman_get_str_internal(sysarg_t method, sysarg_t arg1, 404 sysarg_t arg2, sysarg_t *r1, char *buf, size_t buf_size) 409 405 { 410 406 async_exch_t *exch; … … 416 412 417 413 ipc_call_t answer; 418 aid_t req = async_send_ 1(exch, method, arg1, &answer);414 aid_t req = async_send_2(exch, method, arg1, arg2, &answer); 419 415 aid_t dreq = async_data_read(exch, buf, buf_size - 1, &dreply); 420 416 async_wait_for(dreq, &dretval); … … 434 430 } 435 431 432 if (r1 != NULL) 433 *r1 = IPC_GET_ARG1(answer); 436 434 act_size = IPC_GET_ARG2(dreply); 437 435 assert(act_size <= buf_size - 1); … … 443 441 int devman_fun_get_path(devman_handle_t handle, char *buf, size_t buf_size) 444 442 { 445 return devman_get_str_internal(DEVMAN_FUN_GET_PATH, handle, buf, 446 buf_size); 443 return devman_get_str_internal(DEVMAN_FUN_GET_PATH, handle, 0, NULL, 444 buf, buf_size); 445 } 446 447 int devman_fun_get_match_id(devman_handle_t handle, size_t index, char *buf, 448 size_t buf_size, unsigned int *rscore) 449 { 450 int rc; 451 sysarg_t score = 0; 452 453 rc = devman_get_str_internal(DEVMAN_FUN_GET_MATCH_ID, handle, index, 454 &score, buf, buf_size); 455 if (rc != EOK) 456 return rc; 457 458 *rscore = score; 459 return rc; 447 460 } 448 461 449 462 int devman_fun_get_name(devman_handle_t handle, char *buf, size_t buf_size) 450 463 { 451 return devman_get_str_internal(DEVMAN_FUN_GET_NAME, handle, buf,452 buf _size);464 return devman_get_str_internal(DEVMAN_FUN_GET_NAME, handle, 0, NULL, 465 buf, buf_size); 453 466 } 454 467 455 468 int devman_fun_get_driver_name(devman_handle_t handle, char *buf, size_t buf_size) 456 469 { 457 return devman_get_str_internal(DEVMAN_FUN_GET_DRIVER_NAME, handle, buf,458 buf_size);470 return devman_get_str_internal(DEVMAN_FUN_GET_DRIVER_NAME, handle, 0, 471 NULL, buf, buf_size); 459 472 } 460 473 … … 583 596 } 584 597 598 int devman_dev_get_parent(devman_handle_t devh, devman_handle_t *funh) 599 { 600 async_exch_t *exch = devman_exchange_begin(DEVMAN_CLIENT); 601 if (exch == NULL) 602 return ENOMEM; 603 604 sysarg_t retval = async_req_1_1(exch, DEVMAN_DEV_GET_PARENT, 605 devh, funh); 606 607 devman_exchange_end(exch); 608 return (int) retval; 609 } 610 585 611 int devman_fun_sid_to_handle(service_id_t sid, devman_handle_t *handle) 586 612 { … … 596 622 } 597 623 624 int devman_get_drivers(devman_handle_t **drvs, 625 size_t *count) 626 { 627 return devman_get_handles_internal(DEVMAN_GET_DRIVERS, 0, drvs, count); 628 } 629 630 int devman_driver_get_devices(devman_handle_t drvh, devman_handle_t **devs, 631 size_t *count) 632 { 633 return devman_get_handles_internal(DEVMAN_DRIVER_GET_DEVICES, 634 drvh, devs, count); 635 } 636 637 int devman_driver_get_handle(const char *drvname, devman_handle_t *handle) 638 { 639 async_exch_t *exch; 640 641 exch = devman_exchange_begin(DEVMAN_CLIENT); 642 if (exch == NULL) 643 return ENOMEM; 644 645 ipc_call_t answer; 646 aid_t req = async_send_0(exch, DEVMAN_DRIVER_GET_HANDLE, &answer); 647 sysarg_t retval = async_data_write_start(exch, drvname, 648 str_size(drvname)); 649 650 devman_exchange_end(exch); 651 652 if (retval != EOK) { 653 async_forget(req); 654 return retval; 655 } 656 657 async_wait_for(req, &retval); 658 659 if (retval != EOK) { 660 if (handle != NULL) 661 *handle = (devman_handle_t) -1; 662 663 return retval; 664 } 665 666 if (handle != NULL) 667 *handle = (devman_handle_t) IPC_GET_ARG1(answer); 668 669 return retval; 670 } 671 672 int devman_driver_get_match_id(devman_handle_t handle, size_t index, char *buf, 673 size_t buf_size, unsigned int *rscore) 674 { 675 int rc; 676 sysarg_t score = 0; 677 678 rc = devman_get_str_internal(DEVMAN_DRIVER_GET_MATCH_ID, handle, index, 679 &score, buf, buf_size); 680 if (rc != EOK) 681 return rc; 682 683 *rscore = score; 684 return rc; 685 } 686 687 int devman_driver_get_name(devman_handle_t handle, char *buf, size_t buf_size) 688 { 689 return devman_get_str_internal(DEVMAN_DRIVER_GET_NAME, handle, 0, NULL, 690 buf, buf_size); 691 } 692 693 int devman_driver_get_state(devman_handle_t drvh, driver_state_t *rstate) 694 { 695 sysarg_t state; 696 async_exch_t *exch = devman_exchange_begin(DEVMAN_CLIENT); 697 if (exch == NULL) 698 return ENOMEM; 699 700 int rc = async_req_1_1(exch, DEVMAN_DRIVER_GET_STATE, drvh, 701 &state); 702 703 devman_exchange_end(exch); 704 if (rc != EOK) 705 return rc; 706 707 *rstate = state; 708 return rc; 709 } 710 711 int devman_driver_load(devman_handle_t drvh) 712 { 713 async_exch_t *exch = devman_exchange_begin(DEVMAN_CLIENT); 714 if (exch == NULL) 715 return ENOMEM; 716 717 int rc = async_req_1_0(exch, DEVMAN_DRIVER_LOAD, drvh); 718 719 devman_exchange_end(exch); 720 return rc; 721 } 722 598 723 /** @} 599 724 */ -
uspace/lib/c/generic/futex.c
rdd7078c r3f03199 35 35 #include <futex.h> 36 36 #include <atomic.h> 37 #include <libarch/barrier.h> 37 38 #include <libc.h> 38 39 #include <sys/types.h> … … 59 60 int futex_trydown(futex_t *futex) 60 61 { 61 return cas(futex, 1, 0); 62 int rc; 63 64 rc = cas(futex, 1, 0); 65 CS_ENTER_BARRIER(); 66 67 return rc; 62 68 } 63 69 … … 73 79 int futex_down(futex_t *futex) 74 80 { 75 if ((atomic_signed_t) atomic_predec(futex) < 0) 81 atomic_signed_t nv; 82 83 nv = (atomic_signed_t) atomic_predec(futex); 84 CS_ENTER_BARRIER(); 85 if (nv < 0) 76 86 return __SYSCALL1(SYS_FUTEX_SLEEP, (sysarg_t) &futex->count); 77 87 … … 89 99 int futex_up(futex_t *futex) 90 100 { 101 CS_LEAVE_BARRIER(); 102 91 103 if ((atomic_signed_t) atomic_postinc(futex) < 0) 92 104 return __SYSCALL1(SYS_FUTEX_WAKEUP, (sysarg_t) &futex->count); -
uspace/lib/c/generic/inet.c
rdd7078c r3f03199 111 111 112 112 ipc_call_t answer; 113 aid_t req = async_send_ 3(exch, INET_SEND, dgram->tos, ttl, df,114 &answer);113 aid_t req = async_send_4(exch, INET_SEND, dgram->iplink, dgram->tos, 114 ttl, df, &answer); 115 115 116 116 int rc = async_data_write_start(exch, &dgram->src, sizeof(inet_addr_t)); -
uspace/lib/c/generic/inet/addr.c
rdd7078c r3f03199 47 47 #error The architecture must be either big-endian or little-endian. 48 48 #endif 49 50 const addr32_t addr32_broadcast_all_hosts = 0xffffffff; 49 51 50 52 const addr48_t addr48_broadcast = { -
uspace/lib/c/generic/io/asprintf.c
rdd7078c r3f03199 50 50 } 51 51 52 int vprintf_size(const char *fmt, va_list args) 53 { 54 printf_spec_t ps = { 55 asprintf_str_write, 56 asprintf_wstr_write, 57 NULL 58 }; 59 60 return printf_core(fmt, &ps, args); 61 } 62 63 int printf_size(const char *fmt, ...) 64 { 65 va_list args; 66 va_start(args, fmt); 67 int ret = vprintf_size(fmt, args); 68 va_end(args); 69 70 return ret; 71 } 72 52 73 /** Allocate and print to string. 53 74 * … … 61 82 int asprintf(char **strp, const char *fmt, ...) 62 83 { 63 printf_spec_t ps = {64 asprintf_str_write,65 asprintf_wstr_write,66 NULL67 };68 69 84 va_list args; 70 85 va_start(args, fmt); 71 72 int ret = printf_core(fmt, &ps, args); 86 int ret = vprintf_size(fmt, args); 73 87 va_end(args); 74 88 -
uspace/lib/c/generic/net/socket_client.c
rdd7078c r3f03199 923 923 * message. 924 924 */ 925 int send(int socket_id, void *data, size_t datalength, int flags)925 int send(int socket_id, const void *data, size_t datalength, int flags) 926 926 { 927 927 /* Without the address */ -
uspace/lib/c/generic/pio_trace.c
rdd7078c r3f03199 95 95 pio_regions_t *regions = get_regions(); 96 96 fibril_rwlock_read_lock(®ions->guard); 97 list_foreach(regions->list, it) { 98 assert(it); 99 region_t *reg = region_instance(it); 100 assert(reg); 97 list_foreach(regions->list, link, region_t, reg) { 101 98 if ((r >= reg->base) && (r < reg->base + reg->size)) { 102 99 if (reg->log) … … 131 128 fibril_rwlock_write_lock(®ions->guard); 132 129 list_foreach_safe(regions->list, it, next) { 133 assert(it);134 130 region_t *reg = region_instance(it); 135 assert(reg);136 131 if (r >= reg->base && (r < reg->base + reg->size)) { 137 138 132 list_remove(®->link); 133 region_destroy(reg); 139 134 } 140 135 } -
uspace/lib/c/generic/time.c
rdd7078c r3f03199 556 556 557 557 void *addr; 558 rc = physmem_map( (void *) faddr, 1,559 AS_AREA_READ | AS_AREA_CACHEABLE,&addr);558 rc = physmem_map(faddr, 1, AS_AREA_READ | AS_AREA_CACHEABLE, 559 &addr); 560 560 if (rc != EOK) { 561 561 as_area_destroy(addr); -
uspace/lib/c/generic/vfs/vfs.c
rdd7078c r3f03199 43 43 #include <stdio.h> 44 44 #include <sys/stat.h> 45 #include <sys/statfs.h> 45 46 #include <sys/types.h> 46 47 #include <ipc/services.h> … … 892 893 } 893 894 895 int statfs(const char *path, struct statfs *statfs) 896 { 897 sysarg_t rc; 898 sysarg_t rc_orig; 899 aid_t req; 900 size_t pa_size; 901 902 char *pa = absolutize(path, &pa_size); 903 if (!pa) 904 return ENOMEM; 905 async_exch_t *exch = vfs_exchange_begin(); 906 907 req = async_send_0(exch, VFS_IN_STATFS, NULL); 908 rc = async_data_write_start(exch, pa, pa_size); 909 if (rc != EOK) { 910 vfs_exchange_end(exch); 911 free(pa); 912 async_wait_for(req, &rc_orig); 913 if (rc_orig == EOK) 914 return (int) rc; 915 else 916 return (int) rc_orig; 917 } 918 rc = async_data_read_start(exch, (void *) statfs, sizeof(struct statfs)); 919 if (rc != EOK) { 920 vfs_exchange_end(exch); 921 free(pa); 922 async_wait_for(req, &rc_orig); 923 if (rc_orig == EOK) 924 return (int) rc; 925 else 926 return (int) rc_orig; 927 } 928 vfs_exchange_end(exch); 929 free(pa); 930 async_wait_for(req, &rc); 931 return rc; 932 } 933 894 934 /** @} 895 935 */
Note:
See TracChangeset
for help on using the changeset viewer.