Changeset c6588ce in mainline for kernel/genarch
- Timestamp:
- 2012-05-05T08:12:17Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ee04c28
- Parents:
- 2cc7f16 (diff), d21e935c (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:
- kernel/genarch
- Files:
-
- 7 edited
-
include/ofw/ofw_tree.h (modified) (1 diff)
-
include/softint/division.h (modified) (1 diff)
-
include/softint/multiplication.h (modified) (2 diffs)
-
src/fb/fb.c (modified) (1 diff)
-
src/ofw/ofw_tree.c (modified) (13 diffs)
-
src/softint/division.c (modified) (12 diffs)
-
src/softint/multiplication.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/include/ofw/ofw_tree.h
r2cc7f16 rc6588ce 67 67 68 68 extern void ofw_tree_init(ofw_tree_node_t *); 69 extern void ofw_ tree_print(void);69 extern void ofw_sysinfo_map(void); 70 70 71 71 extern const char *ofw_tree_node_name(const ofw_tree_node_t *); -
kernel/genarch/include/softint/division.h
r2cc7f16 rc6588ce 36 36 #define KERN_DIVISION_H_ 37 37 38 /* 32bit integer division */ 39 int __divsi3(int a, int b);38 extern int __divsi3(int, int); 39 extern long long __divdi3(long long, long long); 40 40 41 /* 64bit integer division */ 42 long long __divdi3(long long a, long long b);41 extern unsigned int __udivsi3(unsigned int, unsigned int); 42 extern unsigned long long __udivdi3(unsigned long long, unsigned long long); 43 43 44 /* 32bit unsigned integer division */ 45 unsigned int __udivsi3(unsigned int a, unsigned int b);44 extern int __modsi3(int, int); 45 extern long long __moddi3(long long, long long); 46 46 47 /* 64bit unsigned integer division */ 48 unsigned long long __udivdi3(unsigned long long a, unsigned long long b);47 extern unsigned int __umodsi3(unsigned int, unsigned int); 48 extern unsigned long long __umoddi3(unsigned long long, unsigned long long); 49 49 50 /* 32bit remainder of the signed division */ 51 int __modsi3(int a, int b);50 extern int __divmodsi3(int, int, int *); 51 extern unsigned int __udivmodsi3(unsigned int, unsigned int, unsigned int *); 52 52 53 /* 64bit remainder of the signed division */ 54 long long __moddi3(long long a, long long b); 55 56 /* 32bit remainder of the unsigned division */ 57 unsigned int __umodsi3(unsigned int a, unsigned int b); 58 59 /* 64bit remainder of the unsigned division */ 60 unsigned long long __umoddi3(unsigned long long a, unsigned long long b); 61 62 unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, unsigned long long *c); 53 extern long long __divmoddi3(long long, long long, long long *); 54 extern unsigned long long __udivmoddi3(unsigned long long, unsigned long long, 55 unsigned long long *); 63 56 64 57 #endif -
kernel/genarch/include/softint/multiplication.h
r2cc7f16 rc6588ce 29 29 /** @addtogroup genarch 30 30 * @{ 31 */ 31 */ 32 32 /** 33 33 * @file 34 34 */ 35 35 36 #ifndef __SOFTINT_MULTIPLICATION_H__37 #define __SOFTINT_MULTIPLICATION_H__36 #ifndef KERN_MULTIPLICATION_H_ 37 #define KERN_MULTIPLICATION_H_ 38 38 39 39 /* 64 bit multiplication */ 40 long long __muldi3(long long a, long long b);40 extern long long __muldi3(long long, long long); 41 41 42 42 #endif … … 44 44 /** @} 45 45 */ 46 47 -
kernel/genarch/src/fb/fb.c
r2cc7f16 rc6588ce 390 390 instance->position / instance->cols, false); 391 391 instance->position++; 392 } while (( instance->position % 8)393 &&(instance->position < instance->cols * instance->rows));392 } while (((instance->position % instance->cols) % 8 != 0) && 393 (instance->position < instance->cols * instance->rows)); 394 394 break; 395 395 default: -
kernel/genarch/src/ofw/ofw_tree.c
r2cc7f16 rc6588ce 38 38 #include <genarch/ofw/ofw_tree.h> 39 39 #include <mm/slab.h> 40 #include <sysinfo/sysinfo.h> 40 41 #include <memstr.h> 41 42 #include <str.h> … … 65 66 const char *name) 66 67 { 67 size_t i; 68 69 for (i = 0; i < node->properties; i++) { 68 for (size_t i = 0; i < node->properties; i++) { 70 69 if (str_cmp(node->property[i].name, name) == 0) 71 70 return &node->property[i]; … … 104 103 const char *name) 105 104 { 106 ofw_tree_node_t *cur;107 108 105 /* 109 106 * Try to find the disambigued name. 110 107 */ 111 for ( cur = node->child; cur; cur = cur->peer) {108 for (ofw_tree_node_t *cur = node->child; cur; cur = cur->peer) { 112 109 if (str_cmp(cur->da_name, name) == 0) 113 110 return cur; … … 121 118 * are not always fully-qualified. 122 119 */ 123 for ( cur = node->child; cur; cur = cur->peer) {120 for (ofw_tree_node_t *cur = node->child; cur; cur = cur->peer) { 124 121 if (str_cmp(ofw_tree_node_name(cur), name) == 0) 125 122 return cur; … … 141 138 const char *dtype) 142 139 { 143 ofw_tree_node_t *cur; 144 145 for (cur = node->child; cur; cur = cur->peer) { 140 for (ofw_tree_node_t *cur = node->child; cur; cur = cur->peer) { 146 141 ofw_tree_property_t *prop = 147 142 ofw_tree_getprop(cur, "device_type"); … … 172 167 phandle handle) 173 168 { 174 ofw_tree_node_t *cur; 175 176 for (cur = root; cur; cur = cur->peer) { 169 for (ofw_tree_node_t *cur = root; cur; cur = cur->peer) { 177 170 if (cur->node_handle == handle) 178 171 return cur; 179 172 180 173 if (cur->child) { 181 ofw_tree_node_t *node 182 =ofw_tree_find_node_by_handle(cur->child, handle);174 ofw_tree_node_t *node = 175 ofw_tree_find_node_by_handle(cur->child, handle); 183 176 if (node) 184 177 return node; … … 201 194 const char *dtype) 202 195 { 203 ofw_tree_node_t *cur; 204 205 for (cur = node->peer; cur; cur = cur->peer) { 196 for (ofw_tree_node_t *cur = node->peer; cur; cur = cur->peer) { 206 197 ofw_tree_property_t *prop = 207 198 ofw_tree_getprop(cur, "device_type"); … … 229 220 const char *name) 230 221 { 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"); 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"); 236 225 237 226 if ((!prop) || (!prop->value)) … … 259 248 260 249 ofw_tree_node_t *node = ofw_root; 261 size_t i;262 250 size_t j; 263 251 264 for ( i = 1; (i < str_size(path)) && (node); i = j + 1) {252 for (size_t i = 1; (i < str_size(path)) && (node); i = j + 1) { 265 253 for (j = i; (j < str_size(path)) && (path[j] != '/'); j++); 266 254 … … 294 282 const char *dtype, ofw_tree_walker_t walker, void *arg) 295 283 { 296 ofw_tree_node_t *cur; 297 298 for (cur = node; cur; cur = cur->peer) { 284 for (ofw_tree_node_t *cur = node; cur; cur = cur->peer) { 299 285 ofw_tree_property_t *prop = 300 286 ofw_tree_getprop(cur, "device_type"); … … 334 320 } 335 321 336 /** Print OpenFirmware device subtree rooted in a node. 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. 337 376 * 338 377 * Child nodes are processed recursively and peer nodes are processed … … 343 382 * 344 383 */ 345 static void ofw_tree_node_ print(ofw_tree_node_t *node, const char *path)384 static void ofw_tree_node_sysinfo(ofw_tree_node_t *node, const char *path) 346 385 { 347 386 char *cur_path = (char *) malloc(PATH_MAX_LEN, 0); 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 } 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); 358 396 359 397 if (cur->child) 360 ofw_tree_node_ print(cur->child, cur_path);398 ofw_tree_node_sysinfo(cur->child, cur_path); 361 399 } 362 400 … … 364 402 } 365 403 366 /** Print the structure of the OpenFirmware device tree. */367 void ofw_ tree_print(void)368 { 369 ofw_tree_node_ print(ofw_root, NULL);404 /** Map the OpenFirmware device tree into sysinfo. */ 405 void ofw_sysinfo_map(void) 406 { 407 ofw_tree_node_sysinfo(ofw_root, NULL); 370 408 } 371 409 -
kernel/genarch/src/softint/division.c
r2cc7f16 rc6588ce 27 27 */ 28 28 29 /** @addtogroup genarch 29 /** @addtogroup genarch 30 30 * @{ 31 31 */ … … 35 35 #include <genarch/softint/division.h> 36 36 37 #define ABSVAL(x) ((x) > 0 ? (x) : -(x))38 #define SGN(x) ((x) >= 0 ? 1 : 0)39 37 #define ABSVAL(x) ((x) > 0 ? (x) : -(x)) 38 #define SGN(x) ((x) >= 0 ? 1 : 0) 39 40 40 static unsigned int divandmod32(unsigned int a, unsigned int b, 41 41 unsigned int *remainder) … … 56 56 return 0; 57 57 } 58 58 59 59 for (; steps > 0; steps--) { 60 60 /* shift one bit to remainder */ … … 68 68 a <<= 1; 69 69 } 70 70 71 71 return result; 72 72 } 73 74 73 75 74 static unsigned long long divandmod64(unsigned long long a, … … 77 76 { 78 77 unsigned long long result; 79 int steps = sizeof(unsigned long long) * 8; 78 int steps = sizeof(unsigned long long) * 8; 80 79 81 80 *remainder = 0; … … 91 90 return 0; 92 91 } 93 92 94 93 for (; steps > 0; steps--) { 95 94 /* shift one bit to remainder */ … … 103 102 a <<= 1; 104 103 } 105 104 106 105 return result; 107 106 } 108 107 109 108 /* 32bit integer division */ 110 int __divsi3(int a, int b) 111 { 112 unsigned int rem; 113 int result; 114 115 result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem); 116 109 int __divsi3(int a, int b) 110 { 111 unsigned int rem; 112 int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem); 113 117 114 if (SGN(a) == SGN(b)) 118 115 return result; 116 119 117 return -result; 120 118 } 121 119 122 120 /* 64bit integer division */ 123 long long __divdi3(long long a, long long b) 124 { 125 unsigned long long rem; 126 long long result; 127 128 result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem); 129 121 long long __divdi3(long long a, long long b) 122 { 123 unsigned long long rem; 124 long long result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem); 125 130 126 if (SGN(a) == SGN(b)) 131 127 return result; 128 132 129 return -result; 133 130 } … … 143 140 unsigned long long __udivdi3(unsigned long long a, unsigned long long b) 144 141 { 145 unsigned long long rem;142 unsigned long long rem; 146 143 return divandmod64(a, b, &rem); 147 144 } … … 154 151 155 152 /* if divident is negative, remainder must be too */ 156 if (!(SGN(a))) {153 if (!(SGN(a))) 157 154 return -((int) rem); 158 }159 155 160 156 return (int) rem; … … 162 158 163 159 /* 64bit remainder of the signed division */ 164 long long __moddi3(long long a, longlong b)160 long long __moddi3(long long a, long long b) 165 161 { 166 162 unsigned long long rem; … … 168 164 169 165 /* if divident is negative, remainder must be too */ 170 if (!(SGN(a))) {166 if (!(SGN(a))) 171 167 return -((long long) rem); 172 }173 168 174 169 return (long long) rem; … … 191 186 } 192 187 188 int __divmodsi3(int a, int b, int *c) 189 { 190 unsigned int rem; 191 int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem); 192 193 if (SGN(a) == SGN(b)) { 194 *c = rem; 195 return result; 196 } 197 198 *c = -rem; 199 return -result; 200 } 201 202 unsigned int __udivmodsi3(unsigned int a, unsigned int b, 203 unsigned int *c) 204 { 205 return divandmod32(a, b, c); 206 } 207 208 long long __divmoddi3(long long a, long long b, long long *c) 209 { 210 unsigned long long rem; 211 long long result = (int) divandmod64(ABSVAL(a), ABSVAL(b), &rem); 212 213 if (SGN(a) == SGN(b)) { 214 *c = rem; 215 return result; 216 } 217 218 *c = -rem; 219 return -result; 220 } 221 193 222 unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, 194 223 unsigned long long *c) -
kernel/genarch/src/softint/multiplication.c
r2cc7f16 rc6588ce 29 29 /** @addtogroup genarch 30 30 * @{ 31 */ 31 */ 32 32 /** 33 33 * @file … … 130 130 131 131 return result; 132 } 132 } 133 133 134 134 /** @}
Note:
See TracChangeset
for help on using the changeset viewer.
