Changeset fbcdeb8 in mainline for uspace/lib/c
- Timestamp:
- 2011-12-19T17:30:39Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 58f6229
- Parents:
- 24cf31f1
- Location:
- uspace/lib/c
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/as.c
r24cf31f1 rfbcdeb8 45 45 /** Create address space area. 46 46 * 47 * @param address Virtual address where to place new address space area. 48 * @param size Size of the area. 49 * @param flags Flags describing type of the area. 47 * @param base Starting virtual address of the area. 48 * If set to (void *) -1, the kernel finds 49 * a mappable area. 50 * @param size Size of the area. 51 * @param flags Flags describing type of the area. 50 52 * 51 * @return address on success, (void *) -1 otherwise. 53 * @return Starting virtual address of the created area on success. 54 * @return (void *) -1 otherwise. 52 55 * 53 56 */ 54 void *as_area_create(void * address, size_t size, unsigned int flags)57 void *as_area_create(void *base, size_t size, unsigned int flags) 55 58 { 56 return (void *) __SYSCALL 3(SYS_AS_AREA_CREATE, (sysarg_t) address,57 (sysarg_t) size, (sysarg_t) flags );59 return (void *) __SYSCALL4(SYS_AS_AREA_CREATE, (sysarg_t) base, 60 (sysarg_t) size, (sysarg_t) flags, (sysarg_t) __entry); 58 61 } 59 62 … … 102 105 } 103 106 104 /** Return pointer to unmapped address space area105 *106 * @param size Requested size of the allocation.107 *108 * @return Pointer to the beginning of unmapped address space area.109 *110 */111 void *as_get_mappable_page(size_t size)112 {113 return (void *) __SYSCALL2(SYS_AS_GET_UNMAPPED_AREA,114 (sysarg_t) __entry, (sysarg_t) size);115 }116 117 107 /** Find mapping to physical address. 118 108 * -
uspace/lib/c/generic/async.c
r24cf31f1 rfbcdeb8 1998 1998 * 1999 1999 * @param exch Exchange for sending the message. 2000 * @param dst Destination address space area base.2001 2000 * @param size Size of the destination address space area. 2002 2001 * @param arg User defined argument. 2003 2002 * @param flags Storage for the received flags. Can be NULL. 2003 * @param dst Destination address space area base. Cannot be NULL. 2004 2004 * 2005 2005 * @return Zero on success or a negative error code from errno.h. 2006 2006 * 2007 2007 */ 2008 int async_share_in_start(async_exch_t *exch, void *dst, size_t size,2009 sysarg_t arg, unsigned int *flags)2008 int async_share_in_start(async_exch_t *exch, size_t size, sysarg_t arg, 2009 unsigned int *flags, void **dst) 2010 2010 { 2011 2011 if (exch == NULL) 2012 2012 return ENOENT; 2013 2013 2014 sysarg_t tmp_flags; 2015 int res = async_req_3_2(exch, IPC_M_SHARE_IN, (sysarg_t) dst, 2016 (sysarg_t) size, arg, NULL, &tmp_flags); 2014 sysarg_t _flags = 0; 2015 sysarg_t _dst = (sysarg_t) -1; 2016 int res = async_req_2_4(exch, IPC_M_SHARE_IN, (sysarg_t) size, 2017 arg, NULL, &_flags, NULL, &_dst); 2017 2018 2018 2019 if (flags) 2019 *flags = (unsigned int) tmp_flags; 2020 2020 *flags = (unsigned int) _flags; 2021 2022 *dst = (void *) _dst; 2021 2023 return res; 2022 2024 } … … 2047 2049 return false; 2048 2050 2049 *size = (size_t) IPC_GET_ARG 2(data);2051 *size = (size_t) IPC_GET_ARG1(data); 2050 2052 return true; 2051 2053 } … … 2053 2055 /** Wrapper for answering the IPC_M_SHARE_IN calls using the async framework. 2054 2056 * 2055 * This wrapper only makes it more comfortable to answer IPC_M_ DATA_READ2057 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_IN 2056 2058 * calls so that the user doesn't have to remember the meaning of each IPC 2057 2059 * argument. … … 2131 2133 * 2132 2134 */ 2133 int async_share_out_finalize(ipc_callid_t callid, void * dst)2135 int async_share_out_finalize(ipc_callid_t callid, void **dst) 2134 2136 { 2135 2137 return ipc_share_out_finalize(callid, dst); -
uspace/lib/c/generic/ddi.c
r24cf31f1 rfbcdeb8 45 45 #include <align.h> 46 46 #include <libarch/config.h> 47 #include "private/libc.h" 47 48 48 49 /** Return unique device number. … … 61 62 * 62 63 * @param phys Physical address of the starting frame. 63 * @param virt Virtual address of the starting page.64 64 * @param pages Number of pages to map. 65 65 * @param flags Flags for the new address space area. 66 * @param virt Virtual address of the starting page. 66 67 * 67 68 * @return EOK on success … … 72 73 * 73 74 */ 74 int physmem_map(void *phys, void *virt, size_t pages, unsigned int flags)75 int physmem_map(void *phys, size_t pages, unsigned int flags, void **virt) 75 76 { 76 return __SYSCALL 4(SYS_PHYSMEM_MAP, (sysarg_t) phys,77 (sysarg_t) virt, pages, flags);77 return __SYSCALL5(SYS_PHYSMEM_MAP, (sysarg_t) phys, 78 pages, flags, (sysarg_t) virt, (sysarg_t) __entry); 78 79 } 79 80 … … 81 82 unsigned int flags, void **phys) 82 83 { 83 return (int) __SYSCALL 5(SYS_DMAMEM_MAP, (sysarg_t) virt,84 (sysarg_t) size, (sysarg_t) map_flags, (sysarg_t) flags,85 (sysarg_t) phys );84 return (int) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size, 85 (sysarg_t) map_flags, (sysarg_t) flags & ~DMAMEM_FLAGS_ANONYMOUS, 86 (sysarg_t) phys, (sysarg_t) virt, 0); 86 87 } 87 88 … … 89 90 unsigned int flags, void **phys, void **virt) 90 91 { 91 *virt = as_get_mappable_page(size); 92 if (*virt == NULL) 93 return ENOMEM; 94 95 return dmamem_map(*virt, size, map_flags, 96 flags | DMAMEM_FLAGS_ANONYMOUS, phys); 92 return (int) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size, 93 (sysarg_t) map_flags, (sysarg_t) flags | DMAMEM_FLAGS_ANONYMOUS, 94 (sysarg_t) phys, (sysarg_t) virt, (sysarg_t) __entry); 97 95 } 98 96 99 int dmamem_unmap(void *virt, size_t size , unsigned int flags)97 int dmamem_unmap(void *virt, size_t size) 100 98 { 101 return __SYSCALL3(SYS_DMAMEM_UNMAP, (sysarg_t) virt, (sysarg_t) size, 102 (sysarg_t) flags); 99 return __SYSCALL3(SYS_DMAMEM_UNMAP, (sysarg_t) virt, (sysarg_t) size, 0); 103 100 } 104 101 … … 138 135 * @param pio_addr I/O start address. 139 136 * @param size Size of the I/O region. 140 * @param use_addr Address where the final address for141 * application's PIO will be stored.137 * @param virt Virtual address for application's 138 * PIO operations. 142 139 * 143 * @return Zero on success or negative error code. 140 * @return EOK on success. 141 * @return Negative error code on failure. 144 142 * 145 143 */ 146 int pio_enable(void *pio_addr, size_t size, void ** use_addr)144 int pio_enable(void *pio_addr, size_t size, void **virt) 147 145 { 148 void *phys;149 void *virt;150 size_t offset;151 unsigned int pages;152 153 146 #ifdef IO_SPACE_BOUNDARY 154 147 if (pio_addr < IO_SPACE_BOUNDARY) { 155 * use_addr= pio_addr;148 *virt = pio_addr; 156 149 return iospace_enable(task_get_id(), pio_addr, size); 157 150 } 158 151 #endif 159 152 160 phys = (void *) ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE); 161 offset = pio_addr - phys; 162 pages = ALIGN_UP(offset + size, PAGE_SIZE) >> PAGE_WIDTH; 163 virt = as_get_mappable_page(pages << PAGE_WIDTH); 164 *use_addr = virt + offset; 165 return physmem_map(phys, virt, pages, AS_AREA_READ | AS_AREA_WRITE); 153 void *phys_frame = 154 (void *) ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE); 155 size_t offset = pio_addr - phys_frame; 156 size_t pages = SIZE2PAGES(offset + size); 157 158 void *virt_page; 159 int rc = physmem_map(phys_frame, pages, 160 AS_AREA_READ | AS_AREA_WRITE, &virt_page); 161 if (rc != EOK) 162 return rc; 163 164 *virt = virt_page + offset; 165 return EOK; 166 166 } 167 167 -
uspace/lib/c/generic/ipc.c
r24cf31f1 rfbcdeb8 48 48 #include <fibril.h> 49 49 #include <macros.h> 50 #include "private/libc.h" 50 51 51 52 /** … … 760 761 * 761 762 * @param phoneid Phone that will be used to contact the receiving side. 762 * @param dst Destination address space area base.763 763 * @param size Size of the destination address space area. 764 764 * @param arg User defined argument. 765 765 * @param flags Storage for received flags. Can be NULL. 766 * @param dst Destination address space area base. Cannot be NULL. 766 767 * 767 768 * @return Zero on success or a negative error code from errno.h. 768 769 * 769 770 */ 770 int ipc_share_in_start(int phoneid, void *dst, size_t size, sysarg_t arg, 771 unsigned int *flags) 772 { 773 sysarg_t tmp_flags = 0; 774 int res = ipc_call_sync_3_2(phoneid, IPC_M_SHARE_IN, (sysarg_t) dst, 775 (sysarg_t) size, arg, NULL, &tmp_flags); 771 int ipc_share_in_start(int phoneid, size_t size, sysarg_t arg, 772 unsigned int *flags, void **dst) 773 { 774 sysarg_t _flags = 0; 775 sysarg_t _dst = (sysarg_t) -1; 776 int res = ipc_call_sync_2_4(phoneid, IPC_M_SHARE_IN, (sysarg_t) size, 777 arg, NULL, &_flags, NULL, &_dst); 776 778 777 779 if (flags) 778 *flags = (unsigned int) tmp_flags; 779 780 *flags = (unsigned int) _flags; 781 782 *dst = (void *) _dst; 780 783 return res; 781 784 } … … 783 786 /** Wrapper for answering the IPC_M_SHARE_IN calls. 784 787 * 785 * This wrapper only makes it more comfortable to answer IPC_M_ DATA_READ788 * This wrapper only makes it more comfortable to answer IPC_M_SHARE_IN 786 789 * calls so that the user doesn't have to remember the meaning of each 787 790 * IPC argument. … … 796 799 int ipc_share_in_finalize(ipc_callid_t callid, void *src, unsigned int flags) 797 800 { 798 return ipc_answer_2(callid, EOK, (sysarg_t) src, (sysarg_t) flags); 801 return ipc_answer_3(callid, EOK, (sysarg_t) src, (sysarg_t) flags, 802 (sysarg_t) __entry); 799 803 } 800 804 … … 826 830 * 827 831 */ 828 int ipc_share_out_finalize(ipc_callid_t callid, void * dst)829 { 830 return ipc_answer_ 1(callid, EOK, (sysarg_t) dst);832 int ipc_share_out_finalize(ipc_callid_t callid, void **dst) 833 { 834 return ipc_answer_2(callid, EOK, (sysarg_t) __entry, (sysarg_t) dst); 831 835 } 832 836 -
uspace/lib/c/generic/malloc.c
r24cf31f1 rfbcdeb8 283 283 static bool area_create(size_t size) 284 284 { 285 void *start = as_get_mappable_page(size); 286 if (start == NULL) 287 return false; 288 289 /* Align the heap area on page boundary */ 290 void *astart = (void *) ALIGN_UP((uintptr_t) start, PAGE_SIZE); 285 /* Align the heap area size on page boundary */ 291 286 size_t asize = ALIGN_UP(size, PAGE_SIZE); 292 293 astart = as_area_create(astart, asize,AS_AREA_WRITE | AS_AREA_READ);287 void *astart = as_area_create((void *) -1, asize, 288 AS_AREA_WRITE | AS_AREA_READ); 294 289 if (astart == (void *) -1) 295 290 return false; -
uspace/lib/c/generic/mman.c
r24cf31f1 rfbcdeb8 42 42 { 43 43 if (!start) 44 start = as_get_mappable_page(length);44 start = (void *) -1; 45 45 46 46 // if (!((flags & MAP_SHARED) ^ (flags & MAP_PRIVATE))) -
uspace/lib/c/generic/time.c
r24cf31f1 rfbcdeb8 147 147 } 148 148 149 void *addr = as_get_mappable_page(PAGE_SIZE); 150 if (addr == NULL) { 151 errno = ENOMEM; 152 return -1; 153 } 154 155 rc = physmem_map((void *) faddr, addr, 1, 156 AS_AREA_READ | AS_AREA_CACHEABLE); 149 void *addr; 150 rc = physmem_map((void *) faddr, 1, 151 AS_AREA_READ | AS_AREA_CACHEABLE, &addr); 157 152 if (rc != EOK) { 158 153 as_area_destroy(addr); -
uspace/lib/c/include/as.h
r24cf31f1 rfbcdeb8 59 59 extern int as_area_destroy(void *); 60 60 extern void *set_maxheapsize(size_t); 61 extern void *as_get_mappable_page(size_t);62 61 extern int as_get_physical_mapping(const void *, uintptr_t *); 63 62 -
uspace/lib/c/include/async.h
r24cf31f1 rfbcdeb8 346 346 */ 347 347 348 #define async_share_in_start_0_0(exch, dst, size) \349 async_share_in_start(exch, dst, size, 0, NULL)350 #define async_share_in_start_0_1(exch, dst, size, flags) \351 async_share_in_start(exch, dst, size, 0, flags)352 #define async_share_in_start_1_0(exch, dst, size, arg) \353 async_share_in_start(exch, dst, size, arg, NULL)354 #define async_share_in_start_1_1(exch, dst, size, arg, flags) \355 async_share_in_start(exch, dst, size, arg, flags)356 357 extern int async_share_in_start(async_exch_t *, void *,size_t, sysarg_t,358 unsigned int * );348 #define async_share_in_start_0_0(exch, size, dst) \ 349 async_share_in_start(exch, size, 0, NULL, dst) 350 #define async_share_in_start_0_1(exch, size, flags, dst) \ 351 async_share_in_start(exch, size, 0, flags, dst) 352 #define async_share_in_start_1_0(exch, size, arg, dst) \ 353 async_share_in_start(exch, size, arg, NULL, dst) 354 #define async_share_in_start_1_1(exch, size, arg, flags, dst) \ 355 async_share_in_start(exch, size, arg, flags, dst) 356 357 extern int async_share_in_start(async_exch_t *, size_t, sysarg_t, 358 unsigned int *, void **); 359 359 extern bool async_share_in_receive(ipc_callid_t *, size_t *); 360 360 extern int async_share_in_finalize(ipc_callid_t, void *, unsigned int); … … 362 362 extern int async_share_out_start(async_exch_t *, void *, unsigned int); 363 363 extern bool async_share_out_receive(ipc_callid_t *, size_t *, unsigned int *); 364 extern int async_share_out_finalize(ipc_callid_t, void * );364 extern int async_share_out_finalize(ipc_callid_t, void **); 365 365 366 366 /* -
uspace/lib/c/include/ddi.h
r24cf31f1 rfbcdeb8 42 42 extern int device_assign_devno(void); 43 43 44 extern int physmem_map(void *, void *, size_t, unsigned int);44 extern int physmem_map(void *, size_t, unsigned int, void **); 45 45 46 46 extern int dmamem_map(void *, size_t, unsigned int, unsigned int, void **); 47 47 extern int dmamem_map_anonymous(size_t, unsigned int, unsigned int, void **, 48 48 void **); 49 extern int dmamem_unmap(void *, size_t , unsigned int);49 extern int dmamem_unmap(void *, size_t); 50 50 extern int dmamem_unmap_anonymous(void *); 51 51 -
uspace/lib/c/include/ipc/ipc.h
r24cf31f1 rfbcdeb8 271 271 */ 272 272 273 #define ipc_share_in_start_0_0(phoneid, dst, size) \274 ipc_share_in_start((phoneid), ( dst), (size), 0, NULL)275 #define ipc_share_in_start_0_1(phoneid, dst, size, flags) \276 ipc_share_in_start((phoneid), ( dst), (size), 0, (flags))277 #define ipc_share_in_start_1_0(phoneid, dst, size, arg) \278 ipc_share_in_start((phoneid), ( dst), (size), (arg), NULL)279 #define ipc_share_in_start_1_1(phoneid, dst, size, arg, flags) \280 ipc_share_in_start((phoneid), ( dst), (size), (arg), (flags))281 282 extern int ipc_share_in_start(int, void *, size_t, sysarg_t, unsigned int*);273 #define ipc_share_in_start_0_0(phoneid, size, dst) \ 274 ipc_share_in_start((phoneid), (size), 0, NULL, (dst)) 275 #define ipc_share_in_start_0_1(phoneid, size, flags, dst) \ 276 ipc_share_in_start((phoneid), (size), 0, (flags), (dst)) 277 #define ipc_share_in_start_1_0(phoneid, size, arg, dst) \ 278 ipc_share_in_start((phoneid), (size), (arg), NULL, (dst)) 279 #define ipc_share_in_start_1_1(phoneid, size, arg, flags, dst) \ 280 ipc_share_in_start((phoneid), (size), (arg), (flags), (dst)) 281 282 extern int ipc_share_in_start(int, size_t, sysarg_t, unsigned int *, void **); 283 283 extern int ipc_share_in_finalize(ipc_callid_t, void *, unsigned int); 284 284 extern int ipc_share_out_start(int, void *, unsigned int); 285 extern int ipc_share_out_finalize(ipc_callid_t, void * );285 extern int ipc_share_out_finalize(ipc_callid_t, void **); 286 286 extern int ipc_data_read_start(int, void *, size_t); 287 287 extern int ipc_data_read_finalize(ipc_callid_t, const void *, size_t);
Note:
See TracChangeset
for help on using the changeset viewer.