Changes in uspace/lib/c/generic/ddi.c [c0699467:fbcdeb8] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/ddi.c
rc0699467 rfbcdeb8 33 33 */ 34 34 35 #include <assert.h> 36 #include <unistd.h> 37 #include <errno.h> 35 38 #include <sys/types.h> 36 39 #include <abi/ddi/arg.h> … … 42 45 #include <align.h> 43 46 #include <libarch/config.h> 47 #include "private/libc.h" 44 48 45 49 /** Return unique device number. … … 53 57 } 54 58 55 /** Map piece of physical memory to task.59 /** Map a piece of physical memory to task. 56 60 * 57 61 * Caller of this function must have the CAP_MEM_MANAGER capability. 58 62 * 59 * @param p fPhysical address of the starting frame.60 * @param vp Virtual address of the starting page.61 * @param pages Number of pages to map.62 * @param flags Flags for the new address space area.63 * @param phys Physical address of the starting frame. 64 * @param pages Number of pages to map. 65 * @param flags Flags for the new address space area. 66 * @param virt Virtual address of the starting page. 63 67 * 64 * @return 0 on success, EPERM if the caller lacks the 65 * CAP_MEM_MANAGER capability, ENOENT if there is no task 66 * with specified ID and ENOMEM if there was some problem 67 * in creating address space area. 68 * @return EOK on success 69 * @return EPERM if the caller lacks the CAP_MEM_MANAGER capability 70 * @return ENOENT if there is no task with specified ID 71 * @return ENOMEM if there was some problem in creating 72 * the address space area. 73 * 68 74 */ 69 int physmem_map(void *p f, void *vp, unsigned long pages, int flags)75 int physmem_map(void *phys, size_t pages, unsigned int flags, void **virt) 70 76 { 71 return __SYSCALL4(SYS_PHYSMEM_MAP, (sysarg_t) pf, (sysarg_t) vp, pages, 72 flags); 77 return __SYSCALL5(SYS_PHYSMEM_MAP, (sysarg_t) phys, 78 pages, flags, (sysarg_t) virt, (sysarg_t) __entry); 79 } 80 81 int dmamem_map(void *virt, size_t size, unsigned int map_flags, 82 unsigned int flags, void **phys) 83 { 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); 87 } 88 89 int dmamem_map_anonymous(size_t size, unsigned int map_flags, 90 unsigned int flags, void **phys, void **virt) 91 { 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); 95 } 96 97 int dmamem_unmap(void *virt, size_t size) 98 { 99 return __SYSCALL3(SYS_DMAMEM_UNMAP, (sysarg_t) virt, (sysarg_t) size, 0); 100 } 101 102 int dmamem_unmap_anonymous(void *virt) 103 { 104 return __SYSCALL3(SYS_DMAMEM_UNMAP, (sysarg_t) virt, 0, 105 DMAMEM_FLAGS_ANONYMOUS); 73 106 } 74 107 … … 77 110 * Caller of this function must have the IO_MEM_MANAGER capability. 78 111 * 79 * @param id 80 * @param ioaddr 81 * @param size 112 * @param id Task ID. 113 * @param ioaddr Starting address of the I/O range. 114 * @param size Size of the range. 82 115 * 83 * @return 0 on success, EPERM if the caller lacks the 84 * CAP_IO_MANAGER capability, ENOENT if there is no task 85 * with specified ID and ENOMEM if there was some problem 86 * in allocating memory. 116 * @return EOK on success 117 * @return EPERM if the caller lacks the CAP_IO_MANAGER capability 118 * @return ENOENT if there is no task with specified ID 119 * @return ENOMEM if there was some problem in allocating memory. 120 * 87 121 */ 88 122 int iospace_enable(task_id_t id, void *ioaddr, unsigned long size) 89 123 { 90 124 ddi_ioarg_t arg; 91 125 92 126 arg.task_id = id; 93 127 arg.ioaddr = ioaddr; 94 128 arg.size = size; 95 129 96 130 return __SYSCALL1(SYS_IOSPACE_ENABLE, (sysarg_t) &arg); 97 131 } … … 99 133 /** Enable PIO for specified I/O range. 100 134 * 101 * @param pio_addr 102 * @param size 103 * @param use_addr Address where the final address for application's PIO104 * will be stored.135 * @param pio_addr I/O start address. 136 * @param size Size of the I/O region. 137 * @param virt Virtual address for application's 138 * PIO operations. 105 139 * 106 * @return Zero on success or negative error code. 140 * @return EOK on success. 141 * @return Negative error code on failure. 142 * 107 143 */ 108 int pio_enable(void *pio_addr, size_t size, void ** use_addr)144 int pio_enable(void *pio_addr, size_t size, void **virt) 109 145 { 110 void *phys;111 void *virt;112 size_t offset;113 unsigned int pages;114 115 146 #ifdef IO_SPACE_BOUNDARY 116 147 if (pio_addr < IO_SPACE_BOUNDARY) { 117 * use_addr= pio_addr;148 *virt = pio_addr; 118 149 return iospace_enable(task_get_id(), pio_addr, size); 119 150 } 120 151 #endif 121 122 phys = (void *) ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE); 123 offset = pio_addr - phys; 124 pages = ALIGN_UP(offset + size, PAGE_SIZE) >> PAGE_WIDTH; 125 virt = as_get_mappable_page(pages << PAGE_WIDTH); 126 *use_addr = virt + offset; 127 return physmem_map(phys, virt, pages, AS_AREA_READ | AS_AREA_WRITE); 152 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; 128 166 } 129 167 … … 138 176 * 139 177 */ 140 int register_irq(int inr, int devno, int method, irq_code_t *ucode)178 int irq_register(int inr, int devno, int method, irq_code_t *ucode) 141 179 { 142 return __SYSCALL4(SYS_ REGISTER_IRQ, inr, devno, method,180 return __SYSCALL4(SYS_IRQ_REGISTER, inr, devno, method, 143 181 (sysarg_t) ucode); 144 182 } … … 152 190 * 153 191 */ 154 int unregister_irq(int inr, int devno)192 int irq_unregister(int inr, int devno) 155 193 { 156 return __SYSCALL2(SYS_ UNREGISTER_IRQ, inr, devno);194 return __SYSCALL2(SYS_IRQ_UNREGISTER, inr, devno); 157 195 } 158 196
Note:
See TracChangeset
for help on using the changeset viewer.