Changes in / [98cb0495:6561a8e] in mainline
- Files:
-
- 4 deleted
- 30 edited
Legend:
- Unmodified
- Added
- Removed
-
abi/include/syscall.h
r98cb0495 r6561a8e 92 92 SYS_IRQ_UNREGISTER, 93 93 94 SYS_SYSINFO_GET_KEYS_SIZE,95 SYS_SYSINFO_GET_KEYS,96 94 SYS_SYSINFO_GET_VAL_TYPE, 97 95 SYS_SYSINFO_GET_VALUE, -
boot/Makefile.common
r98cb0495 r6561a8e 165 165 $(USPACE_PATH)/app/locinfo/locinfo \ 166 166 $(USPACE_PATH)/app/mkfat/mkfat \ 167 $(USPACE_PATH)/app/mkexfat/mkexfat \168 167 $(USPACE_PATH)/app/mkmfs/mkmfs \ 169 168 $(USPACE_PATH)/app/lsusb/lsusb \ -
kernel/arch/ppc32/src/ppc32.c
r98cb0495 r6561a8e 173 173 ofw_tree_walk_by_device_type("display", display_register, NULL); 174 174 #endif 175 /* Map OFW information into sysinfo */176 ofw_sysinfo_map();177 175 178 176 /* Initialize IRQ routing */ -
kernel/arch/sparc64/src/sun4u/sparc64.c
r98cb0495 r6561a8e 94 94 { 95 95 if (config.cpu_active == 1) { 96 /* Map OFW information into sysinfo */97 ofw_sysinfo_map();98 99 96 /* 100 97 * We have 2^11 different interrupt vectors. -
kernel/arch/sparc64/src/sun4v/sparc64.c
r98cb0495 r6561a8e 92 92 { 93 93 if (config.cpu_active == 1) { 94 /* Map OFW information into sysinfo */95 ofw_sysinfo_map();96 97 94 /* 98 95 * We have 2^11 different interrupt vectors. -
kernel/genarch/include/ofw/ofw_tree.h
r98cb0495 r6561a8e 67 67 68 68 extern void ofw_tree_init(ofw_tree_node_t *); 69 extern void ofw_ sysinfo_map(void);69 extern void ofw_tree_print(void); 70 70 71 71 extern const char *ofw_tree_node_name(const ofw_tree_node_t *); -
kernel/genarch/src/ofw/ofw_tree.c
r98cb0495 r6561a8e 38 38 #include <genarch/ofw/ofw_tree.h> 39 39 #include <mm/slab.h> 40 #include <sysinfo/sysinfo.h>41 40 #include <memstr.h> 42 41 #include <str.h> … … 66 65 const char *name) 67 66 { 68 for (size_t i = 0; i < node->properties; i++) { 67 size_t i; 68 69 for (i = 0; i < node->properties; i++) { 69 70 if (str_cmp(node->property[i].name, name) == 0) 70 71 return &node->property[i]; … … 103 104 const char *name) 104 105 { 106 ofw_tree_node_t *cur; 107 105 108 /* 106 109 * Try to find the disambigued name. 107 110 */ 108 for ( ofw_tree_node_t *cur = node->child; cur; cur = cur->peer) {111 for (cur = node->child; cur; cur = cur->peer) { 109 112 if (str_cmp(cur->da_name, name) == 0) 110 113 return cur; … … 118 121 * are not always fully-qualified. 119 122 */ 120 for ( ofw_tree_node_t *cur = node->child; cur; cur = cur->peer) {123 for (cur = node->child; cur; cur = cur->peer) { 121 124 if (str_cmp(ofw_tree_node_name(cur), name) == 0) 122 125 return cur; … … 138 141 const char *dtype) 139 142 { 140 for (ofw_tree_node_t *cur = node->child; cur; cur = cur->peer) { 143 ofw_tree_node_t *cur; 144 145 for (cur = node->child; cur; cur = cur->peer) { 141 146 ofw_tree_property_t *prop = 142 147 ofw_tree_getprop(cur, "device_type"); … … 167 172 phandle handle) 168 173 { 169 for (ofw_tree_node_t *cur = root; cur; cur = cur->peer) { 174 ofw_tree_node_t *cur; 175 176 for (cur = root; cur; cur = cur->peer) { 170 177 if (cur->node_handle == handle) 171 178 return cur; 172 179 173 180 if (cur->child) { 174 ofw_tree_node_t *node =175 ofw_tree_find_node_by_handle(cur->child, handle);181 ofw_tree_node_t *node 182 = ofw_tree_find_node_by_handle(cur->child, handle); 176 183 if (node) 177 184 return node; … … 194 201 const char *dtype) 195 202 { 196 for (ofw_tree_node_t *cur = node->peer; cur; cur = cur->peer) { 203 ofw_tree_node_t *cur; 204 205 for (cur = node->peer; cur; cur = cur->peer) { 197 206 ofw_tree_property_t *prop = 198 207 ofw_tree_getprop(cur, "device_type"); … … 220 229 const char *name) 221 230 { 222 for (ofw_tree_node_t *cur = node->peer; cur; cur = cur->peer) { 223 ofw_tree_property_t *prop = 224 ofw_tree_getprop(cur, "name"); 231 ofw_tree_node_t *cur; 232 233 for (cur = node->peer; cur; cur = cur->peer) { 234 ofw_tree_property_t *prop 235 = ofw_tree_getprop(cur, "name"); 225 236 226 237 if ((!prop) || (!prop->value)) … … 248 259 249 260 ofw_tree_node_t *node = ofw_root; 261 size_t i; 250 262 size_t j; 251 263 252 for ( size_ti = 1; (i < str_size(path)) && (node); i = j + 1) {264 for (i = 1; (i < str_size(path)) && (node); i = j + 1) { 253 265 for (j = i; (j < str_size(path)) && (path[j] != '/'); j++); 254 266 … … 282 294 const char *dtype, ofw_tree_walker_t walker, void *arg) 283 295 { 284 for (ofw_tree_node_t *cur = node; cur; cur = cur->peer) { 296 ofw_tree_node_t *cur; 297 298 for (cur = node; cur; cur = cur->peer) { 285 299 ofw_tree_property_t *prop = 286 300 ofw_tree_getprop(cur, "device_type"); … … 320 334 } 321 335 322 /** Get OpenFirmware node properties. 323 * 324 * @param item Sysinfo item (unused). 325 * @param size Size of the returned data. 326 * @param dry_run Do not get the data, just calculate the size. 327 * @param data OpenFirmware node. 328 * 329 * @return Data containing a serialized dump of all node 330 * properties. If the return value is not NULL, it 331 * should be freed in the context of the sysinfo request. 332 * 333 */ 334 static void *ofw_sysinfo_properties(struct sysinfo_item *item, size_t *size, 335 bool dry_run, void *data) 336 { 337 ofw_tree_node_t *node = (ofw_tree_node_t *) data; 338 339 /* Compute serialized data size */ 340 *size = 0; 341 for (size_t i = 0; i < node->properties; i++) 342 *size += str_size(node->property[i].name) + 1 + 343 sizeof(node->property[i].size) + node->property[i].size; 344 345 if (dry_run) 346 return NULL; 347 348 void *dump = malloc(*size, FRAME_ATOMIC); 349 if (dump == NULL) { 350 *size = 0; 351 return NULL; 352 } 353 354 /* Serialize the data */ 355 size_t pos = 0; 356 for (size_t i = 0; i < node->properties; i++) { 357 /* Property name */ 358 str_cpy(dump + pos, *size - pos, node->property[i].name); 359 pos += str_size(node->property[i].name) + 1; 360 361 /* Value size */ 362 memcpy(dump + pos, &node->property[i].size, 363 sizeof(node->property[i].size)); 364 pos += sizeof(node->property[i].size); 365 366 /* Value */ 367 memcpy(dump + pos, node->property[i].value, 368 node->property[i].size); 369 pos += node->property[i].size; 370 } 371 372 return ((void *) dump); 373 } 374 375 /** Map OpenFirmware device subtree rooted in a node into sysinfo. 336 /** Print OpenFirmware device subtree rooted in a node. 376 337 * 377 338 * Child nodes are processed recursively and peer nodes are processed … … 382 343 * 383 344 */ 384 static void ofw_tree_node_ sysinfo(ofw_tree_node_t *node, const char *path)345 static void ofw_tree_node_print(ofw_tree_node_t *node, const char *path) 385 346 { 386 347 char *cur_path = (char *) malloc(PATH_MAX_LEN, 0); 387 388 for (ofw_tree_node_t *cur = node; cur; cur = cur->peer) { 389 if ((cur->parent) && (path)) 390 snprintf(cur_path, PATH_MAX_LEN, "%s.%s", path, cur->da_name); 391 else 392 snprintf(cur_path, PATH_MAX_LEN, "firmware.%s", cur->da_name); 393 394 sysinfo_set_item_gen_data(cur_path, NULL, ofw_sysinfo_properties, 395 (void *) cur); 348 ofw_tree_node_t *cur; 349 350 for (cur = node; cur; cur = cur->peer) { 351 if ((cur->parent) && (path)) { 352 snprintf(cur_path, PATH_MAX_LEN, "%s/%s", path, cur->da_name); 353 printf("%s\n", cur_path); 354 } else { 355 snprintf(cur_path, PATH_MAX_LEN, "%s", cur->da_name); 356 printf("/\n"); 357 } 396 358 397 359 if (cur->child) 398 ofw_tree_node_ sysinfo(cur->child, cur_path);360 ofw_tree_node_print(cur->child, cur_path); 399 361 } 400 362 … … 402 364 } 403 365 404 /** Map the OpenFirmware device tree into sysinfo. */405 void ofw_ sysinfo_map(void)406 { 407 ofw_tree_node_ sysinfo(ofw_root, NULL);366 /** Print the structure of the OpenFirmware device tree. */ 367 void ofw_tree_print(void) 368 { 369 ofw_tree_node_print(ofw_root, NULL); 408 370 } 409 371 -
kernel/generic/include/sysinfo/sysinfo.h
r98cb0495 r6561a8e 1 1 /* 2 2 * Copyright (c) 2006 Jakub Vana 3 * Copyright (c) 2012 Martin Decky4 3 * All rights reserved. 5 4 * … … 55 54 struct sysinfo_item; 56 55 57 /** Generated numeric value function */ 58 typedef sysarg_t (*sysinfo_fn_val_t)(struct sysinfo_item *, void *); 59 60 /** Sysinfo generated numberic value data 61 * 62 */ 63 typedef struct { 64 sysinfo_fn_val_t fn; /**< Generated value function */ 65 void *data; /**< Private data */ 66 } sysinfo_gen_val_data_t; 56 /** Gerated numeric value function */ 57 typedef sysarg_t (*sysinfo_fn_val_t)(struct sysinfo_item *); 67 58 68 59 /** Generated binary data function */ 69 typedef void *(*sysinfo_fn_data_t)(struct sysinfo_item *, size_t *, bool, 70 void *); 71 72 /** Sysinfo generated binary data data 73 * 74 */ 75 typedef struct { 76 sysinfo_fn_data_t fn; /**< Generated binary data function */ 77 void *data; /**< Private data */ 78 } sysinfo_gen_data_data_t; 60 typedef void *(*sysinfo_fn_data_t)(struct sysinfo_item *, size_t *, bool); 79 61 80 62 /** Sysinfo item binary data … … 90 72 */ 91 73 typedef union { 92 sysarg_t val; 93 sysinfo_ data_t data; /**< Constant binary data*/94 sysinfo_ gen_val_data_t gen_val; /**< Generated numeric valuefunction */95 sysinfo_ gen_data_data_t gen_data; /**< Generated binary data function*/74 sysarg_t val; /**< Constant numberic value */ 75 sysinfo_fn_val_t fn_val; /**< Generated numeric value function */ 76 sysinfo_fn_data_t fn_data; /**< Generated binary data function */ 77 sysinfo_data_t data; /**< Constant binary data */ 96 78 } sysinfo_item_val_t; 97 79 … … 113 95 114 96 /** Generated subtree function */ 115 typedef sysinfo_return_t (*sysinfo_fn_subtree_t)(const char *, bool, void *); 116 117 /** Sysinfo generated subtree data 118 * 119 */ 120 typedef struct { 121 sysinfo_fn_subtree_t fn; /**< Generated subtree function */ 122 void *data; /**< Private data */ 123 } sysinfo_gen_subtree_data_t; 97 typedef sysinfo_return_t (*sysinfo_fn_subtree_t)(const char *, bool); 124 98 125 99 /** Sysinfo subtree (union) … … 127 101 */ 128 102 typedef union { 129 struct sysinfo_item *table; 130 sysinfo_ gen_subtree_data_t generator; /**< Generated subtree*/103 struct sysinfo_item *table; /**< Fixed subtree (list of subitems) */ 104 sysinfo_fn_subtree_t get_data; /**< Generated subtree function */ 131 105 } sysinfo_subtree_t; 132 106 … … 149 123 extern void sysinfo_set_item_data(const char *, sysinfo_item_t **, void *, 150 124 size_t); 151 extern void sysinfo_set_item_ gen_val(const char *, sysinfo_item_t **,152 sysinfo_fn_val_t , void *);153 extern void sysinfo_set_item_ gen_data(const char *, sysinfo_item_t **,154 sysinfo_fn_data_t , void *);125 extern void sysinfo_set_item_fn_val(const char *, sysinfo_item_t **, 126 sysinfo_fn_val_t); 127 extern void sysinfo_set_item_fn_data(const char *, sysinfo_item_t **, 128 sysinfo_fn_data_t); 155 129 extern void sysinfo_set_item_undefined(const char *, sysinfo_item_t **); 156 130 157 131 extern void sysinfo_set_subtree_fn(const char *, sysinfo_item_t **, 158 sysinfo_fn_subtree_t , void *);132 sysinfo_fn_subtree_t); 159 133 160 134 extern void sysinfo_init(void); 161 135 extern void sysinfo_dump(sysinfo_item_t *); 162 136 163 extern sysarg_t sys_sysinfo_get_keys_size(void *, size_t, void *);164 extern sysarg_t sys_sysinfo_get_keys(void *, size_t, void *, size_t, size_t *);165 137 extern sysarg_t sys_sysinfo_get_val_type(void *, size_t); 166 138 extern sysarg_t sys_sysinfo_get_value(void *, size_t, void *); -
kernel/generic/src/ddi/ddi.c
r98cb0495 r6561a8e 166 166 } 167 167 168 if (zones.info[znum].flags & (ZONE_FIRMWARE | ZONE_RESERVED)) {169 /* 170 * Frames are part of firmware or reserved zone168 if (zones.info[znum].flags & ZONE_FIRMWARE) { 169 /* 170 * Frames are part of firmware 171 171 * -> allow mapping for privileged tasks. 172 172 */ -
kernel/generic/src/lib/func.c
r98cb0495 r6561a8e 53 53 void halt() 54 54 { 55 #if (defined(CONFIG_DEBUG)) && (defined(CONFIG_KCONSOLE))55 #ifdef CONFIG_DEBUG 56 56 bool rundebugger = false; 57 57 -
kernel/generic/src/main/main.c
r98cb0495 r6561a8e 221 221 frame_init(); 222 222 slab_cache_init(); 223 ra_init(); 223 ra_init(); 224 224 sysinfo_init(); 225 225 btree_init(); -
kernel/generic/src/syscall/syscall.c
r98cb0495 r6561a8e 184 184 185 185 /* Sysinfo syscalls. */ 186 (syshandler_t) sys_sysinfo_get_keys_size,187 (syshandler_t) sys_sysinfo_get_keys,188 186 (syshandler_t) sys_sysinfo_get_val_type, 189 187 (syshandler_t) sys_sysinfo_get_value, -
kernel/generic/src/sysinfo/stats.c
r98cb0495 r6561a8e 83 83 * 84 84 * @param item Sysinfo item (unused). 85 * @param data Unused.86 85 * 87 86 * @return System uptime (in secords). 88 87 * 89 88 */ 90 static sysarg_t get_stats_uptime(struct sysinfo_item *item , void *data)89 static sysarg_t get_stats_uptime(struct sysinfo_item *item) 91 90 { 92 91 /* This doesn't have to be very accurate */ … … 99 98 * @param size Size of the returned data. 100 99 * @param dry_run Do not get the data, just calculate the size. 101 * @param data Unused.102 100 * 103 101 * @return Data containing several stats_cpu_t structures. … … 106 104 */ 107 105 static void *get_stats_cpus(struct sysinfo_item *item, size_t *size, 108 bool dry_run , void *data)106 bool dry_run) 109 107 { 110 108 *size = sizeof(stats_cpu_t) * config.cpu_count; … … 251 249 ASSERT(interrupts_disabled()); 252 250 ASSERT(irq_spinlock_locked(&task->lock)); 253 251 254 252 stats_task->task_id = task->taskid; 255 253 str_cpy(stats_task->name, TASK_NAME_BUFLEN, task->name); … … 295 293 * @param size Size of the returned data. 296 294 * @param dry_run Do not get the data, just calculate the size. 297 * @param data Unused.298 295 * 299 296 * @return Data containing several stats_task_t structures. … … 302 299 */ 303 300 static void *get_stats_tasks(struct sysinfo_item *item, size_t *size, 304 bool dry_run , void *data)301 bool dry_run) 305 302 { 306 303 /* Messing with task structures, avoid deadlock */ … … 353 350 ASSERT(interrupts_disabled()); 354 351 ASSERT(irq_spinlock_locked(&thread->lock)); 355 352 356 353 stats_thread->thread_id = thread->tid; 357 354 stats_thread->task_id = thread->task->taskid; … … 401 398 * @param size Size of the returned data. 402 399 * @param dry_run Do not get the data, just calculate the size. 403 * @param data Unused.404 400 * 405 401 * @return Data containing several stats_task_t structures. … … 408 404 */ 409 405 static void *get_stats_threads(struct sysinfo_item *item, size_t *size, 410 bool dry_run , void *data)406 bool dry_run) 411 407 { 412 408 /* Messing with threads structures, avoid deadlock */ … … 455 451 * @param name Task ID (string-encoded number). 456 452 * @param dry_run Do not get the data, just calculate the size. 457 * @param data Unused.458 453 * 459 454 * @return Sysinfo return holder. The type of the returned … … 465 460 * 466 461 */ 467 static sysinfo_return_t get_stats_task(const char *name, bool dry_run, 468 void *data) 462 static sysinfo_return_t get_stats_task(const char *name, bool dry_run) 469 463 { 470 464 /* Initially no return value */ … … 526 520 * @param name Thread ID (string-encoded number). 527 521 * @param dry_run Do not get the data, just calculate the size. 528 * @param data Unused.529 522 * 530 523 * @return Sysinfo return holder. The type of the returned … … 536 529 * 537 530 */ 538 static sysinfo_return_t get_stats_thread(const char *name, bool dry_run, 539 void *data) 531 static sysinfo_return_t get_stats_thread(const char *name, bool dry_run) 540 532 { 541 533 /* Initially no return value */ … … 594 586 * @param size Size of the returned data. 595 587 * @param dry_run Do not get the data, just calculate the size. 596 * @param data Unused.597 588 * 598 589 * @return Data containing several stats_exc_t structures. … … 601 592 */ 602 593 static void *get_stats_exceptions(struct sysinfo_item *item, size_t *size, 603 bool dry_run , void *data)594 bool dry_run) 604 595 { 605 596 *size = sizeof(stats_exc_t) * IVT_ITEMS; … … 643 634 * @param name Exception number (string-encoded number). 644 635 * @param dry_run Do not get the data, just calculate the size. 645 * @param data Unused.646 636 * 647 637 * @return Sysinfo return holder. The type of the returned … … 653 643 * 654 644 */ 655 static sysinfo_return_t get_stats_exception(const char *name, bool dry_run, 656 void *data) 645 static sysinfo_return_t get_stats_exception(const char *name, bool dry_run) 657 646 { 658 647 /* Initially no return value */ … … 716 705 * @param size Size of the returned data. 717 706 * @param dry_run Do not get the data, just calculate the size. 718 * @param data Unused.719 707 * 720 708 * @return Data containing stats_physmem_t. … … 723 711 */ 724 712 static void *get_stats_physmem(struct sysinfo_item *item, size_t *size, 725 bool dry_run , void *data)713 bool dry_run) 726 714 { 727 715 *size = sizeof(stats_physmem_t); … … 747 735 * @param size Size of the returned data. 748 736 * @param dry_run Do not get the data, just calculate the size. 749 * @param data Unused.750 737 * 751 738 * @return Data several load_t values. … … 754 741 */ 755 742 static void *get_stats_load(struct sysinfo_item *item, size_t *size, 756 bool dry_run , void *data)743 bool dry_run) 757 744 { 758 745 *size = sizeof(load_t) * LOAD_STEPS; … … 823 810 mutex_initialize(&load_lock, MUTEX_PASSIVE); 824 811 825 sysinfo_set_item_ gen_val("system.uptime", NULL, get_stats_uptime, NULL);826 sysinfo_set_item_ gen_data("system.cpus", NULL, get_stats_cpus, NULL);827 sysinfo_set_item_ gen_data("system.physmem", NULL, get_stats_physmem, NULL);828 sysinfo_set_item_ gen_data("system.load", NULL, get_stats_load, NULL);829 sysinfo_set_item_ gen_data("system.tasks", NULL, get_stats_tasks, NULL);830 sysinfo_set_item_ gen_data("system.threads", NULL, get_stats_threads, NULL);831 sysinfo_set_item_ gen_data("system.exceptions", NULL, get_stats_exceptions, NULL);832 sysinfo_set_subtree_fn("system.tasks", NULL, get_stats_task , NULL);833 sysinfo_set_subtree_fn("system.threads", NULL, get_stats_thread , NULL);834 sysinfo_set_subtree_fn("system.exceptions", NULL, get_stats_exception , NULL);812 sysinfo_set_item_fn_val("system.uptime", NULL, get_stats_uptime); 813 sysinfo_set_item_fn_data("system.cpus", NULL, get_stats_cpus); 814 sysinfo_set_item_fn_data("system.physmem", NULL, get_stats_physmem); 815 sysinfo_set_item_fn_data("system.load", NULL, get_stats_load); 816 sysinfo_set_item_fn_data("system.tasks", NULL, get_stats_tasks); 817 sysinfo_set_item_fn_data("system.threads", NULL, get_stats_threads); 818 sysinfo_set_item_fn_data("system.exceptions", NULL, get_stats_exceptions); 819 sysinfo_set_subtree_fn("system.tasks", NULL, get_stats_task); 820 sysinfo_set_subtree_fn("system.threads", NULL, get_stats_thread); 821 sysinfo_set_subtree_fn("system.exceptions", NULL, get_stats_exception); 835 822 } 836 823 -
kernel/generic/src/sysinfo/sysinfo.c
r98cb0495 r6561a8e 1 1 /* 2 2 * Copyright (c) 2006 Jakub Vana 3 * Copyright (c) 2012 Martin Decky4 3 * All rights reserved. 5 4 * … … 100 99 sizeof(sysinfo_item_t), 0, sysinfo_item_constructor, 101 100 sysinfo_item_destructor, SLAB_CACHE_MAGDEFERRED); 102 101 103 102 mutex_initialize(&sysinfo_lock, MUTEX_ACTIVE); 104 103 } … … 111 110 * @param subtree Current sysinfo (sub)tree root item. 112 111 * @param ret If the return value is NULL, this argument 113 * can be set either to NULL (i.e. no item was112 * can be either also NULL (i.e. no item was 114 113 * found and no data was generated) or the 115 114 * original pointer is used to store the value … … 126 125 { 127 126 ASSERT(subtree != NULL); 127 ASSERT(ret != NULL); 128 128 129 129 sysinfo_item_t *cur = subtree; … … 151 151 case SYSINFO_SUBTREE_FUNCTION: 152 152 /* Get generated data */ 153 if (ret != NULL) 154 **ret = cur->subtree.generator.fn(name + i + 1, 155 dry_run, cur->subtree.generator.data); 156 153 **ret = cur->subtree.get_data(name + i + 1, dry_run); 157 154 return NULL; 158 155 default: 159 156 /* Not found, no data generated */ 160 if (ret != NULL) 161 *ret = NULL; 162 157 *ret = NULL; 163 158 return NULL; 164 159 } … … 169 164 170 165 /* Not found, no data generated */ 171 if (ret != NULL) 172 *ret = NULL; 173 166 *ret = NULL; 174 167 return NULL; 175 168 } … … 359 352 * a new root item (NULL for global sysinfo root). 360 353 * @param fn Numeric value generator function. 361 * @param data Private data. 362 * 363 */ 364 void sysinfo_set_item_gen_val(const char *name, sysinfo_item_t **root, 365 sysinfo_fn_val_t fn, void *data) 354 * 355 */ 356 void sysinfo_set_item_fn_val(const char *name, sysinfo_item_t **root, 357 sysinfo_fn_val_t fn) 366 358 { 367 359 /* Protect sysinfo tree consistency */ … … 374 366 if (item != NULL) { 375 367 item->val_type = SYSINFO_VAL_FUNCTION_VAL; 376 item->val.gen_val.fn = fn; 377 item->val.gen_val.data = data; 368 item->val.fn_val = fn; 378 369 } 379 370 … … 392 383 * a new root item (NULL for global sysinfo root). 393 384 * @param fn Binary data generator function. 394 * @param data Private data. 395 * 396 */ 397 void sysinfo_set_item_gen_data(const char *name, sysinfo_item_t **root, 398 sysinfo_fn_data_t fn, void *data) 385 * 386 */ 387 void sysinfo_set_item_fn_data(const char *name, sysinfo_item_t **root, 388 sysinfo_fn_data_t fn) 399 389 { 400 390 /* Protect sysinfo tree consistency */ … … 407 397 if (item != NULL) { 408 398 item->val_type = SYSINFO_VAL_FUNCTION_DATA; 409 item->val.gen_data.fn = fn; 410 item->val.gen_data.data = data; 399 item->val.fn_data = fn; 411 400 } 412 401 … … 442 431 * a new root item (NULL for global sysinfo root). 443 432 * @param fn Subtree generator function. 444 * @param data Private data to be passed to the generator.445 433 * 446 434 */ 447 435 void sysinfo_set_subtree_fn(const char *name, sysinfo_item_t **root, 448 sysinfo_fn_subtree_t fn , void *data)436 sysinfo_fn_subtree_t fn) 449 437 { 450 438 /* Protect sysinfo tree consistency */ … … 460 448 if ((item != NULL) && (item->subtree_type != SYSINFO_SUBTREE_TABLE)) { 461 449 item->subtree_type = SYSINFO_SUBTREE_FUNCTION; 462 item->subtree.generator.fn = fn; 463 item->subtree.generator.data = data; 450 item->subtree.get_data = fn; 464 451 } 465 452 … … 469 456 /** Sysinfo dump indentation helper routine 470 457 * 471 * @param depth Number of spaces to print. 472 * 473 */ 474 NO_TRACE static void sysinfo_indent(size_t spaces) 475 { 476 for (size_t i = 0; i < spaces; i++) 477 printf(" "); 458 * @param depth Number of indentation characters to print. 459 * 460 */ 461 NO_TRACE static void sysinfo_indent(unsigned int depth) 462 { 463 unsigned int i; 464 for (i = 0; i < depth; i++) 465 printf(" "); 478 466 } 479 467 … … 482 470 * Should be called with sysinfo_lock held. 483 471 * 484 * @param root Root item of the current (sub)tree. 485 * @param spaces Current indentation level. 486 * 487 */ 488 NO_TRACE static void sysinfo_dump_internal(sysinfo_item_t *root, size_t spaces) 489 { 472 * @param root Root item of the current (sub)tree. 473 * @param depth Current depth in the sysinfo tree. 474 * 475 */ 476 NO_TRACE static void sysinfo_dump_internal(sysinfo_item_t *root, unsigned int depth) 477 { 478 sysinfo_item_t *cur = root; 479 490 480 /* Walk all siblings */ 491 for (sysinfo_item_t *cur = root; cur; cur = cur->next) { 492 size_t length; 493 494 if (spaces == 0) { 495 printf("%s", cur->name); 496 length = str_length(cur->name); 497 } else { 498 sysinfo_indent(spaces); 499 printf(".%s", cur->name); 500 length = str_length(cur->name) + 1; 501 } 481 while (cur != NULL) { 482 sysinfo_indent(depth); 502 483 503 484 sysarg_t val; … … 507 488 switch (cur->val_type) { 508 489 case SYSINFO_VAL_UNDEFINED: 509 printf(" [undefined]\n");490 printf("+ %s\n", cur->name); 510 491 break; 511 492 case SYSINFO_VAL_VAL: 512 printf(" -> %" PRIun" (%#" PRIxn ")\n", cur->val.val,513 cur->val.val );493 printf("+ %s -> %" PRIun" (%#" PRIxn ")\n", cur->name, 494 cur->val.val, cur->val.val); 514 495 break; 515 496 case SYSINFO_VAL_DATA: 516 printf(" (%zu bytes)\n", cur->val.data.size); 497 printf("+ %s (%zu bytes)\n", cur->name, 498 cur->val.data.size); 517 499 break; 518 500 case SYSINFO_VAL_FUNCTION_VAL: 519 val = cur->val. gen_val.fn(cur, cur->val.gen_val.data);520 printf(" -> %" PRIun" (%#" PRIxn ") [generated]\n", val,521 val);501 val = cur->val.fn_val(cur); 502 printf("+ %s -> %" PRIun" (%#" PRIxn ") [generated]\n", 503 cur->name, val, val); 522 504 break; 523 505 case SYSINFO_VAL_FUNCTION_DATA: 524 506 /* N.B.: No data was actually returned (only a dry run) */ 525 (void) cur->val. gen_data.fn(cur, &size, true,526 cur->val.gen_data.data);527 printf(" (%zu bytes) [generated]\n",size);507 (void) cur->val.fn_data(cur, &size, true); 508 printf("+ %s (%zu bytes) [generated]\n", cur->name, 509 size); 528 510 break; 529 511 default: … … 536 518 break; 537 519 case SYSINFO_SUBTREE_TABLE: 538 sysinfo_dump_internal(cur->subtree.table, spaces + length);520 sysinfo_dump_internal(cur->subtree.table, depth + 1); 539 521 break; 540 522 case SYSINFO_SUBTREE_FUNCTION: 541 sysinfo_indent( spaces + length);542 printf(" <generated subtree>\n");523 sysinfo_indent(depth + 1); 524 printf("+ [generated subtree]\n"); 543 525 break; 544 526 default: 545 sysinfo_indent( spaces + length);546 printf(" <unknown subtree>\n");527 sysinfo_indent(depth + 1); 528 printf("+ [unknown subtree]\n"); 547 529 } 530 531 cur = cur->next; 548 532 } 549 533 } … … 610 594 break; 611 595 case SYSINFO_VAL_FUNCTION_VAL: 612 ret.val = item->val. gen_val.fn(item, item->val.gen_val.data);596 ret.val = item->val.fn_val(item); 613 597 break; 614 598 case SYSINFO_VAL_FUNCTION_DATA: 615 ret.data.data = item->val. gen_data.fn(item, &ret.data.size,616 dry_run , item->val.gen_data.data);599 ret.data.data = item->val.fn_data(item, &ret.data.size, 600 dry_run); 617 601 break; 618 602 } … … 651 635 ASSERT(path); 652 636 653 if ((copy_from_uspace(path, ptr, size + 1) == 0) &&654 (path[size] == 0)) {637 if ((copy_from_uspace(path, ptr, size + 1) == 0) 638 && (path[size] == 0)) { 655 639 /* 656 640 * Prevent other functions from messing with sysinfo while we … … 661 645 mutex_unlock(&sysinfo_lock); 662 646 } 663 664 647 free(path); 665 648 return ret; 666 }667 668 /** Return sysinfo keys determined by name669 *670 * Should be called with sysinfo_lock held.671 *672 * @param name Sysinfo path.673 * @param root Root item of the sysinfo (sub)tree.674 * If it is NULL then consider the global675 * sysinfo tree.676 * @param dry_run Do not actually get any generated677 * binary data, just calculate the size.678 *679 * @return Item value (constant or generated).680 *681 */682 NO_TRACE static sysinfo_return_t sysinfo_get_keys(const char *name,683 sysinfo_item_t **root, bool dry_run)684 {685 if (root == NULL)686 root = &global_root;687 688 sysinfo_item_t *subtree = NULL;689 690 if (name[0] != 0) {691 /* Try to find the item */692 sysinfo_item_t *item =693 sysinfo_find_item(name, *root, NULL, dry_run);694 if ((item != NULL) &&695 (item->subtree_type == SYSINFO_SUBTREE_TABLE))696 subtree = item->subtree.table;697 } else698 subtree = *root;699 700 sysinfo_return_t ret;701 702 if (subtree != NULL) {703 /*704 * Calculate the size of subkeys.705 */706 size_t size = 0;707 for (sysinfo_item_t *cur = subtree; cur; cur = cur->next)708 size += str_size(cur->name) + 1;709 710 if (dry_run) {711 ret.tag = SYSINFO_VAL_DATA;712 ret.data.data = NULL;713 ret.data.size = size;714 } else {715 /* Allocate buffer for subkeys */716 char *names = (char *) malloc(size, FRAME_ATOMIC);717 if (names == NULL)718 return ret;719 720 size_t pos = 0;721 for (sysinfo_item_t *cur = subtree; cur; cur = cur->next) {722 str_cpy(names + pos, size - pos, cur->name);723 pos += str_size(cur->name) + 1;724 }725 726 /* Correct return value */727 ret.tag = SYSINFO_VAL_DATA;728 ret.data.data = (void *) names;729 ret.data.size = size;730 }731 } else {732 /* No item in the fixed sysinfo tree */733 ret.tag = SYSINFO_VAL_UNDEFINED;734 }735 736 return ret;737 }738 739 /** Return sysinfo keys determined by name from user space740 *741 * The path string passed from the user space has to be properly742 * null-terminated (the last passed character must be null).743 *744 * @param ptr Sysinfo path in the user address space.745 * @param size Size of the path string.746 * @param dry_run Do not actually get any generated747 * binary data, just calculate the size.748 *749 */750 NO_TRACE static sysinfo_return_t sysinfo_get_keys_uspace(void *ptr, size_t size,751 bool dry_run)752 {753 sysinfo_return_t ret;754 ret.tag = SYSINFO_VAL_UNDEFINED;755 756 if (size > SYSINFO_MAX_PATH)757 return ret;758 759 char *path = (char *) malloc(size + 1, 0);760 ASSERT(path);761 762 if ((copy_from_uspace(path, ptr, size + 1) == 0) &&763 (path[size] == 0)) {764 /*765 * Prevent other functions from messing with sysinfo while we766 * are reading it.767 */768 mutex_lock(&sysinfo_lock);769 ret = sysinfo_get_keys(path, NULL, dry_run);770 mutex_unlock(&sysinfo_lock);771 }772 773 free(path);774 return ret;775 }776 777 /** Get the sysinfo keys size (syscall)778 *779 * The path string passed from the user space has780 * to be properly null-terminated (the last passed781 * character must be null).782 *783 * @param path_ptr Sysinfo path in the user address space.784 * @param path_size Size of the path string.785 * @param size_ptr User space pointer where to store the786 * keys size.787 *788 * @return Error code (EOK in case of no error).789 *790 */791 sysarg_t sys_sysinfo_get_keys_size(void *path_ptr, size_t path_size,792 void *size_ptr)793 {794 int rc;795 796 /*797 * Get the keys.798 *799 * N.B.: There is no need to free any potential keys800 * since we request a dry run.801 */802 sysinfo_return_t ret =803 sysinfo_get_keys_uspace(path_ptr, path_size, true);804 805 /* Check return data tag */806 if (ret.tag == SYSINFO_VAL_DATA)807 rc = copy_to_uspace(size_ptr, &ret.data.size,808 sizeof(ret.data.size));809 else810 rc = EINVAL;811 812 return (sysarg_t) rc;813 }814 815 /** Get the sysinfo keys (syscall)816 *817 * The path string passed from the user space has818 * to be properly null-terminated (the last passed819 * character must be null).820 *821 * If the user space buffer size does not equal822 * the actual size of the returned data, the data823 * is truncated.824 *825 * The actual size of data returned is stored to826 * size_ptr.827 *828 * @param path_ptr Sysinfo path in the user address space.829 * @param path_size Size of the path string.830 * @param buffer_ptr User space pointer to the buffer where831 * to store the binary data.832 * @param buffer_size User space buffer size.833 * @param size_ptr User space pointer where to store the834 * binary data size.835 *836 * @return Error code (EOK in case of no error).837 *838 */839 sysarg_t sys_sysinfo_get_keys(void *path_ptr, size_t path_size,840 void *buffer_ptr, size_t buffer_size, size_t *size_ptr)841 {842 int rc;843 844 /* Get the keys */845 sysinfo_return_t ret = sysinfo_get_keys_uspace(path_ptr, path_size,846 false);847 848 /* Check return data tag */849 if (ret.tag == SYSINFO_VAL_DATA) {850 size_t size = min(ret.data.size, buffer_size);851 rc = copy_to_uspace(buffer_ptr, ret.data.data, size);852 if (rc == EOK)853 rc = copy_to_uspace(size_ptr, &size, sizeof(size));854 855 free(ret.data.data);856 } else857 rc = EINVAL;858 859 return (sysarg_t) rc;860 649 } 861 650 … … 883 672 884 673 /* 885 * Map generated value types to constant types (user space does 886 * not carewhether the value is constant or generated).674 * Map generated value types to constant types (user space does not care 675 * whether the value is constant or generated). 887 676 */ 888 677 if (ret.tag == SYSINFO_VAL_FUNCTION_VAL) … … 912 701 { 913 702 int rc; 914 703 915 704 /* 916 705 * Get the item. 917 706 * 918 * N.B.: There is no need to free any potential generated binary 919 * datasince we request a dry run.707 * N.B.: There is no need to free any potential generated binary data 708 * since we request a dry run. 920 709 */ 921 710 sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, true); … … 952 741 * Get the item. 953 742 * 954 * N.B.: There is no need to free any potential generated binary 955 * datasince we request a dry run.743 * N.B.: There is no need to free any potential generated binary data 744 * since we request a dry run. 956 745 */ 957 746 sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, true); -
uspace/Makefile
r98cb0495 r6561a8e 48 48 app/lsusb \ 49 49 app/mkfat \ 50 app/mkexfat \51 50 app/mkmfs \ 52 51 app/redir \ -
uspace/app/sysinfo/sysinfo.c
r98cb0495 r6561a8e 37 37 #include <stdio.h> 38 38 #include <sysinfo.h> 39 #include <malloc.h>40 39 #include <sys/types.h> 40 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; 86 } 87 88 static int print_item_val(char *ipath) 89 { 90 sysarg_t value; 91 int rc; 92 93 rc = sysinfo_get_value(ipath, &value); 94 if (rc != EOK) { 95 printf("Error reading item '%s'.\n", ipath); 96 return rc; 97 } 98 99 printf("%s -> %" PRIu64 " (0x%" PRIx64 ")\n", ipath, 100 (uint64_t) value, (uint64_t) value); 101 102 return EOK; 103 } 104 105 static int print_item_data(char *ipath) 106 { 107 void *data; 108 size_t size; 109 110 data = sysinfo_get_data(ipath, &size); 111 if (data == NULL) { 112 printf("Error reading item '%s'.\n", ipath); 113 return -1; 114 } 115 116 printf("%s -> ", ipath); 117 dump_bytes_hex(data, size); 118 fputs(" ('", stdout); 119 dump_bytes_text(data, size); 120 fputs("')\n", stdout); 121 122 return EOK; 123 } 41 124 42 125 static void dump_bytes_hex(char *data, size_t size) 43 126 { 44 for (size_t i = 0; i < size; i++) { 45 if (i > 0) 46 putchar(' '); 127 size_t i; 128 129 for (i = 0; i < size; ++i) { 130 if (i > 0) putchar(' '); 47 131 printf("0x%02x", (uint8_t) data[i]); 48 132 } … … 51 135 static void dump_bytes_text(char *data, size_t size) 52 136 { 53 size_t offset = 0; 54 137 wchar_t c; 138 size_t offset; 139 140 offset = 0; 141 55 142 while (offset < size) { 56 wchar_tc = str_decode(data, &offset, size);143 c = str_decode(data, &offset, size); 57 144 printf("%lc", (wint_t) c); 58 145 } 59 146 } 60 147 61 static int print_item_val(char *ipath) 148 149 static void print_syntax(void) 62 150 { 63 sysarg_t value; 64 int rc = sysinfo_get_value(ipath, &value); 65 if (rc != EOK) { 66 printf("Error reading item '%s'.\n", ipath); 67 return rc; 68 } 69 70 printf("%s -> %" PRIu64 " (0x%" PRIx64 ")\n", ipath, 71 (uint64_t) value, (uint64_t) value); 72 73 return EOK; 74 } 75 76 static int print_item_data(char *ipath) 77 { 78 size_t size; 79 void *data = sysinfo_get_data(ipath, &size); 80 if (data == NULL) { 81 printf("Error reading item '%s'.\n", ipath); 82 return -1; 83 } 84 85 printf("%s -> ", ipath); 86 dump_bytes_hex(data, size); 87 fputs(" ('", stdout); 88 dump_bytes_text(data, size); 89 fputs("')\n", stdout); 90 91 return EOK; 92 } 93 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; 151 printf("Syntax: sysinfo <item_path>\n"); 201 152 } 202 153 -
uspace/drv/bus/usb/uhci/transfer_list.c
r98cb0495 r6561a8e 110 110 assert(instance); 111 111 assert(uhci_batch); 112 usb_log_debug2(" Batch %p adding to queue %s.\n",113 uhci_batch->usb_batch , instance->name);112 usb_log_debug2("Queue %s: Adding batch(%p).\n", instance->name, 113 uhci_batch->usb_batch); 114 114 115 115 fibril_mutex_lock(&instance->guard); … … 139 139 list_append(&uhci_batch->link, &instance->batch_list); 140 140 141 usb_log_debug2("Batch %p " USB_TRANSFER_BATCH_FMT 142 " scheduled in queue %s.\n", uhci_batch->usb_batch,143 USB_TRANSFER_BATCH_ARGS(*uhci_batch->usb_batch),instance->name);141 usb_log_debug2("Batch %p " USB_TRANSFER_BATCH_FMT " scheduled in queue %s.\n", 142 uhci_batch, USB_TRANSFER_BATCH_ARGS(*uhci_batch->usb_batch), 143 instance->name); 144 144 fibril_mutex_unlock(&instance->guard); 145 145 } … … 205 205 assert(fibril_mutex_is_locked(&instance->guard)); 206 206 207 usb_log_debug2(" Batch %p removing from queue %s.\n",208 uhci_batch->usb_batch, instance->name);207 usb_log_debug2("Queue %s: removing batch(%p).\n", 208 instance->name, uhci_batch->usb_batch); 209 209 210 210 /* Assume I'm the first */ … … 228 228 list_remove(&uhci_batch->link); 229 229 usb_log_debug2("Batch %p " USB_TRANSFER_BATCH_FMT " removed (%s) " 230 "from %s, next: %x.\n", uhci_batch->usb_batch,231 USB_TRANSFER_BATCH_ARGS(*uhci_batch->usb_batch),230 "from %s, next: %x.\n", 231 uhci_batch, USB_TRANSFER_BATCH_ARGS(*uhci_batch->usb_batch), 232 232 qpos, instance->name, uhci_batch->qh->next); 233 233 } -
uspace/drv/bus/usb/uhci/uhci_batch.c
r98cb0495 r6561a8e 174 174 assert(uhci_batch->usb_batch->ep != NULL); 175 175 176 usb_log_debug("Batch %p found error TD(%zu->%p):%"176 usb_log_debug("Batch(%p) found error TD(%zu):%" 177 177 PRIx32 ".\n", uhci_batch->usb_batch, i, 178 &uhci_batch->tds[i],uhci_batch->tds[i].status);178 uhci_batch->tds[i].status); 179 179 td_print_status(&uhci_batch->tds[i]); 180 180 -
uspace/drv/char/ps2mouse/ps2mouse.c
r98cb0495 r6561a8e 80 80 } \ 81 81 if (data != (value)) { \ 82 ddf_msg(LVL_ DEBUG, "Failed testing byte: got %hhx vs. %hhx)", \82 ddf_msg(LVL_ERROR, "Failed testing byte: got %hhx vs. %hhx)", \ 83 83 data, (value)); \ 84 84 return EIO; \ -
uspace/lib/c/generic/str.c
r98cb0495 r6561a8e 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 str266 * (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 string272 *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 str287 * (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 string293 *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));298 261 } 299 262 -
uspace/lib/c/generic/sysinfo.c
r98cb0495 r6561a8e 40 40 #include <bool.h> 41 41 42 /** Get sysinfo keys size43 *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 keys57 *58 * @param path Sysinfo path.59 * @param value Pointer to store the keys size.60 *61 * @return Keys read from sysinfo or NULL if the62 * sysinfo item has no subkeys.63 * The returned non-NULL pointer should be64 * 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 buffer72 * 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 106 42 /** Get sysinfo item type 107 43 * … … 134 70 /** Get sysinfo binary data size 135 71 * 136 * @param path Sysinfo path.137 * @param size Pointer to store the binary data size.72 * @param path Sysinfo path. 73 * @param value Pointer to store the binary data size. 138 74 * 139 75 * @return EOK if the value was successfully read and … … 149 85 /** Get sysinfo binary data 150 86 * 151 * @param path Sysinfo path.152 * @param size Pointer to store the binary data size.87 * @param path Sysinfo path. 88 * @param value Pointer to store the binary data size. 153 89 * 154 90 * @return Binary data read from sysinfo or NULL if the … … 198 134 } 199 135 200 /** Get sysinfo property201 *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 the207 * sysinfo item value type is not binary data.208 * The returned non-NULL pointer should be209 * 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 263 136 /** @} 264 137 */ -
uspace/lib/c/include/str.h
r98cb0495 r6561a8e 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);65 62 66 63 extern size_t str_lsize(const char *str, size_t max_len); -
uspace/lib/c/include/sysinfo.h
r98cb0495 r6561a8e 40 40 #include <abi/sysinfo.h> 41 41 42 extern char *sysinfo_get_keys(const char *, size_t *);43 42 extern sysinfo_item_val_type_t sysinfo_get_val_type(const char *); 44 43 extern int sysinfo_get_value(const char *, sysarg_t *); 45 44 extern void *sysinfo_get_data(const char *, size_t *); 46 extern void *sysinfo_get_property(const char *, const char *, size_t *);47 45 48 46 #endif -
uspace/srv/fs/exfat/exfat_bitmap.c
r98cb0495 r6561a8e 48 48 49 49 50 int exfat_bitmap_is_free(exfat_bs_t *bs, service_id_t service_id,50 int 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 exfat_bitmap_set_cluster(exfat_bs_t *bs, service_id_t service_id,91 int 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 exfat_bitmap_clear_cluster(exfat_bs_t *bs, service_id_t service_id,126 int 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 exfat_bitmap_set_clusters(exfat_bs_t *bs, service_id_t service_id,162 int 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 = exfat_bitmap_set_cluster(bs, service_id, clst);170 rc = bitmap_set_cluster(bs, service_id, clst); 171 171 if (rc != EOK) { 172 172 if (clst - firstc > 0) 173 (void) exfat_bitmap_clear_clusters(bs, service_id,173 (void) bitmap_clear_clusters(bs, service_id, 174 174 firstc, clst - firstc); 175 175 return rc; … … 180 180 } 181 181 182 int exfat_bitmap_clear_clusters(exfat_bs_t *bs, service_id_t service_id,182 int 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 = exfat_bitmap_clear_cluster(bs, service_id, clst);190 rc = bitmap_clear_cluster(bs, service_id, clst); 191 191 if (rc != EOK) 192 192 return rc; … … 196 196 } 197 197 198 int exfat_bitmap_alloc_clusters(exfat_bs_t *bs, service_id_t service_id,198 int 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 ( exfat_bitmap_is_free(bs, service_id, endc) == EOK) {206 while (bitmap_is_free(bs, service_id, endc) == EOK) { 207 207 if ((endc - startc) + 1 == count) { 208 208 *firstc = startc; 209 return exfat_bitmap_set_clusters(bs, service_id, startc, count);209 return bitmap_set_clusters(bs, service_id, startc, count); 210 210 } else 211 211 endc++; … … 217 217 218 218 219 int exfat_bitmap_append_clusters(exfat_bs_t *bs, exfat_node_t *nodep,219 int 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 exfat_bitmap_alloc_clusters(bs, nodep->idx->service_id,223 return 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 ( exfat_bitmap_is_free(bs, nodep->idx->service_id, clst) == EOK) {230 while (bitmap_is_free(bs, nodep->idx->service_id, clst) == EOK) { 231 231 if (clst - lastc == count){ 232 return exfat_bitmap_set_clusters(bs, nodep->idx->service_id,232 return bitmap_set_clusters(bs, nodep->idx->service_id, 233 233 lastc + 1, count); 234 234 } else … … 240 240 241 241 242 int exfat_bitmap_free_clusters(exfat_bs_t *bs, exfat_node_t *nodep,242 int 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 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)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) 254 254 { 255 255 int rc; -
uspace/srv/fs/exfat/exfat_bitmap.h
r98cb0495 r6561a8e 42 42 struct exfat_bs; 43 43 44 extern int exfat_bitmap_alloc_clusters(struct exfat_bs *, service_id_t,44 extern int bitmap_alloc_clusters(struct exfat_bs *, service_id_t, 45 45 exfat_cluster_t *, exfat_cluster_t); 46 extern int exfat_bitmap_append_clusters(struct exfat_bs *, struct exfat_node *,46 extern int bitmap_append_clusters(struct exfat_bs *, struct exfat_node *, 47 47 exfat_cluster_t); 48 extern int exfat_bitmap_free_clusters(struct exfat_bs *, struct exfat_node *,48 extern int bitmap_free_clusters(struct exfat_bs *, struct exfat_node *, 49 49 exfat_cluster_t); 50 extern int exfat_bitmap_replicate_clusters(struct exfat_bs *, struct exfat_node *);50 extern int bitmap_replicate_clusters(struct exfat_bs *, struct exfat_node *); 51 51 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,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, 55 55 exfat_cluster_t); 56 56 57 extern int exfat_bitmap_set_clusters(struct exfat_bs *, service_id_t,57 extern int bitmap_set_clusters(struct exfat_bs *, service_id_t, 58 58 exfat_cluster_t, exfat_cluster_t); 59 extern int exfat_bitmap_clear_clusters(struct exfat_bs *, service_id_t,59 extern int 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
r98cb0495 r6561a8e 130 130 } 131 131 132 size_t exfat_utf16_length(const uint16_t *wstr)132 size_t utf16_length(const uint16_t *wstr) 133 133 { 134 134 size_t len = 0; -
uspace/srv/fs/exfat/exfat_dentry.h
r98cb0495 r6561a8e 160 160 extern bool exfat_valid_name(const char *); 161 161 162 extern size_t exfat_utf16_length(const uint16_t *);162 extern size_t utf16_length(const uint16_t *); 163 163 164 164 -
uspace/srv/fs/exfat/exfat_directory.c
r98cb0495 r6561a8e 371 371 ds.stream.valid_data_size = 0; 372 372 ds.stream.data_size = 0; 373 ds.stream.name_size = exfat_utf16_length(wname);373 ds.stream.name_size = 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
r98cb0495 r6561a8e 314 314 clst++) { 315 315 /* Need to rewrite because of multiple exfat_bitmap_get calls */ 316 if ( exfat_bitmap_is_free(bs, service_id, clst) == EOK) {316 if (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 = exfat_bitmap_set_cluster(bs, service_id, clst);327 rc = 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) exfat_bitmap_clear_cluster(bs, service_id, lifo[found]);348 (void) 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 = exfat_bitmap_clear_cluster(bs, service_id, firstc);380 rc = bitmap_clear_cluster(bs, service_id, firstc); 381 381 if (rc != EOK) 382 382 return rc; -
uspace/srv/fs/exfat/exfat_ops.c
r98cb0495 r6561a8e 405 405 406 406 if (!nodep->fragmented) { 407 rc = exfat_bitmap_append_clusters(bs, nodep, clusters);407 rc = 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 = exfat_bitmap_replicate_clusters(bs, nodep);413 rc = 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 = exfat_bitmap_free_clusters(bs, nodep, clsts);459 rc = bitmap_free_clusters(bs, nodep, clsts); 460 460 if (rc != EOK) 461 461 return rc; … … 704 704 nodep->firstc); 705 705 else 706 rc = exfat_bitmap_free_clusters(bs, nodep,706 rc = 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 760 763 fibril_mutex_lock(&childp->idx->lock); 764 761 765 762 766 childp->idx->pfc = parentp->firstc; … … 1459 1463 } 1460 1464 1461 int rc2 = exfat_node_put(fn); 1462 if (rc == EOK && rc2 != EOK) 1463 rc = rc2; 1464 1465 (void) exfat_node_put(fn); 1465 1466 return rc; 1466 1467 }
Note:
See TracChangeset
for help on using the changeset viewer.