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