|
|
1.1 ! root 1: ! 2: #include "of1275.h" ! 3: #include "endian.h" ! 4: static int (*of1275_server) (void *) = (int (*)(void *)) -1; ! 5: ! 6: _start(void *residual_data_structure, ! 7: void *program_entry_point, ! 8: int (*client_interface_handler) (void *), void *args, int argslen) ! 9: { ! 10: int status; ! 11: of1275_server = client_interface_handler; ! 12: status = main(); ! 13: of1275_exit(status); ! 14: } ! 15: ! 16: /* 6.3.2.1 Client interface */ ! 17: ! 18: ! 19: int of1275_test(const char *name, int *missing) ! 20: { ! 21: int result; ! 22: static of1275_test_service s; ! 23: s.service = "test"; ! 24: s.n_args = 1; ! 25: s.n_returns = 1; ! 26: s.name = name; ! 27: result = of1275_server(&s); ! 28: *missing = s.missing; ! 29: return result; ! 30: } ! 31: ! 32: ! 33: /* 6.3.2.2 Device tree */ ! 34: ! 35: ! 36: int of1275_peer(int phandle, int *sibling_phandle) ! 37: { ! 38: int result; ! 39: static of1275_peer_service s; ! 40: s.service = "peer"; ! 41: s.n_args = 1; ! 42: s.n_returns = 1; ! 43: s.phandle = phandle; ! 44: result = of1275_server(&s); ! 45: *sibling_phandle = s.sibling_phandle; ! 46: return result; ! 47: } ! 48: ! 49: int of1275_child(int phandle, int *child_phandle) ! 50: { ! 51: int result; ! 52: static of1275_child_service s; ! 53: s.service = "child"; ! 54: s.n_args = 1; ! 55: s.n_returns = 1; ! 56: s.phandle = phandle; ! 57: result = of1275_server(&s); ! 58: *child_phandle = s.child_phandle; ! 59: return result; ! 60: } ! 61: ! 62: int of1275_parent(int phandle, int *parent_phandle) ! 63: { ! 64: int result; ! 65: static of1275_parent_service s; ! 66: s.service = "parent"; ! 67: s.n_args = 1; ! 68: s.n_returns = 1; ! 69: s.phandle = phandle; ! 70: result = of1275_server(&s); ! 71: *parent_phandle = s.parent_phandle; ! 72: return result; ! 73: } ! 74: ! 75: int of1275_instance_to_package(int ihandle, int *phandle) ! 76: { ! 77: int result; ! 78: static of1275_instance_to_package_service s; ! 79: s.service = "instance-to-package"; ! 80: s.n_args = 1; ! 81: s.n_returns = 1; ! 82: s.ihandle = ihandle; ! 83: result = of1275_server(&s); ! 84: *phandle = s.phandle; ! 85: return result; ! 86: } ! 87: ! 88: int of1275_getproplen(int phandle, const char *name, int *proplen) ! 89: { ! 90: int result; ! 91: static of1275_getproplen_service s; ! 92: s.service = "getproplen"; ! 93: s.n_args = 2; ! 94: s.n_returns = 1; ! 95: s.phandle = phandle; ! 96: s.name = name; ! 97: result = of1275_server(&s); ! 98: *proplen = s.proplen; ! 99: return result; ! 100: } ! 101: ! 102: int ! 103: of1275_getprop(int phandle, const char *name, void *buf, int buflen, ! 104: int *size) ! 105: { ! 106: int result; ! 107: static of1275_getprop_service s; ! 108: s.service = "getprop"; ! 109: s.n_args = 4; ! 110: s.n_returns = 1; ! 111: s.phandle = phandle; ! 112: s.name = name; ! 113: s.buf = buf; ! 114: s.buflen = buflen; ! 115: result = of1275_server(&s); ! 116: *size = s.size; ! 117: return result; ! 118: } ! 119: ! 120: int ! 121: of1275_nextprop(int phandle, const char *previous, void *buf, int *flag) ! 122: { ! 123: int result; ! 124: static of1275_nextprop_service s; ! 125: s.service = "nextprop"; ! 126: s.n_args = 3; ! 127: s.n_returns = 1; ! 128: s.phandle = phandle; ! 129: s.previous = previous; ! 130: s.buf = buf; ! 131: result = of1275_server(&s); ! 132: *flag = s.flag; ! 133: return result; ! 134: } ! 135: ! 136: int ! 137: of1275_setprop(int phandle, const char *name, void *buf, int len, ! 138: int *size) ! 139: { ! 140: int result; ! 141: static of1275_setprop_service s; ! 142: s.service = "setprop"; ! 143: s.n_args = 4; ! 144: s.n_returns = 1; ! 145: s.phandle = phandle; ! 146: s.name = name; ! 147: s.buf = buf; ! 148: s.len = len; ! 149: result = of1275_server(&s); ! 150: *size = s.size; ! 151: return result; ! 152: } ! 153: ! 154: int ! 155: of1275_canon(const char *device_specifier, void *buf, int buflen, ! 156: int *length) ! 157: { ! 158: int result; ! 159: static of1275_canon_service s; ! 160: s.service = "canon"; ! 161: s.n_args = 3; ! 162: s.n_returns = 1; ! 163: s.device_specifier = device_specifier; ! 164: s.buf = buf; ! 165: s.buflen = buflen; ! 166: result = of1275_server(&s); ! 167: *length = s.length; ! 168: return result; ! 169: } ! 170: ! 171: int of1275_finddevice(const char *device_specifier, int *phandle) ! 172: { ! 173: int result; ! 174: static of1275_finddevice_service s; ! 175: s.service = "finddevice"; ! 176: s.n_args = 1; ! 177: s.n_returns = 1; ! 178: s.device_specifier = device_specifier; ! 179: result = of1275_server(&s); ! 180: *phandle = s.phandle; ! 181: return result; ! 182: } ! 183: ! 184: int ! 185: of1275_instance_to_path(int ihandle, void *buf, int buflen, int *length) ! 186: { ! 187: int result; ! 188: static of1275_instance_to_path_service s; ! 189: s.service = "instance-to-path"; ! 190: s.n_args = 3; ! 191: s.n_returns = 1; ! 192: s.ihandle = ihandle; ! 193: s.buf = buf; ! 194: s.buflen = buflen; ! 195: result = of1275_server(&s); ! 196: *length = s.length; ! 197: return result; ! 198: } ! 199: ! 200: int of1275_package_to_path(int phandle, void *buf, int buflen, int *length) ! 201: { ! 202: int result; ! 203: static of1275_package_to_path_service s; ! 204: s.service = "package-to-path"; ! 205: s.n_args = 3; ! 206: s.n_returns = 1; ! 207: s.phandle = phandle; ! 208: s.buf = buf; ! 209: s.buflen = buflen; ! 210: result = of1275_server(&s); ! 211: *length = s.length; ! 212: return result; ! 213: } ! 214: ! 215: /* int of1275_call_method(const char *method, int ihandle, ...); */ ! 216: ! 217: ! 218: /* 6.3.2.3 Device I/O */ ! 219: ! 220: ! 221: int of1275_open(const char *device_specifier, int *ihandle) ! 222: { ! 223: int result; ! 224: static of1275_open_service s; ! 225: s.service = "open"; ! 226: s.n_args = 1; ! 227: s.n_returns = 1; ! 228: s.device_specifier = device_specifier; ! 229: result = of1275_server(&s); ! 230: *ihandle = s.ihandle; ! 231: return result; ! 232: } ! 233: ! 234: int of1275_close(int ihandle) ! 235: { ! 236: int result; ! 237: static of1275_close_service s; ! 238: s.service = "close"; ! 239: s.n_args = 1; ! 240: s.n_returns = 0; ! 241: s.ihandle = ihandle; ! 242: result = of1275_server(&s); ! 243: return result; ! 244: } ! 245: ! 246: int of1275_read(int ihandle, void *addr, int len, int *actual) ! 247: { ! 248: int result; ! 249: static of1275_read_service s; ! 250: s.service = "read"; ! 251: s.n_args = 3; ! 252: s.n_returns = 1; ! 253: s.ihandle = ihandle; ! 254: s.addr = addr; ! 255: s.len = len; ! 256: result = of1275_server(&s); ! 257: *actual = s.actual; ! 258: return result; ! 259: } ! 260: ! 261: int of1275_write(int ihandle, void *addr, int len, int *actual) ! 262: { ! 263: int result; ! 264: static of1275_write_service s; ! 265: s.service = "write"; ! 266: s.n_args = 3; ! 267: s.n_returns = 1; ! 268: s.ihandle = ihandle; ! 269: s.addr = addr; ! 270: s.len = len; ! 271: result = of1275_server(&s); ! 272: *actual = s.actual; ! 273: return result; ! 274: } ! 275: ! 276: int of1275_seek(int ihandle, int pos_hi, int pos_lo, int *status) ! 277: { ! 278: int result; ! 279: static of1275_seek_service s; ! 280: s.service = "seek"; ! 281: s.n_args = 3; ! 282: s.n_returns = 1; ! 283: s.ihandle = ihandle; ! 284: s.pos_hi = pos_hi; ! 285: s.pos_lo = pos_lo; ! 286: result = of1275_server(&s); ! 287: *status = s.status; ! 288: return result; ! 289: } ! 290: ! 291: ! 292: /* 6.3.2.4 Memory */ ! 293: ! 294: ! 295: int of1275_claim(void *virt, int size, int align, void **baseaddr) ! 296: { ! 297: int result; ! 298: static of1275_claim_service s; ! 299: s.service = "claim"; ! 300: s.n_args = 3; ! 301: s.n_returns = 1; ! 302: s.virt = virt; ! 303: s.size = size; ! 304: s.align = align; ! 305: result = of1275_server(&s); ! 306: *baseaddr = s.baseaddr; ! 307: return result; ! 308: } ! 309: ! 310: int of1275_release(void *virt, int size) ! 311: { ! 312: int result; ! 313: static of1275_release_service s; ! 314: s.service = "release"; ! 315: s.n_args = 2; ! 316: s.n_returns = 0; ! 317: s.virt = virt; ! 318: s.size = size; ! 319: result = of1275_server(&s); ! 320: return result; ! 321: } ! 322: ! 323: ! 324: /* 6.3.2.5 Control transfer */ ! 325: ! 326: ! 327: int of1275_boot(const char *bootspec) ! 328: { ! 329: int result; ! 330: static of1275_boot_service s; ! 331: s.service = "boot"; ! 332: s.n_args = 1; ! 333: s.n_returns = 0; ! 334: s.bootspec = bootspec; ! 335: result = of1275_server(&s); ! 336: return result; ! 337: } ! 338: ! 339: int of1275_enter(void) ! 340: { ! 341: int result; ! 342: static of1275_enter_service s; ! 343: s.service = "enter"; ! 344: s.n_args = 0; ! 345: s.n_returns = 0; ! 346: result = of1275_server(&s); ! 347: return result; ! 348: } ! 349: ! 350: int of1275_exit(int status) ! 351: { ! 352: int result; ! 353: static of1275_exit_service s; ! 354: s.service = "exit"; ! 355: s.n_args = 1; ! 356: s.n_returns = 0; ! 357: s.status = status; ! 358: result = of1275_server(&s); ! 359: return result; ! 360: } ! 361: ! 362: /* int of1275_chain(void *virt, int size, void *entry, void *args, int len); */ ! 363: ! 364: ! 365: /* 6.3.2.6 User interface */ ! 366: ! 367: ! 368: /* int of1275_interpret(const char *arg, ...); */ ! 369: ! 370: int of1275_set_callback(void *newfunc, void **oldfunc) ! 371: { ! 372: int result; ! 373: static of1275_set_callback_service s; ! 374: s.service = "set-callback"; ! 375: s.n_args = 1; ! 376: s.n_returns = 1; ! 377: s.newfunc = newfunc; ! 378: result = of1275_server(&s); ! 379: *oldfunc = s.oldfunc; ! 380: return result; ! 381: } ! 382: ! 383: int of1275_set_symbol_lookup(void *sym_to_value, void *value_to_sym) ! 384: { ! 385: int result; ! 386: static of1275_set_symbol_lookup_service s; ! 387: s.service = "set-symbol-lookup"; ! 388: s.n_args = 2; ! 389: s.n_returns = 0; ! 390: s.sym_to_value = sym_to_value; ! 391: s.value_to_sym = s.value_to_sym; ! 392: result = of1275_server(&s); ! 393: return result; ! 394: } ! 395: ! 396: ! 397: /* 6.3.2.7 Time */ ! 398: ! 399: int of1275_milliseconds(int *ms) ! 400: { ! 401: int result; ! 402: static of1275_milliseconds_service s; ! 403: s.service = "milliseconds"; ! 404: s.n_args = 0; ! 405: s.n_returns = 1; ! 406: result = of1275_server(&s); ! 407: *ms = s.ms; ! 408: return result; ! 409: } ! 410: ! 411: ! 412: int of_find_integer_property(const char *device, const char *property) ! 413: { ! 414: int phandle; ! 415: int integer; ! 416: int size; ! 417: /* find the device's phandle */ ! 418: if (of1275_finddevice(device, &phandle) < 0) { ! 419: //printk("of1275: no such device '%s'\n", device); ! 420: exit(1); ! 421: } ! 422: /* find the device's property */ ! 423: of1275_getprop(phandle, property, &integer, ! 424: sizeof(integer), &size); ! 425: if (size < sizeof(integer)) { ! 426: //printk("of1275: unknown integer property '%s'\n", property); ! 427: exit(1); ! 428: } ! 429: return ntohl(integer); ! 430: } ! 431: ! 432: void ! 433: of_find_string_property(const char *device, ! 434: const char *property, ! 435: char *string, int sizeof_string) ! 436: { ! 437: int phandle; ! 438: int size; ! 439: /* find the device's phandle */ ! 440: if (of1275_finddevice(device, &phandle) < 0) { ! 441: //printk("of1275: no such device '%s'\n", device); ! 442: exit(1); ! 443: } ! 444: ! 445: /* find the device's property */ ! 446: of1275_getprop(phandle, property, string, sizeof_string, &size); ! 447: if (size == 0 || size >= sizeof_string) { ! 448: //printk("of1275: unknown string property '%s'\n", property); ! 449: exit(1); ! 450: } ! 451: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.