- Timestamp:
- 2012-03-15T22:52:33Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bfb3d60
- Parents:
- 43cd499 (diff), dbbba51c (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
- Files:
-
- 7 added
- 37 edited
- 12 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/Makefile
r43cd499 r14f8fd4 48 48 app/lsusb \ 49 49 app/mkfat \ 50 app/mkexfat \ 50 51 app/mkmfs \ 51 52 app/redir \ -
uspace/app/sysinfo/sysinfo.c
r43cd499 r14f8fd4 37 37 #include <stdio.h> 38 38 #include <sysinfo.h> 39 #include <malloc.h> 39 40 #include <sys/types.h> 40 41 41 static int print_item_val(char *ipath); 42 static int print_item_data(char *ipath); 43 44 static void dump_bytes_hex(char *data, size_t size); 45 static void dump_bytes_text(char *data, size_t size); 46 47 static void print_syntax(void); 48 49 int main(int argc, char *argv[]) 50 { 51 int rc; 52 char *ipath; 53 sysinfo_item_val_type_t tag; 54 55 if (argc != 2) { 56 print_syntax(); 57 return 1; 58 } 59 60 ipath = argv[1]; 61 62 tag = sysinfo_get_val_type(ipath); 63 64 /* Silence warning */ 65 rc = EOK; 66 67 switch (tag) { 68 case SYSINFO_VAL_UNDEFINED: 69 printf("Error: Sysinfo item '%s' not defined.\n", ipath); 70 rc = 2; 71 break; 72 case SYSINFO_VAL_VAL: 73 rc = print_item_val(ipath); 74 break; 75 case SYSINFO_VAL_DATA: 76 rc = print_item_data(ipath); 77 break; 78 default: 79 printf("Error: Sysinfo item '%s' with unknown value type.\n", 80 ipath); 81 rc = 2; 82 break; 83 } 84 85 return rc; 42 static void dump_bytes_hex(char *data, size_t size) 43 { 44 for (size_t i = 0; i < size; i++) { 45 if (i > 0) 46 putchar(' '); 47 printf("0x%02x", (uint8_t) data[i]); 48 } 49 } 50 51 static void dump_bytes_text(char *data, size_t size) 52 { 53 size_t offset = 0; 54 55 while (offset < size) { 56 wchar_t c = str_decode(data, &offset, size); 57 printf("%lc", (wint_t) c); 58 } 86 59 } 87 60 … … 89 62 { 90 63 sysarg_t value; 91 int rc; 92 93 rc = sysinfo_get_value(ipath, &value); 64 int rc = sysinfo_get_value(ipath, &value); 94 65 if (rc != EOK) { 95 66 printf("Error reading item '%s'.\n", ipath); 96 67 return rc; 97 68 } 98 69 99 70 printf("%s -> %" PRIu64 " (0x%" PRIx64 ")\n", ipath, 100 71 (uint64_t) value, (uint64_t) value); 101 72 102 73 return EOK; 103 74 } … … 105 76 static int print_item_data(char *ipath) 106 77 { 107 void *data;108 78 size_t size; 109 110 data = sysinfo_get_data(ipath, &size); 79 void *data = sysinfo_get_data(ipath, &size); 111 80 if (data == NULL) { 112 81 printf("Error reading item '%s'.\n", ipath); 113 82 return -1; 114 83 } 115 84 116 85 printf("%s -> ", ipath); 117 86 dump_bytes_hex(data, size); … … 119 88 dump_bytes_text(data, size); 120 89 fputs("')\n", stdout); 121 90 122 91 return EOK; 123 92 } 124 93 125 static void dump_bytes_hex(char *data, size_t size) 126 { 127 size_t i; 128 129 for (i = 0; i < size; ++i) { 130 if (i > 0) putchar(' '); 131 printf("0x%02x", (uint8_t) data[i]); 132 } 133 } 134 135 static void dump_bytes_text(char *data, size_t size) 136 { 137 wchar_t c; 138 size_t offset; 139 140 offset = 0; 141 142 while (offset < size) { 143 c = str_decode(data, &offset, size); 144 printf("%lc", (wint_t) c); 145 } 146 } 147 148 149 static void print_syntax(void) 150 { 151 printf("Syntax: sysinfo <item_path>\n"); 94 static int print_item_property(char *ipath, char *iprop) 95 { 96 size_t size; 97 void *data = sysinfo_get_property(ipath, iprop, &size); 98 if (data == NULL) { 99 printf("Error reading property '%s' of item '%s'.\n", iprop, 100 ipath); 101 return -1; 102 } 103 104 printf("%s property %s -> ", ipath, iprop); 105 dump_bytes_hex(data, size); 106 fputs(" ('", stdout); 107 dump_bytes_text(data, size); 108 fputs("')\n", stdout); 109 110 return EOK; 111 } 112 113 static void print_spaces(size_t spaces) 114 { 115 for (size_t i = 0; i < spaces; i++) 116 printf(" "); 117 } 118 119 static void print_keys(const char *path, size_t spaces) 120 { 121 size_t size; 122 char *keys = sysinfo_get_keys(path, &size); 123 if ((keys == NULL) || (size == 0)) 124 return; 125 126 size_t pos = 0; 127 while (pos < size) { 128 /* Process each key with sanity checks */ 129 size_t cur_size = str_nsize(keys + pos, size - pos); 130 if (keys[pos + cur_size] != 0) 131 break; 132 133 size_t path_size = str_size(path) + cur_size + 2; 134 char *cur_path = (char *) malloc(path_size); 135 if (cur_path == NULL) 136 break; 137 138 size_t length; 139 140 if (path[0] != 0) { 141 print_spaces(spaces); 142 printf(".%s\n", keys + pos); 143 length = str_length(keys + pos) + 1; 144 145 snprintf(cur_path, path_size, "%s.%s", path, keys + pos); 146 } else { 147 printf("%s\n", keys + pos); 148 length = str_length(keys + pos); 149 150 snprintf(cur_path, path_size, "%s", keys + pos); 151 } 152 153 print_keys(cur_path, spaces + length); 154 155 free(cur_path); 156 pos += cur_size + 1; 157 } 158 159 free(keys); 160 } 161 162 int main(int argc, char *argv[]) 163 { 164 int rc = 0; 165 166 if (argc < 2) { 167 /* Print keys */ 168 print_keys("", 0); 169 return rc; 170 } 171 172 char *ipath = argv[1]; 173 174 if (argc < 3) { 175 sysinfo_item_val_type_t tag = sysinfo_get_val_type(ipath); 176 177 switch (tag) { 178 case SYSINFO_VAL_UNDEFINED: 179 printf("Error: Sysinfo item '%s' not defined.\n", ipath); 180 rc = 2; 181 break; 182 case SYSINFO_VAL_VAL: 183 rc = print_item_val(ipath); 184 break; 185 case SYSINFO_VAL_DATA: 186 rc = print_item_data(ipath); 187 break; 188 default: 189 printf("Error: Sysinfo item '%s' with unknown value type.\n", 190 ipath); 191 rc = 2; 192 break; 193 } 194 195 return rc; 196 } 197 198 char *iprop = argv[2]; 199 rc = print_item_property(ipath, iprop); 200 return rc; 152 201 } 153 202 -
uspace/drv/bus/usb/ehci/Makefile
r43cd499 r14f8fd4 43 43 SOURCES = \ 44 44 main.c \ 45 pci.c45 res.c 46 46 47 47 include $(USPACE_PREFIX)/Makefile.common -
uspace/drv/bus/usb/ehci/main.c
r43cd499 r14f8fd4 44 44 #include <usb/host/hcd.h> 45 45 46 #include " pci.h"46 #include "res.h" 47 47 48 48 #define NAME "ehci" … … 81 81 int irq = 0; 82 82 83 int ret = pci_get_my_registers(device, ®_base, ®_size, &irq);83 int ret = get_my_registers(device, ®_base, ®_size, &irq); 84 84 CHECK_RET_RETURN(ret, 85 85 "Failed to get memory addresses for %" PRIun ": %s.\n", … … 88 88 reg_base, reg_size, irq); 89 89 90 ret = pci_disable_legacy(device, reg_base, reg_size, irq);90 ret = disable_legacy(device, reg_base, reg_size); 91 91 CHECK_RET_RETURN(ret, 92 92 "Failed to disable legacy USB: %s.\n", str_error(ret)); -
uspace/drv/bus/usb/ehci/res.c
r43cd499 r14f8fd4 39 39 #include <str_error.h> 40 40 #include <assert.h> 41 #include <as.h>42 41 #include <devman.h> 43 42 #include <ddi.h> 44 #include <libarch/ddi.h>45 #include <device/hw_res.h>46 47 43 #include <usb/debug.h> 48 #include <pci_dev_iface.h> 49 50 #include "pci.h" 51 52 #define PAGE_SIZE_MASK 0xfffff000 44 #include <device/hw_res_parsed.h> 45 #include <device/pci.h> 46 47 #include "res.h" 53 48 54 49 #define HCC_PARAMS_OFFSET 0x8 … … 72 67 #define WAIT_STEP 10 73 68 74 #define PCI_READ(size) \75 do { \76 async_sess_t *parent_sess = \77 devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle, \78 IPC_FLAG_BLOCKING); \79 if (!parent_sess) \80 return ENOMEM; \81 \82 sysarg_t add = (sysarg_t) address; \83 sysarg_t val; \84 \85 async_exch_t *exch = async_exchange_begin(parent_sess); \86 \87 const int ret = \88 async_req_2_1(exch, DEV_IFACE_ID(PCI_DEV_IFACE), \89 IPC_M_CONFIG_SPACE_READ_##size, add, &val); \90 \91 async_exchange_end(exch); \92 async_hangup(parent_sess); \93 \94 assert(value); \95 \96 *value = val; \97 return ret; \98 } while (0)99 100 static int pci_read32(const ddf_dev_t *dev, int address, uint32_t *value)101 {102 PCI_READ(32);103 }104 105 static int pci_read16(const ddf_dev_t *dev, int address, uint16_t *value)106 {107 PCI_READ(16);108 }109 110 static int pci_read8(const ddf_dev_t *dev, int address, uint8_t *value)111 {112 PCI_READ(8);113 }114 115 #define PCI_WRITE(size) \116 do { \117 async_sess_t *parent_sess = \118 devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle, \119 IPC_FLAG_BLOCKING); \120 if (!parent_sess) \121 return ENOMEM; \122 \123 sysarg_t add = (sysarg_t) address; \124 sysarg_t val = value; \125 \126 async_exch_t *exch = async_exchange_begin(parent_sess); \127 \128 const int ret = \129 async_req_3_0(exch, DEV_IFACE_ID(PCI_DEV_IFACE), \130 IPC_M_CONFIG_SPACE_WRITE_##size, add, val); \131 \132 async_exchange_end(exch); \133 async_hangup(parent_sess); \134 \135 return ret; \136 } while(0)137 138 static int pci_write32(const ddf_dev_t *dev, int address, uint32_t value)139 {140 PCI_WRITE(32);141 }142 143 static int pci_write16(const ddf_dev_t *dev, int address, uint16_t value)144 {145 PCI_WRITE(16);146 }147 148 static int pci_write8(const ddf_dev_t *dev, int address, uint8_t value)149 {150 PCI_WRITE(8);151 }152 69 153 70 /** Get address of registers and IRQ for given device. … … 159 76 * @return Error code. 160 77 */ 161 int pci_get_my_registers(const ddf_dev_t *dev,78 int get_my_registers(const ddf_dev_t *dev, 162 79 uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no) 163 80 { 164 assert(dev != NULL);81 assert(dev); 165 82 166 async_sess_t *parent_sess = 167 devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle, 168 IPC_FLAG_BLOCKING); 83 async_sess_t *parent_sess = devman_parent_device_connect( 84 EXCHANGE_SERIALIZE, dev->handle, IPC_FLAG_BLOCKING); 169 85 if (!parent_sess) 170 86 return ENOMEM; 171 87 172 hw_resource_list_t hw_resources; 173 int rc = hw_res_get_resource_list(parent_sess, &hw_resources); 174 if (rc != EOK) { 175 async_hangup(parent_sess); 176 return rc; 177 } 178 179 uintptr_t mem_address = 0; 180 size_t mem_size = 0; 181 bool mem_found = false; 182 183 int irq = 0; 184 bool irq_found = false; 185 186 size_t i; 187 for (i = 0; i < hw_resources.count; i++) { 188 hw_resource_t *res = &hw_resources.resources[i]; 189 switch (res->type) { 190 case INTERRUPT: 191 irq = res->res.interrupt.irq; 192 irq_found = true; 193 usb_log_debug2("Found interrupt: %d.\n", irq); 194 break; 195 case MEM_RANGE: 196 if (res->res.mem_range.address != 0 197 && res->res.mem_range.size != 0 ) { 198 mem_address = res->res.mem_range.address; 199 mem_size = res->res.mem_range.size; 200 usb_log_debug2("Found mem: %" PRIxn" %zu.\n", 201 mem_address, mem_size); 202 mem_found = true; 203 } 204 default: 205 break; 206 } 207 } 208 209 if (mem_found && irq_found) { 210 *mem_reg_address = mem_address; 211 *mem_reg_size = mem_size; 212 *irq_no = irq; 213 rc = EOK; 214 } else { 215 rc = ENOENT; 216 } 217 88 hw_res_list_parsed_t hw_res; 89 hw_res_list_parsed_init(&hw_res); 90 const int ret = hw_res_get_list_parsed(parent_sess, &hw_res, 0); 218 91 async_hangup(parent_sess); 219 return rc; 92 if (ret != EOK) { 93 return ret; 94 } 95 96 if (hw_res.irqs.count != 1 || hw_res.mem_ranges.count != 1) { 97 hw_res_list_parsed_clean(&hw_res); 98 return ENOENT; 99 } 100 101 if (mem_reg_address) 102 *mem_reg_address = hw_res.mem_ranges.ranges[0].address; 103 if (mem_reg_size) 104 *mem_reg_size = hw_res.mem_ranges.ranges[0].size; 105 if (irq_no) 106 *irq_no = hw_res.irqs.irqs[0]; 107 108 hw_res_list_parsed_clean(&hw_res); 109 return EOK; 220 110 } 221 111 /*----------------------------------------------------------------------------*/ … … 225 115 * @return Error code. 226 116 */ 227 int pci_enable_interrupts(const ddf_dev_t *device)117 int enable_interrupts(const ddf_dev_t *device) 228 118 { 229 async_sess_t *parent_sess = 230 devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle, 231 IPC_FLAG_BLOCKING); 119 async_sess_t *parent_sess = devman_parent_device_connect( 120 EXCHANGE_SERIALIZE, device->handle, IPC_FLAG_BLOCKING); 232 121 if (!parent_sess) 233 122 return ENOMEM; … … 239 128 } 240 129 /*----------------------------------------------------------------------------*/ 241 /** Implements BIOS handoff routine as decribed in EHCI spec 242 * 243 * @param[in] device Device asking for interrupts 130 /** Implements BIOS hands-off routine as described in EHCI spec 131 * 132 * @param device EHCI device 133 * @param eecp Value of EHCI Extended Capabilities pointer. 244 134 * @return Error code. 245 135 */ 246 int pci_disable_legacy( 247 const ddf_dev_t *device, uintptr_t reg_base, size_t reg_size, int irq) 136 static int disable_extended_caps(const ddf_dev_t *device, unsigned eecp) 137 { 138 /* nothing to do */ 139 if (eecp == 0) 140 return EOK; 141 142 async_sess_t *parent_sess = devman_parent_device_connect( 143 EXCHANGE_SERIALIZE, device->handle, IPC_FLAG_BLOCKING); 144 if (!parent_sess) 145 return ENOMEM; 146 147 #define CHECK_RET_HANGUP_RETURN(ret, message...) \ 148 if (ret != EOK) { \ 149 usb_log_error(message); \ 150 async_hangup(parent_sess); \ 151 return ret; \ 152 } else (void)0 153 154 /* Read the first EEC. i.e. Legacy Support register */ 155 uint32_t usblegsup; 156 int ret = pci_config_space_read_32(parent_sess, 157 eecp + USBLEGSUP_OFFSET, &usblegsup); 158 CHECK_RET_HANGUP_RETURN(ret, 159 "Failed to read USBLEGSUP: %s.\n", str_error(ret)); 160 usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup); 161 162 /* Request control from firmware/BIOS by writing 1 to highest 163 * byte. (OS Control semaphore)*/ 164 usb_log_debug("Requesting OS control.\n"); 165 ret = pci_config_space_write_8(parent_sess, 166 eecp + USBLEGSUP_OFFSET + 3, 1); 167 CHECK_RET_HANGUP_RETURN(ret, "Failed to request OS EHCI control: %s.\n", 168 str_error(ret)); 169 170 size_t wait = 0; 171 /* Wait for BIOS to release control. */ 172 ret = pci_config_space_read_32( 173 parent_sess, eecp + USBLEGSUP_OFFSET, &usblegsup); 174 while ((wait < DEFAULT_WAIT) && (usblegsup & USBLEGSUP_BIOS_CONTROL)) { 175 async_usleep(WAIT_STEP); 176 ret = pci_config_space_read_32(parent_sess, 177 eecp + USBLEGSUP_OFFSET, &usblegsup); 178 wait += WAIT_STEP; 179 } 180 181 if ((usblegsup & USBLEGSUP_BIOS_CONTROL) == 0) { 182 usb_log_info("BIOS released control after %zu usec.\n", wait); 183 async_hangup(parent_sess); 184 return EOK; 185 } 186 187 /* BIOS failed to hand over control, this should not happen. */ 188 usb_log_warning( "BIOS failed to release control after " 189 "%zu usecs, force it.\n", wait); 190 ret = pci_config_space_write_32(parent_sess, 191 eecp + USBLEGSUP_OFFSET, USBLEGSUP_OS_CONTROL); 192 CHECK_RET_HANGUP_RETURN(ret, "Failed to force OS control: " 193 "%s.\n", str_error(ret)); 194 /* 195 * Check capability type here, value of 01h identifies the capability 196 * as Legacy Support. This extended capability requires one additional 197 * 32-bit register for control/status information and this register is 198 * located at offset EECP+04h 199 */ 200 if ((usblegsup & 0xff) == 1) { 201 /* Read the second EEC Legacy Support and Control register */ 202 uint32_t usblegctlsts; 203 ret = pci_config_space_read_32(parent_sess, 204 eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts); 205 CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS: %s.\n", 206 str_error(ret)); 207 usb_log_debug("USBLEGCTLSTS: %" PRIx32 ".\n", usblegctlsts); 208 /* 209 * Zero SMI enables in legacy control register. 210 * It should prevent pre-OS code from 211 * interfering. NOTE: Three upper bits are WC 212 */ 213 ret = pci_config_space_write_32(parent_sess, 214 eecp + USBLEGCTLSTS_OFFSET, 0xe0000000); 215 CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) zero USBLEGCTLSTS.\n", ret); 216 udelay(10); 217 ret = pci_config_space_read_32(parent_sess, 218 eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts); 219 CHECK_RET_HANGUP_RETURN(ret, "Failed to get USBLEGCTLSTS 2: %s.\n", 220 str_error(ret)); 221 usb_log_debug("Zeroed USBLEGCTLSTS: %" PRIx32 ".\n", 222 usblegctlsts); 223 } 224 225 /* Read again Legacy Support register */ 226 ret = pci_config_space_read_32(parent_sess, 227 eecp + USBLEGSUP_OFFSET, &usblegsup); 228 CHECK_RET_HANGUP_RETURN(ret, "Failed to read USBLEGSUP: %s.\n", 229 str_error(ret)); 230 usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup); 231 async_hangup(parent_sess); 232 return EOK; 233 #undef CHECK_RET_HANGUP_RETURN 234 } 235 236 int disable_legacy(const ddf_dev_t *device, uintptr_t reg_base, size_t reg_size) 248 237 { 249 238 assert(device); 250 (void) pci_read16;251 (void) pci_read8;252 (void) pci_write16;253 239 254 240 #define CHECK_RET_RETURN(ret, message...) \ … … 274 260 usb_log_debug("Value of EECP: %x.\n", eecp); 275 261 276 /* Read the first EEC. i.e. Legacy Support register */ 277 uint32_t usblegsup; 278 ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup); 279 CHECK_RET_RETURN(ret, "Failed to read USBLEGSUP: %s.\n", str_error(ret)); 280 usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup); 281 282 /* Request control from firmware/BIOS, by writing 1 to highest byte. 283 * (OS Control semaphore)*/ 284 usb_log_debug("Requesting OS control.\n"); 285 ret = pci_write8(device, eecp + USBLEGSUP_OFFSET + 3, 1); 286 CHECK_RET_RETURN(ret, "Failed to request OS EHCI control: %s.\n", 262 ret = disable_extended_caps(device, eecp); 263 CHECK_RET_RETURN(ret, "Failed to disable extended capabilities: %s.\n", 287 264 str_error(ret)); 288 265 289 size_t wait = 0; 290 /* Wait for BIOS to release control. */ 291 ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup); 292 while ((wait < DEFAULT_WAIT) && (usblegsup & USBLEGSUP_BIOS_CONTROL)) { 293 async_usleep(WAIT_STEP); 294 ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup); 295 wait += WAIT_STEP; 296 } 297 298 299 if ((usblegsup & USBLEGSUP_BIOS_CONTROL) == 0) { 300 usb_log_info("BIOS released control after %zu usec.\n", wait); 301 } else { 302 /* BIOS failed to hand over control, this should not happen. */ 303 usb_log_warning( "BIOS failed to release control after " 304 "%zu usecs, force it.\n", wait); 305 ret = pci_write32(device, eecp + USBLEGSUP_OFFSET, 306 USBLEGSUP_OS_CONTROL); 307 CHECK_RET_RETURN(ret, "Failed to force OS control: %s.\n", 308 str_error(ret)); 309 /* Check capability type here, A value of 01h 310 * identifies the capability as Legacy Support. 311 * This extended capability requires one 312 * additional 32-bit register for control/status information, 313 * and this register is located at offset EECP+04h 314 * */ 315 if ((usblegsup & 0xff) == 1) { 316 /* Read the second EEC 317 * Legacy Support and Control register */ 318 uint32_t usblegctlsts; 319 ret = pci_read32( 320 device, eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts); 321 CHECK_RET_RETURN(ret, 322 "Failed to get USBLEGCTLSTS: %s.\n", str_error(ret)); 323 usb_log_debug("USBLEGCTLSTS: %" PRIx32 ".\n", 324 usblegctlsts); 325 /* Zero SMI enables in legacy control register. 326 * It should prevent pre-OS code from interfering. */ 327 ret = pci_write32(device, eecp + USBLEGCTLSTS_OFFSET, 328 0xe0000000); /* three upper bits are WC */ 329 CHECK_RET_RETURN(ret, 330 "Failed(%d) zero USBLEGCTLSTS.\n", ret); 331 udelay(10); 332 ret = pci_read32( 333 device, eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts); 334 CHECK_RET_RETURN(ret, 335 "Failed to get USBLEGCTLSTS 2: %s.\n", 336 str_error(ret)); 337 usb_log_debug("Zeroed USBLEGCTLSTS: %" PRIx32 ".\n", 338 usblegctlsts); 339 } 340 } 341 342 343 /* Read again Legacy Support register */ 344 ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup); 345 CHECK_RET_RETURN(ret, "Failed to read USBLEGSUP: %s.\n", str_error(ret)); 346 usb_log_debug("USBLEGSUP: %" PRIx32 ".\n", usblegsup); 266 #undef CHECK_RET_RETURN 347 267 348 268 /* 349 * TURN OFF EHCI FOR NOW, DRIVER WILL REINITIALIZE IT 269 * TURN OFF EHCI FOR NOW, DRIVER WILL REINITIALIZE IT IF NEEDED 350 270 */ 351 271 … … 384 304 385 305 return ret; 386 #undef CHECK_RET_RETURN387 306 } 388 307 -
uspace/drv/bus/usb/ehci/res.h
r43cd499 r14f8fd4 38 38 #include <ddf/driver.h> 39 39 40 int pci_get_my_registers(const ddf_dev_t *, uintptr_t *, size_t *, int *);41 int pci_enable_interrupts(const ddf_dev_t *);42 int pci_disable_legacy(const ddf_dev_t *, uintptr_t, size_t, int);40 int get_my_registers(const ddf_dev_t *, uintptr_t *, size_t *, int *); 41 int enable_interrupts(const ddf_dev_t *); 42 int disable_legacy(const ddf_dev_t *, uintptr_t, size_t); 43 43 44 44 #endif -
uspace/drv/bus/usb/ohci/Makefile
r43cd499 r14f8fd4 50 50 ohci_batch.c \ 51 51 ohci_endpoint.c \ 52 pci.c \52 res.c \ 53 53 root_hub.c \ 54 54 hw_struct/endpoint_descriptor.c \ -
uspace/drv/bus/usb/ohci/hw_struct/hcca.h
r43cd499 r14f8fd4 46 46 uint16_t pad1; 47 47 uint32_t done_head; 48 uint32_t reserved[ 29];49 } __attribute__((packed, aligned))hcca_t;48 uint32_t reserved[30]; 49 } hcca_t; 50 50 51 51 static inline void * hcca_get(void) -
uspace/drv/bus/usb/ohci/ohci.c
r43cd499 r14f8fd4 42 42 43 43 #include "ohci.h" 44 #include " pci.h"44 #include "res.h" 45 45 #include "hc.h" 46 46 … … 180 180 int irq = 0; 181 181 182 ret = pci_get_my_registers(device, ®_base, ®_size, &irq);182 ret = get_my_registers(device, ®_base, ®_size, &irq); 183 183 CHECK_RET_DEST_FREE_RETURN(ret, 184 184 "Failed to get register memory addresses for %" PRIun ": %s.\n", … … 211 211 /* Try to enable interrupts */ 212 212 bool interrupts = false; 213 ret = pci_enable_interrupts(device);213 ret = enable_interrupts(device); 214 214 if (ret != EOK) { 215 215 usb_log_warning("Failed to enable interrupts: %s." -
uspace/drv/bus/usb/ohci/res.c
r43cd499 r14f8fd4 38 38 #include <errno.h> 39 39 #include <assert.h> 40 #include <as.h>41 40 #include <devman.h> 42 #include <ddi.h>43 #include <libarch/ddi.h>44 41 #include <device/hw_res_parsed.h> 45 42 46 43 #include <usb/debug.h> 47 #include <pci_dev_iface.h>48 44 49 #include " pci.h"45 #include "res.h" 50 46 51 47 /** Get address of registers and IRQ for given device. … … 57 53 * @return Error code. 58 54 */ 59 int pci_get_my_registers(ddf_dev_t *dev,55 int get_my_registers(const ddf_dev_t *dev, 60 56 uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no) 61 57 { … … 98 94 * @return Error code. 99 95 */ 100 int pci_enable_interrupts(ddf_dev_t *device)96 int enable_interrupts(const ddf_dev_t *device) 101 97 { 102 98 async_sess_t *parent_sess = … … 106 102 return ENOMEM; 107 103 108 bool enabled = hw_res_enable_interrupt(parent_sess);104 const bool enabled = hw_res_enable_interrupt(parent_sess); 109 105 async_hangup(parent_sess); 110 106 -
uspace/drv/bus/usb/ohci/res.h
r43cd499 r14f8fd4 32 32 * PCI related functions needed by OHCI driver. 33 33 */ 34 #ifndef DRV_OHCI_ PCI_H35 #define DRV_OHCI_ PCI_H34 #ifndef DRV_OHCI_RES_H 35 #define DRV_OHCI_RES_H 36 36 37 37 #include <ddf/driver.h> 38 38 39 int pci_get_my_registers(ddf_dev_t *, uintptr_t *, size_t *, int *); 40 int pci_enable_interrupts(ddf_dev_t *); 41 int pci_disable_legacy(ddf_dev_t *); 39 int get_my_registers(const ddf_dev_t *, uintptr_t *, size_t *, int *); 40 int enable_interrupts(const ddf_dev_t *); 42 41 43 42 #endif -
uspace/drv/bus/usb/uhci/Makefile
r43cd499 r14f8fd4 44 44 hc.c \ 45 45 main.c \ 46 pci.c \46 res.c \ 47 47 root_hub.c \ 48 48 transfer_list.c \ -
uspace/drv/bus/usb/uhci/res.c
r43cd499 r14f8fd4 39 39 #include <devman.h> 40 40 #include <device/hw_res_parsed.h> 41 #include <device/pci.h> 41 42 42 #include <usb/debug.h> 43 #include <pci_dev_iface.h> 44 45 #include "pci.h" 43 #include "res.h" 46 44 47 45 /** Get I/O address of registers and IRQ for given device. … … 53 51 * @return Error code. 54 52 */ 55 int pci_get_my_registers(const ddf_dev_t *dev,53 int get_my_registers(const ddf_dev_t *dev, 56 54 uintptr_t *io_reg_address, size_t *io_reg_size, int *irq_no) 57 55 { 58 56 assert(dev); 59 assert(io_reg_address);60 assert(io_reg_size);61 assert(irq_no);62 57 63 58 async_sess_t *parent_sess = … … 97 92 * @return Error code. 98 93 */ 99 int pci_enable_interrupts(const ddf_dev_t *device)94 int enable_interrupts(const ddf_dev_t *device) 100 95 { 101 96 async_sess_t *parent_sess = … … 116 111 * @return Error code. 117 112 */ 118 int pci_disable_legacy(const ddf_dev_t *device)113 int disable_legacy(const ddf_dev_t *device) 119 114 { 120 115 assert(device); 121 116 122 async_sess_t *parent_sess = 123 devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle, 124 IPC_FLAG_BLOCKING); 117 async_sess_t *parent_sess = devman_parent_device_connect( 118 EXCHANGE_SERIALIZE, device->handle, IPC_FLAG_BLOCKING); 125 119 if (!parent_sess) 126 120 return ENOMEM; 127 121 128 /* See UHCI design guide for these values p.45, 129 * write all WC bits in USB legacy register */ 130 const sysarg_t address = 0xc0; 131 const sysarg_t value = 0xaf00; 122 /* See UHCI design guide page 45 for these values. 123 * Write all WC bits in USB legacy register */ 124 const int rc = pci_config_space_write_16(parent_sess, 0xc0, 0xaf00); 132 125 133 async_exch_t *exch = async_exchange_begin(parent_sess);134 135 const int rc = async_req_3_0(exch, DEV_IFACE_ID(PCI_DEV_IFACE),136 IPC_M_CONFIG_SPACE_WRITE_16, address, value);137 138 async_exchange_end(exch);139 126 async_hangup(parent_sess); 140 141 127 return rc; 142 128 } -
uspace/drv/bus/usb/uhci/res.h
r43cd499 r14f8fd4 38 38 #include <ddf/driver.h> 39 39 40 int pci_get_my_registers(const ddf_dev_t *, uintptr_t *, size_t *, int *);41 int pci_enable_interrupts(const ddf_dev_t *);42 int pci_disable_legacy(const ddf_dev_t *);40 int get_my_registers(const ddf_dev_t *, uintptr_t *, size_t *, int *); 41 int enable_interrupts(const ddf_dev_t *); 42 int disable_legacy(const ddf_dev_t *); 43 43 44 44 #endif -
uspace/drv/bus/usb/uhci/uhci.c
r43cd499 r14f8fd4 41 41 42 42 #include "uhci.h" 43 #include "pci.h" 44 43 44 #include "res.h" 45 45 #include "hc.h" 46 46 #include "root_hub.h" … … 49 49 * and USB root hub */ 50 50 typedef struct uhci { 51 /** Pointer to DDF represen ation of UHCI host controller */51 /** Pointer to DDF representation of UHCI host controller */ 52 52 ddf_fun_t *hc_fun; 53 /** Pointer to DDF represen ation of UHCI root hub */53 /** Pointer to DDF representation of UHCI root hub */ 54 54 ddf_fun_t *rh_fun; 55 55 56 /** Internal driver's represen ation of UHCI host controller */56 /** Internal driver's representation of UHCI host controller */ 57 57 hc_t hc; 58 /** Internal driver's represen ation of UHCI root hub */58 /** Internal driver's representation of UHCI root hub */ 59 59 rh_t rh; 60 60 } uhci_t; … … 187 187 int irq = 0; 188 188 189 ret = pci_get_my_registers(device, ®_base, ®_size, &irq);189 ret = get_my_registers(device, ®_base, ®_size, &irq); 190 190 CHECK_RET_DEST_FREE_RETURN(ret, 191 191 "Failed to get I/O addresses for %" PRIun ": %s.\n", … … 194 194 (void *) reg_base, reg_size, irq); 195 195 196 ret = pci_disable_legacy(device);196 ret = disable_legacy(device); 197 197 CHECK_RET_DEST_FREE_RETURN(ret, 198 198 "Failed to disable legacy USB: %s.\n", str_error(ret)); … … 220 220 221 221 bool interrupts = false; 222 ret = pci_enable_interrupts(device);222 ret = enable_interrupts(device); 223 223 if (ret != EOK) { 224 224 usb_log_warning("Failed to enable interrupts: %s." -
uspace/lib/c/arch/amd64/include/fibril.h
r43cd499 r14f8fd4 38 38 #include <sys/types.h> 39 39 40 /* According to ABI the stack MUST be aligned on 40 /* 41 * According to ABI the stack MUST be aligned on 41 42 * 16-byte boundary. If it is not, the va_arg calling will 42 43 * panic sooner or later 43 44 */ 44 #define SP_DELTA 45 #define SP_DELTA 16 45 46 46 47 #define context_set(c, _pc, stack, size, ptls) \ -
uspace/lib/c/arch/arm32/include/fibril.h
r43cd499 r14f8fd4 27 27 */ 28 28 29 /** @addtogroup libcarm32 29 /** @addtogroup libcarm32 30 30 * @{ 31 31 */ … … 42 42 43 43 /** Size of a stack item */ 44 #define STACK_ITEM_SIZE 44 #define STACK_ITEM_SIZE 4 45 45 46 46 /** Stack alignment - see <a href="http://www.arm.com/support/faqdev/14269.html">ABI</a> for details */ 47 #define STACK_ALIGNMENT 47 #define STACK_ALIGNMENT 8 48 48 49 #define SP_DELTA 49 #define SP_DELTA (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) 50 50 51 51 52 /** Sets data to the context. 53 * 52 /** Sets data to the context. 53 * 54 54 * @param c Context (#context_t). 55 55 * @param _pc Program counter. … … 62 62 (c)->pc = (sysarg_t) (_pc); \ 63 63 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 64 64 (c)->tls = ((sysarg_t)(ptls)) + sizeof(tcb_t) + ARM_TP_OFFSET; \ 65 65 (c)->fp = 0; \ 66 66 } while (0) 67 67 68 /** Fibril context. 68 /** Fibril context. 69 69 * 70 70 * Only registers preserved accross function calls are included. r9 is used … … 91 91 } 92 92 93 94 93 #endif 95 94 -
uspace/lib/c/arch/ia32/include/fibril.h
r43cd499 r14f8fd4 38 38 #include <sys/types.h> 39 39 40 /* According to ABI the stack MUST be aligned on 40 /* 41 * According to ABI the stack MUST be aligned on 41 42 * 16-byte boundary. If it is not, the va_arg calling will 42 43 * panic sooner or later -
uspace/lib/c/arch/ia64/include/fibril.h
r43cd499 r14f8fd4 27 27 */ 28 28 29 /** @addtogroup libcia64 29 /** @addtogroup libcia64 30 30 * @{ 31 31 */ … … 45 45 * No need to allocate scratch area. 46 46 */ 47 #define SP_DELTA 47 #define SP_DELTA (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) 48 48 49 #define PFM_MASK 49 #define PFM_MASK (~0x3fffffffff) 50 50 51 #define PSTHREAD_INITIAL_STACK_PAGES_NO 2 51 #define PSTHREAD_INITIAL_STACK_PAGES_NO 2 52 52 53 /* Stack is divided into two equal parts (for memory stack and register stack). */ 53 #define PSTHREAD_INITIAL_STACK_DIVISION 254 #define PSTHREAD_INITIAL_STACK_DIVISION 2 54 55 55 #define context_set(c, _pc, stack, size, tls) \ 56 do { \ 57 (c)->pc = (uint64_t) _pc; \ 58 (c)->bsp = ((uint64_t) stack) + size / PSTHREAD_INITIAL_STACK_DIVISION; \ 59 (c)->ar_pfs &= PFM_MASK; \ 60 (c)->sp = ((uint64_t) stack) + ALIGN_UP((size / PSTHREAD_INITIAL_STACK_DIVISION), STACK_ALIGNMENT) - SP_DELTA; \ 61 (c)->tp = (uint64_t) tls; \ 62 } while (0); 63 56 #define context_set(c, _pc, stack, size, tls) \ 57 do { \ 58 (c)->pc = (uint64_t) _pc; \ 59 (c)->bsp = ((uint64_t) stack) + \ 60 size / PSTHREAD_INITIAL_STACK_DIVISION; \ 61 (c)->ar_pfs &= PFM_MASK; \ 62 (c)->sp = ((uint64_t) stack) + \ 63 ALIGN_UP((size / PSTHREAD_INITIAL_STACK_DIVISION), STACK_ALIGNMENT) - \ 64 SP_DELTA; \ 65 (c)->tp = (uint64_t) tls; \ 66 } while (0) 64 67 65 68 /* -
uspace/lib/c/arch/mips32/Makefile.inc
r43cd499 r14f8fd4 28 28 29 29 ARCH_SOURCES = \ 30 arch/$(UARCH)/src/entry. s\31 arch/$(UARCH)/src/entryjmp. s\32 arch/$(UARCH)/src/thread_entry. s\30 arch/$(UARCH)/src/entry.S \ 31 arch/$(UARCH)/src/entryjmp.S \ 32 arch/$(UARCH)/src/thread_entry.S \ 33 33 arch/$(UARCH)/src/syscall.c \ 34 34 arch/$(UARCH)/src/fibril.S \ -
uspace/lib/c/arch/mips32/include/atomic.h
r43cd499 r14f8fd4 67 67 " ll %0, %1\n" 68 68 " addu %0, %0, %3\n" /* same as add, but never traps on overflow */ 69 " 69 " move %2, %0\n" 70 70 " sc %0, %1\n" 71 71 " beq %0, %4, 1b\n" /* if the atomic operation failed, try again */ -
uspace/lib/c/arch/mips32/include/config.h
r43cd499 r14f8fd4 36 36 #define LIBC_mips32_CONFIG_H_ 37 37 38 #define PAGE_WIDTH 39 #define PAGE_SIZE 38 #define PAGE_WIDTH 14 39 #define PAGE_SIZE (1 << PAGE_WIDTH) 40 40 41 41 #endif -
uspace/lib/c/arch/mips32/include/faddr.h
r43cd499 r14f8fd4 38 38 #include <libarch/types.h> 39 39 40 #define FADDR(fptr) 40 #define FADDR(fptr) ((uintptr_t) (fptr)) 41 41 42 42 #endif -
uspace/lib/c/arch/mips32/include/fibril.h
r43cd499 r14f8fd4 38 38 39 39 #include <sys/types.h> 40 #include <libarch/stack.h> 41 #include <align.h> 40 42 41 /* We define our own context_set, because we need to set 42 * the TLS pointer to the tcb+0x7000 43 #define SP_DELTA (ABI_STACK_FRAME + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) 44 45 /* 46 * We define our own context_set, because we need to set 47 * the TLS pointer to the tcb + 0x7000 43 48 * 44 49 * See tls_set in thread.h 45 50 */ 46 #define context_set(c, _pc, stack, size, ptls) \ 47 (c)->pc = (sysarg_t) (_pc); \ 48 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 49 (c)->tls = ((sysarg_t)(ptls)) + 0x7000 + sizeof(tcb_t); 50 51 52 /* +16 is just for sure that the called function 53 * have space to store it's arguments 54 */ 55 #define SP_DELTA (8+16) 51 #define context_set(c, _pc, stack, size, ptls) \ 52 do { \ 53 (c)->pc = (sysarg_t) (_pc); \ 54 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 55 (c)->tls = ((sysarg_t)(ptls)) + 0x7000 + sizeof(tcb_t); \ 56 } while (0) 56 57 57 58 typedef struct { -
uspace/lib/c/arch/mips32/src/entry.S
r43cd499 r14f8fd4 27 27 # 28 28 29 #include <libarch/stack.h> 30 29 31 .text 30 32 .section .init, "ax" … … 41 43 .ent __entry 42 44 __entry: 43 .frame $sp, 32, $3144 .cpload $ 2545 .frame $sp, ABI_STACK_FRAME, $ra 46 .cpload $t9 45 47 46 # FIXME: Reflect exactly ABI specs here 48 # Allocate the stack frame. 49 addiu $sp, -ABI_STACK_FRAME 47 50 48 addiu $sp, -3249 .cprestore 16 # Allow PIC code51 # Allow PIC code 52 .cprestore 16 50 53 51 # Pass pcb_ptr to __main() as the first argument. pcb_ptris already54 # Pass pcb_ptr to __main() as the first argument. It is already 52 55 # in $a0. As the first argument is passed in $a0, no operation 53 56 # is needed. … … 55 58 jal __main 56 59 nop 57 .end 60 61 # 62 # Not reached. 63 # 64 addiu $sp, ABI_STACK_FRAME 65 .end __entry -
uspace/lib/c/arch/mips32/src/entryjmp.S
r43cd499 r14f8fd4 27 27 # 28 28 29 #include <libarch/stack.h> 30 29 31 .text 30 32 .section .text … … 41 43 entry_point_jmp: 42 44 # tmp := entry_point 43 move $ 25, $a045 move $t9, $a0 44 46 45 47 # Pass pcb to the entry point in $a0 46 48 move $a0, $a1 47 jr $25 48 nop 49 .end 49 50 jr $t9 51 addiu $sp, -ABI_STACK_FRAME 52 addiu $sp, ABI_STACK_FRAME 53 .end entry_point_jmp -
uspace/lib/c/arch/mips32/src/fibril.S
r43cd499 r14f8fd4 33 33 34 34 #include <libarch/context_offset.h> 35 35 36 36 .global context_save 37 37 .global context_restore 38 38 39 39 context_save: 40 40 CONTEXT_SAVE_ARCH_CORE $a0 41 41 42 42 # context_save returns 1 43 43 j $ra 44 li $v0, 1 45 44 li $v0, 1 45 46 46 context_restore: 47 47 CONTEXT_RESTORE_ARCH_CORE $a0 48 49 # Just for the jump into first function, but one instruction 50 # should not bother us 51 move $t9, $ra 48 49 # Just for the jump into first function, 50 # but one instruction should not bother us 51 move $t9, $ra 52 52 53 # context_restore returns 0 53 54 j $ra 54 xor $v0, $v0 55 55 xor $v0, $v0 -
uspace/lib/c/arch/mips32/src/syscall.c
r43cd499 r14f8fd4 57 57 "r" (__mips_reg_t1), 58 58 "r" (__mips_reg_v0) 59 : "%ra" /* We are a function call, although C does not 60 * know it */ 59 /* 60 * We are a function call, although C 61 * does not know it. 62 */ 63 : "%ra" 61 64 ); 62 65 -
uspace/lib/c/arch/mips32/src/thread_entry.S
r43cd499 r14f8fd4 27 27 # 28 28 29 #include <libarch/stack.h> 30 29 31 .text 30 32 … … 40 42 .ent __thread_entry 41 43 __thread_entry: 42 .frame $sp, 32, $3143 .cpload $ 2544 .frame $sp, ABI_STACK_FRAME, $ra 45 .cpload $t9 44 46 45 47 # 46 48 # v0 contains address of uarg. 47 49 # 48 add $ 4, $2, 050 add $a0, $v0, 0 49 51 50 addiu $sp, -32 52 # Allocate the stack frame. 53 addiu $sp, -ABI_STACK_FRAME 54 55 # Allow PIC code 51 56 .cprestore 16 52 57 … … 57 62 # Not reached. 58 63 # 64 addiu $sp, ABI_STACK_FRAME 59 65 .end __thread_entry -
uspace/lib/c/arch/mips32eb/Makefile.inc
r43cd499 r14f8fd4 28 28 29 29 ARCH_SOURCES = \ 30 arch/$(UARCH)/src/entry. s\31 arch/$(UARCH)/src/entryjmp. s\32 arch/$(UARCH)/src/thread_entry. s\30 arch/$(UARCH)/src/entry.S \ 31 arch/$(UARCH)/src/entryjmp.S \ 32 arch/$(UARCH)/src/thread_entry.S \ 33 33 arch/$(UARCH)/src/syscall.c \ 34 34 arch/$(UARCH)/src/fibril.S \ -
uspace/lib/c/arch/mips64/Makefile.inc
r43cd499 r14f8fd4 28 28 29 29 ARCH_SOURCES = \ 30 arch/$(UARCH)/src/entry. s\31 arch/$(UARCH)/src/entryjmp. s\32 arch/$(UARCH)/src/thread_entry. s\30 arch/$(UARCH)/src/entry.S \ 31 arch/$(UARCH)/src/entryjmp.S \ 32 arch/$(UARCH)/src/thread_entry.S \ 33 33 arch/$(UARCH)/src/syscall.c \ 34 34 arch/$(UARCH)/src/fibril.S \ -
uspace/lib/c/arch/mips64/include/fibril.h
r43cd499 r14f8fd4 38 38 39 39 #include <sys/types.h> 40 #include <libarch/stack.h> 41 #include <align.h> 40 42 41 /* We define our own context_set, because we need to set 42 * the TLS pointer to the tcb+0x7000 43 #define SP_DELTA (ABI_STACK_FRAME + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) 44 45 /* 46 * We define our own context_set, because we need to set 47 * the TLS pointer to the tcb + 0x7000 43 48 * 44 49 * See tls_set in thread.h 45 50 */ 46 51 #define context_set(c, _pc, stack, size, ptls) \ 47 (c)->pc = (sysarg_t) (_pc); \ 48 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 49 (c)->tls = ((sysarg_t)(ptls)) + 0x7000 + sizeof(tcb_t); 50 51 /* +16 is just for sure that the called function 52 * have space to store it's arguments 53 */ 54 #define SP_DELTA (8 + 16) 52 do { \ 53 (c)->pc = (sysarg_t) (_pc); \ 54 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 55 (c)->tls = ((sysarg_t)(ptls)) + 0x7000 + sizeof(tcb_t); \ 56 } while (0) 55 57 56 58 typedef struct { -
uspace/lib/c/arch/mips64/src/entry.S
r43cd499 r14f8fd4 27 27 # 28 28 29 #include <libarch/stack.h> 30 29 31 .text 30 32 .section .init, "ax" … … 41 43 .ent __entry 42 44 __entry: 43 .frame $sp, 32, $31 44 .cpload $25 45 46 # Mips o32 may store its arguments on stack, make space (16 bytes), 47 # so that it could work with -O0 48 # Make space additional 16 bytes for the stack frame 49 50 addiu $sp, -32 51 .cprestore 16 # Allow PIC code 52 53 # Pass pcb_ptr to __main() as the first argument. pcb_ptr is already 45 .frame $sp, ABI_STACK_FRAME, $ra 46 .cpload $t9 47 48 # Allocate the stack frame. 49 addiu $sp, -ABI_STACK_FRAME 50 51 # Allow PIC code 52 .cprestore 16 53 54 # Pass pcb_ptr to __main() as the first argument. It is already 54 55 # in $a0. As the first argument is passed in $a0, no operation 55 56 # is needed. 56 57 57 58 jal __main 58 59 nop 59 .end 60 61 # 62 # Not reached. 63 # 64 addiu $sp, ABI_STACK_FRAME 65 .end __entry -
uspace/lib/c/arch/mips64/src/entryjmp.S
r43cd499 r14f8fd4 27 27 # 28 28 29 #include <libarch/stack.h> 30 29 31 .text 30 32 .section .text … … 34 36 ## void entry_point_jmp(void *entry_point, void *pcb); 35 37 # 36 # $a0 (=$4) 37 # $a1 (=$5) 38 # $a0 (=$4) contains entry_point 39 # $a1 (=$5) contains pcb 38 40 # 39 41 # Jump to program entry point … … 41 43 entry_point_jmp: 42 44 # tmp := entry_point 43 move $ 25, $a044 45 move $t9, $a0 46 45 47 # Pass pcb to the entry point in $a0 46 48 move $a0, $a1 47 jr $25 48 nop 49 .end 49 50 jr $t9 51 addiu $sp, -ABI_STACK_FRAME 52 addiu $sp, ABI_STACK_FRAME 53 .end entry_point_jmp -
uspace/lib/c/arch/mips64/src/thread_entry.S
r43cd499 r14f8fd4 27 27 # 28 28 29 #include <libarch/stack.h> 30 29 31 .text 30 32 31 33 .set noat 32 34 .set noreorder 33 35 .option pic2 34 36 35 37 .globl __thread_entry 36 38 … … 40 42 .ent __thread_entry 41 43 __thread_entry: 42 .frame $sp, 32, $3143 .cpload $ 2544 44 .frame $sp, ABI_STACK_FRAME, $ra 45 .cpload $t9 46 45 47 # 46 48 # v0 contains address of uarg. 47 49 # 48 add $4, $2, 0 49 # Mips o32 may store its arguments on stack, make space 50 addiu $sp, -32 50 add $a0, $v0, 0 51 52 # Allocate the stack frame. 53 addiu $sp, -ABI_STACK_FRAME 54 55 # Allow PIC code 51 56 .cprestore 16 52 57 53 58 jal __thread_main 54 59 nop 55 60 56 61 # 57 62 # Not reached. 58 63 # 64 addiu $sp, ABI_STACK_FRAME 59 65 .end __thread_entry -
uspace/lib/c/arch/ppc32/include/fibril.h
r43cd499 r14f8fd4 27 27 */ 28 28 29 /** @addtogroup libcppc32 29 /** @addtogroup libcppc32 30 30 * @{ 31 31 */ … … 38 38 #include <sys/types.h> 39 39 40 /* We define our own context_set, because we need to set 41 * the TLS pointer to the tcb+0x7000 40 #define SP_DELTA 16 41 42 /* 43 * We define our own context_set, because we need to set 44 * the TLS pointer to the tcb + 0x7000 42 45 * 43 46 * See tls_set in thread.h 44 47 */ 45 #define context_set(c, _pc, stack, size, ptls) 46 (c)->pc = (sysarg_t) (_pc);\47 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA;\48 (c)->tls = ((sysarg_t) (ptls)) + 0x7000 + sizeof(tcb_t);49 50 #define SP_DELTA 16 48 #define context_set(c, _pc, stack, size, ptls) \ 49 do { \ 50 (c)->pc = (sysarg_t) (_pc); \ 51 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 52 (c)->tls = ((sysarg_t) (ptls)) + 0x7000 + sizeof(tcb_t); \ 53 } while (0) 51 54 52 55 typedef struct { -
uspace/lib/c/arch/sparc64/include/fibril.h
r43cd499 r14f8fd4 40 40 #include <align.h> 41 41 42 #define SP_DELTA 42 #define SP_DELTA (STACK_WINDOW_SAVE_AREA_SIZE + STACK_ARG_SAVE_AREA_SIZE) 43 43 44 44 #define context_set(c, _pc, stack, size, ptls) \ … … 50 50 (c)->tp = (uint64_t) ptls; \ 51 51 } while (0) 52 52 53 53 /* 54 54 * Save only registers that must be preserved across -
uspace/lib/c/generic/str.c
r43cd499 r14f8fd4 259 259 260 260 return offset; 261 } 262 263 /** Get size of string with size limit. 264 * 265 * Get the number of bytes which are used by the string @a str 266 * (excluding the NULL-terminator), but no more than @max_size bytes. 267 * 268 * @param str String to consider. 269 * @param max_size Maximum number of bytes to measure. 270 * 271 * @return Number of bytes used by the string 272 * 273 */ 274 size_t str_nsize(const char *str, size_t max_size) 275 { 276 size_t size = 0; 277 278 while ((*str++ != 0) && (size < max_size)) 279 size++; 280 281 return size; 282 } 283 284 /** Get size of wide string with size limit. 285 * 286 * Get the number of bytes which are used by the wide string @a str 287 * (excluding the NULL-terminator), but no more than @max_size bytes. 288 * 289 * @param str Wide string to consider. 290 * @param max_size Maximum number of bytes to measure. 291 * 292 * @return Number of bytes used by the wide string 293 * 294 */ 295 size_t wstr_nsize(const wchar_t *str, size_t max_size) 296 { 297 return (wstr_nlength(str, max_size) * sizeof(wchar_t)); 261 298 } 262 299 -
uspace/lib/c/generic/sysinfo.c
r43cd499 r14f8fd4 40 40 #include <bool.h> 41 41 42 /** Get sysinfo keys size 43 * 44 * @param path Sysinfo path. 45 * @param value Pointer to store the keys size. 46 * 47 * @return EOK if the keys were successfully read. 48 * 49 */ 50 static int sysinfo_get_keys_size(const char *path, size_t *size) 51 { 52 return (int) __SYSCALL3(SYS_SYSINFO_GET_KEYS_SIZE, (sysarg_t) path, 53 (sysarg_t) str_size(path), (sysarg_t) size); 54 } 55 56 /** Get sysinfo keys 57 * 58 * @param path Sysinfo path. 59 * @param value Pointer to store the keys size. 60 * 61 * @return Keys read from sysinfo or NULL if the 62 * sysinfo item has no subkeys. 63 * The returned non-NULL pointer should be 64 * freed by free(). 65 * 66 */ 67 char *sysinfo_get_keys(const char *path, size_t *size) 68 { 69 /* 70 * The size of the keys might change during time. 71 * Unfortunatelly we cannot allocate the buffer 72 * and transfer the keys as a single atomic operation. 73 */ 74 75 /* Get the keys size */ 76 int ret = sysinfo_get_keys_size(path, size); 77 if ((ret != EOK) || (size == 0)) { 78 /* 79 * Item with no subkeys. 80 */ 81 *size = 0; 82 return NULL; 83 } 84 85 char *data = malloc(*size); 86 if (data == NULL) { 87 *size = 0; 88 return NULL; 89 } 90 91 /* Get the data */ 92 size_t sz; 93 ret = __SYSCALL5(SYS_SYSINFO_GET_KEYS, (sysarg_t) path, 94 (sysarg_t) str_size(path), (sysarg_t) data, (sysarg_t) *size, 95 (sysarg_t) &sz); 96 if (ret == EOK) { 97 *size = sz; 98 return data; 99 } 100 101 free(data); 102 *size = 0; 103 return NULL; 104 } 105 42 106 /** Get sysinfo item type 43 107 * … … 70 134 /** Get sysinfo binary data size 71 135 * 72 * @param path 73 * @param value Pointer to store the binary data size.136 * @param path Sysinfo path. 137 * @param size Pointer to store the binary data size. 74 138 * 75 139 * @return EOK if the value was successfully read and … … 85 149 /** Get sysinfo binary data 86 150 * 87 * @param path 88 * @param value Pointer to store the binary data size.151 * @param path Sysinfo path. 152 * @param size Pointer to store the binary data size. 89 153 * 90 154 * @return Binary data read from sysinfo or NULL if the … … 134 198 } 135 199 200 /** Get sysinfo property 201 * 202 * @param path Sysinfo path. 203 * @param name Property name. 204 * @param size Pointer to store the binary data size. 205 * 206 * @return Property value read from sysinfo or NULL if the 207 * sysinfo item value type is not binary data. 208 * The returned non-NULL pointer should be 209 * freed by free(). 210 * 211 */ 212 void *sysinfo_get_property(const char *path, const char *name, size_t *size) 213 { 214 size_t total_size; 215 void *data = sysinfo_get_data(path, &total_size); 216 if ((data == NULL) || (total_size == 0)) { 217 *size = 0; 218 return NULL; 219 } 220 221 size_t pos = 0; 222 while (pos < total_size) { 223 /* Process each property with sanity checks */ 224 size_t cur_size = str_nsize(data + pos, total_size - pos); 225 if (((char *) data)[pos + cur_size] != 0) 226 break; 227 228 bool found = (str_cmp(data + pos, name) == 0); 229 230 pos += cur_size + 1; 231 if (pos >= total_size) 232 break; 233 234 /* Process value size */ 235 size_t value_size; 236 memcpy(&value_size, data + pos, sizeof(value_size)); 237 238 pos += sizeof(value_size); 239 if ((pos >= total_size) || (pos + value_size > total_size)) 240 break; 241 242 if (found) { 243 void *value = malloc(value_size); 244 if (value == NULL) 245 break; 246 247 memcpy(value, data + pos, value_size); 248 free(data); 249 250 *size = value_size; 251 return value; 252 } 253 254 pos += value_size; 255 } 256 257 free(data); 258 259 *size = 0; 260 return NULL; 261 } 262 136 263 /** @} 137 264 */ -
uspace/lib/c/include/fibril.h
r43cd499 r14f8fd4 41 41 42 42 #define context_set_generic(c, _pc, stack, size, ptls) \ 43 (c)->pc = (sysarg_t) (_pc); \ 44 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 45 (c)->tls = (sysarg_t) (ptls); 43 do { \ 44 (c)->pc = (sysarg_t) (_pc); \ 45 (c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ 46 (c)->tls = (sysarg_t) (ptls); \ 47 } while (0) 46 48 47 49 #define FIBRIL_SERIALIZED 1 -
uspace/lib/c/include/str.h
r43cd499 r14f8fd4 60 60 extern size_t str_size(const char *str); 61 61 extern size_t wstr_size(const wchar_t *str); 62 63 extern size_t str_nsize(const char *str, size_t max_size); 64 extern size_t wstr_nsize(const wchar_t *str, size_t max_size); 62 65 63 66 extern size_t str_lsize(const char *str, size_t max_len); -
uspace/lib/c/include/sysinfo.h
r43cd499 r14f8fd4 40 40 #include <abi/sysinfo.h> 41 41 42 extern char *sysinfo_get_keys(const char *, size_t *); 42 43 extern sysinfo_item_val_type_t sysinfo_get_val_type(const char *); 43 44 extern int sysinfo_get_value(const char *, sysarg_t *); 44 45 extern void *sysinfo_get_data(const char *, size_t *); 46 extern void *sysinfo_get_property(const char *, const char *, size_t *); 45 47 46 48 #endif -
uspace/srv/fs/exfat/exfat_bitmap.c
r43cd499 r14f8fd4 48 48 49 49 50 int bitmap_is_free(exfat_bs_t *bs, service_id_t service_id,50 int exfat_bitmap_is_free(exfat_bs_t *bs, service_id_t service_id, 51 51 exfat_cluster_t clst) 52 52 { … … 89 89 } 90 90 91 int bitmap_set_cluster(exfat_bs_t *bs, service_id_t service_id,91 int exfat_bitmap_set_cluster(exfat_bs_t *bs, service_id_t service_id, 92 92 exfat_cluster_t clst) 93 93 { … … 124 124 } 125 125 126 int bitmap_clear_cluster(exfat_bs_t *bs, service_id_t service_id,126 int exfat_bitmap_clear_cluster(exfat_bs_t *bs, service_id_t service_id, 127 127 exfat_cluster_t clst) 128 128 { … … 160 160 } 161 161 162 int bitmap_set_clusters(exfat_bs_t *bs, service_id_t service_id,162 int exfat_bitmap_set_clusters(exfat_bs_t *bs, service_id_t service_id, 163 163 exfat_cluster_t firstc, exfat_cluster_t count) 164 164 { … … 168 168 169 169 while (clst < firstc + count ) { 170 rc = bitmap_set_cluster(bs, service_id, clst);170 rc = exfat_bitmap_set_cluster(bs, service_id, clst); 171 171 if (rc != EOK) { 172 172 if (clst - firstc > 0) 173 (void) bitmap_clear_clusters(bs, service_id,173 (void) exfat_bitmap_clear_clusters(bs, service_id, 174 174 firstc, clst - firstc); 175 175 return rc; … … 180 180 } 181 181 182 int bitmap_clear_clusters(exfat_bs_t *bs, service_id_t service_id,182 int exfat_bitmap_clear_clusters(exfat_bs_t *bs, service_id_t service_id, 183 183 exfat_cluster_t firstc, exfat_cluster_t count) 184 184 { … … 188 188 189 189 while (clst < firstc + count) { 190 rc = bitmap_clear_cluster(bs, service_id, clst);190 rc = exfat_bitmap_clear_cluster(bs, service_id, clst); 191 191 if (rc != EOK) 192 192 return rc; … … 196 196 } 197 197 198 int bitmap_alloc_clusters(exfat_bs_t *bs, service_id_t service_id,198 int exfat_bitmap_alloc_clusters(exfat_bs_t *bs, service_id_t service_id, 199 199 exfat_cluster_t *firstc, exfat_cluster_t count) 200 200 { … … 204 204 while (startc < DATA_CNT(bs) + 2) { 205 205 endc = startc; 206 while ( bitmap_is_free(bs, service_id, endc) == EOK) {206 while (exfat_bitmap_is_free(bs, service_id, endc) == EOK) { 207 207 if ((endc - startc) + 1 == count) { 208 208 *firstc = startc; 209 return bitmap_set_clusters(bs, service_id, startc, count);209 return exfat_bitmap_set_clusters(bs, service_id, startc, count); 210 210 } else 211 211 endc++; … … 217 217 218 218 219 int bitmap_append_clusters(exfat_bs_t *bs, exfat_node_t *nodep,219 int exfat_bitmap_append_clusters(exfat_bs_t *bs, exfat_node_t *nodep, 220 220 exfat_cluster_t count) 221 221 { 222 222 if (nodep->firstc == 0) { 223 return bitmap_alloc_clusters(bs, nodep->idx->service_id,223 return exfat_bitmap_alloc_clusters(bs, nodep->idx->service_id, 224 224 &nodep->firstc, count); 225 225 } else { … … 228 228 229 229 clst = lastc + 1; 230 while ( bitmap_is_free(bs, nodep->idx->service_id, clst) == EOK) {230 while (exfat_bitmap_is_free(bs, nodep->idx->service_id, clst) == EOK) { 231 231 if (clst - lastc == count){ 232 return bitmap_set_clusters(bs, nodep->idx->service_id,232 return exfat_bitmap_set_clusters(bs, nodep->idx->service_id, 233 233 lastc + 1, count); 234 234 } else … … 240 240 241 241 242 int bitmap_free_clusters(exfat_bs_t *bs, exfat_node_t *nodep,242 int exfat_bitmap_free_clusters(exfat_bs_t *bs, exfat_node_t *nodep, 243 243 exfat_cluster_t count) 244 244 { … … 247 247 lastc -= count; 248 248 249 return bitmap_clear_clusters(bs, nodep->idx->service_id, lastc + 1, count);250 } 251 252 253 int bitmap_replicate_clusters(exfat_bs_t *bs, exfat_node_t *nodep)249 return exfat_bitmap_clear_clusters(bs, nodep->idx->service_id, lastc + 1, count); 250 } 251 252 253 int exfat_bitmap_replicate_clusters(exfat_bs_t *bs, exfat_node_t *nodep) 254 254 { 255 255 int rc; -
uspace/srv/fs/exfat/exfat_bitmap.h
r43cd499 r14f8fd4 42 42 struct exfat_bs; 43 43 44 extern int bitmap_alloc_clusters(struct exfat_bs *, service_id_t,44 extern int exfat_bitmap_alloc_clusters(struct exfat_bs *, service_id_t, 45 45 exfat_cluster_t *, exfat_cluster_t); 46 extern int bitmap_append_clusters(struct exfat_bs *, struct exfat_node *,46 extern int exfat_bitmap_append_clusters(struct exfat_bs *, struct exfat_node *, 47 47 exfat_cluster_t); 48 extern int bitmap_free_clusters(struct exfat_bs *, struct exfat_node *,48 extern int exfat_bitmap_free_clusters(struct exfat_bs *, struct exfat_node *, 49 49 exfat_cluster_t); 50 extern int bitmap_replicate_clusters(struct exfat_bs *, struct exfat_node *);50 extern int exfat_bitmap_replicate_clusters(struct exfat_bs *, struct exfat_node *); 51 51 52 extern int bitmap_is_free(struct exfat_bs *, service_id_t, exfat_cluster_t);53 extern int bitmap_set_cluster(struct exfat_bs *, service_id_t, exfat_cluster_t);54 extern int bitmap_clear_cluster(struct exfat_bs *, service_id_t,52 extern int exfat_bitmap_is_free(struct exfat_bs *, service_id_t, exfat_cluster_t); 53 extern int exfat_bitmap_set_cluster(struct exfat_bs *, service_id_t, exfat_cluster_t); 54 extern int exfat_bitmap_clear_cluster(struct exfat_bs *, service_id_t, 55 55 exfat_cluster_t); 56 56 57 extern int bitmap_set_clusters(struct exfat_bs *, service_id_t,57 extern int exfat_bitmap_set_clusters(struct exfat_bs *, service_id_t, 58 58 exfat_cluster_t, exfat_cluster_t); 59 extern int bitmap_clear_clusters(struct exfat_bs *, service_id_t,59 extern int exfat_bitmap_clear_clusters(struct exfat_bs *, service_id_t, 60 60 exfat_cluster_t, exfat_cluster_t); 61 61 -
uspace/srv/fs/exfat/exfat_dentry.c
r43cd499 r14f8fd4 130 130 } 131 131 132 size_t utf16_length(const uint16_t *wstr)132 size_t exfat_utf16_length(const uint16_t *wstr) 133 133 { 134 134 size_t len = 0; -
uspace/srv/fs/exfat/exfat_dentry.h
r43cd499 r14f8fd4 160 160 extern bool exfat_valid_name(const char *); 161 161 162 extern size_t utf16_length(const uint16_t *);162 extern size_t exfat_utf16_length(const uint16_t *); 163 163 164 164 -
uspace/srv/fs/exfat/exfat_directory.c
r43cd499 r14f8fd4 371 371 ds.stream.valid_data_size = 0; 372 372 ds.stream.data_size = 0; 373 ds.stream.name_size = utf16_length(wname);373 ds.stream.name_size = exfat_utf16_length(wname); 374 374 ds.stream.hash = host2uint16_t_le(exfat_name_hash(wname, uctable, 375 375 uctable_chars)); -
uspace/srv/fs/exfat/exfat_fat.c
r43cd499 r14f8fd4 314 314 clst++) { 315 315 /* Need to rewrite because of multiple exfat_bitmap_get calls */ 316 if ( bitmap_is_free(bs, service_id, clst) == EOK) {316 if (exfat_bitmap_is_free(bs, service_id, clst) == EOK) { 317 317 /* 318 318 * The cluster is free. Put it into our stack … … 325 325 goto exit_error; 326 326 found++; 327 rc = bitmap_set_cluster(bs, service_id, clst);327 rc = exfat_bitmap_set_cluster(bs, service_id, clst); 328 328 if (rc != EOK) 329 329 goto exit_error; … … 346 346 /* If something wrong - free the clusters */ 347 347 while (found--) { 348 (void) bitmap_clear_cluster(bs, service_id, lifo[found]);348 (void) exfat_bitmap_clear_cluster(bs, service_id, lifo[found]); 349 349 (void) exfat_set_cluster(bs, service_id, lifo[found], 0); 350 350 } … … 378 378 if (rc != EOK) 379 379 return rc; 380 rc = bitmap_clear_cluster(bs, service_id, firstc);380 rc = exfat_bitmap_clear_cluster(bs, service_id, firstc); 381 381 if (rc != EOK) 382 382 return rc; -
uspace/srv/fs/exfat/exfat_ops.c
r43cd499 r14f8fd4 405 405 406 406 if (!nodep->fragmented) { 407 rc = bitmap_append_clusters(bs, nodep, clusters);407 rc = exfat_bitmap_append_clusters(bs, nodep, clusters); 408 408 if (rc != ENOSPC) 409 409 return rc; … … 411 411 nodep->fragmented = true; 412 412 nodep->dirty = true; /* need to sync node */ 413 rc = bitmap_replicate_clusters(bs, nodep);413 rc = exfat_bitmap_replicate_clusters(bs, nodep); 414 414 if (rc != EOK) 415 415 return rc; … … 457 457 458 458 clsts = prev_clsts - new_clsts; 459 rc = bitmap_free_clusters(bs, nodep, clsts);459 rc = exfat_bitmap_free_clusters(bs, nodep, clsts); 460 460 if (rc != EOK) 461 461 return rc; … … 704 704 nodep->firstc); 705 705 else 706 rc = bitmap_free_clusters(bs, nodep,706 rc = exfat_bitmap_free_clusters(bs, nodep, 707 707 ROUND_UP(nodep->size, BPC(bs)) / BPC(bs)); 708 708 } … … 758 758 759 759 fibril_mutex_unlock(&parentp->idx->lock); 760 if (rc != EOK)761 return rc;762 763 760 fibril_mutex_lock(&childp->idx->lock); 764 765 761 766 762 childp->idx->pfc = parentp->firstc; … … 1463 1459 } 1464 1460 1465 (void) exfat_node_put(fn); 1461 int rc2 = exfat_node_put(fn); 1462 if (rc == EOK && rc2 != EOK) 1463 rc = rc2; 1464 1466 1465 return rc; 1467 1466 }
Note:
See TracChangeset
for help on using the changeset viewer.