rendered paste body#include "repository.h"#include "hv.h"#include <stdarg.h>#include <stddef.h>#include <stdint.h>#include <stdio.h>typedef union{ uint64_t l; char t[8];} token;const ps3_bus_type bus_types[PS3_DEV_TYPE_MAX] ={ PS3_BUS_TYPE_STORAGE, /* PS3_DEV_TYPE_STOR_DISK */ PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_SB, /* PS3_DEV_TYPE_SB_GELIC */ PS3_BUS_TYPE_SB, /* PS3_DEV_TYPE_SB_USB */ PS3_BUS_TYPE_STORAGE, /* PS3_DEV_TYPE_STOR_ROM */ PS3_BUS_TYPE_SB, /* PS3_DEV_TYPE_SB_GPIO */ PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_UNKNOWN0, PS3_BUS_TYPE_STORAGE, /* PS3_DEV_TYPE_STOR_FLASH */ PS3_BUS_TYPE_UNKNOWN0 };#define AUTO_VALUE_PUID 0x7075696400000000static void build_key(token tokens[4], const char* key, va_list ap){ int64_t key_index; int64_t tok_index; int64_t char_offset; char c; token token_value_name; uint64_t token_value_number;#define TOKEN_NAME 0#define TOKEN_VALUE 1#define TOKEN_VALUE_NAME 2#define TOKEN_VALUE_NUMBER 3#define TOKEN_NEXT 4#define TOKEN_END 5 uint64_t key_parse_state = TOKEN_NAME; tokens[0].l = 0; tokens[1].l = 0; tokens[2].l = 0; tokens[3].l = 0; key_index = 0; tok_index = 0; char_offset = 4; /* First key always has 4 nulls to start */ do { switch (key_parse_state) { case TOKEN_NAME: c = key[key_index]; key_index++; if (c == '#') { key_parse_state = TOKEN_VALUE; } else if (c == '.') { tok_index++; char_offset = 0; if (tok_index >= 4) { key_parse_state = TOKEN_END; } } else if (c == '\0') { key_parse_state = TOKEN_END; } else { if (char_offset < 8) { tokens[tok_index].t[char_offset] = c; char_offset++; } } break; case TOKEN_VALUE: c = key[key_index]; key_index++; if (c == '<') { char_offset = 0; key_parse_state = TOKEN_VALUE_NAME; } else if (c == '.') { tok_index++; char_offset = 0; if (tok_index >= 4) { key_parse_state = TOKEN_END; } else { key_parse_state = TOKEN_NAME; } } else if (c == '\0') { key_parse_state = TOKEN_END; } else if ((c < '0') || (c > '9')) { key_parse_state = TOKEN_NEXT; } else { key_parse_state = TOKEN_VALUE_NUMBER; token_value_number = c - '0'; } break; case TOKEN_VALUE_NAME: c = key[key_index]; key_index++; if (c == '>') { /* Process name */ switch(token_value_name.l) { case AUTO_VALUE_PUID: lv1_get_logical_pu_id(&token_value_number); break; default: token_value_number = va_arg (ap, unsigned long); break; } tokens[tok_index].l += token_value_number; key_parse_state = TOKEN_NEXT; } else if (c == '\0') { key_parse_state = TOKEN_END; } else { if (char_offset < 8) { token_value_name.t[char_offset] = c; char_offset++; } } break; case TOKEN_VALUE_NUMBER: c = key[key_index]; key_index++; if (c == '\0') { tokens[tok_index].l += token_value_number; key_parse_state = TOKEN_END; } else if (c == '.') { tokens[tok_index].l += token_value_number; tok_index++; char_offset = 0; if (tok_index >= 4) { key_parse_state = TOKEN_END; } else { key_parse_state = TOKEN_NAME; } } else if ((c < '0') || (c > '9')) { tokens[tok_index].l += token_value_number; key_parse_state = TOKEN_NEXT; } else { token_value_number = (token_value_number * 10) + (c - '0'); } break; case TOKEN_NEXT: c = key[key_index]; key_index++; if (c == '\0') { key_parse_state = TOKEN_END; } else if (c == '.') { tok_index++; char_offset = 0; if (tok_index >= 4) { key_parse_state = TOKEN_END; } else { key_parse_state = TOKEN_NAME; } } break; case TOKEN_END: break; } } while (key_parse_state != TOKEN_END);}int64_t read_repository(uint64_t *v1, uint64_t *v2, const char* key, ...){ uint64_t temp_v1; uint64_t temp_v2; uint64_t lpar_id = 1; /* Default */ int64_t rc; token tokens[4]; va_list ap; va_start(ap,key); build_key(tokens, key, ap); printf("rep - 0x%lx, 0x%lx.0x%lx.0x%lx.0x%lx\n",lpar_id,tokens[0].l,tokens[1].l,tokens[2].l,tokens[3].l); if (tokens[0].l == 0x0000000062690000) /* "bi" */ { /* most are the default value of 1. "bi" needs the lpar_id */ lv1_get_logical_partition_id(&lpar_id); } rc = lv1_get_repository_node_value(lpar_id, tokens[0].l,tokens[1].l,tokens[2].l,tokens[3].l, &temp_v1, &temp_v2); if (v1 != NULL) *v1 = temp_v1; if (v2 != NULL) *v2 = temp_v2; va_end (ap); return rc;}int64_t create_repository(uint64_t v1, uint64_t v2, const char* key, ...){ int64_t rc; token tokens[4]; va_list ap; va_start(ap,key); build_key(tokens, key, ap); rc = lv1_create_repository_node(tokens[0].l,tokens[1].l,tokens[2].l,tokens[3].l, v1, v2 ); return rc;}int64_t modify_repository(uint64_t v1, uint64_t v2, const char* key, ...){ int64_t rc; token tokens[4]; va_list ap; va_start(ap,key); build_key(tokens, key, ap); rc = lv1_modify_repository_node_value(tokens[0].l,tokens[1].l,tokens[2].l,tokens[3].l, v1, v2 ); return rc;}int64_t delete_repository(const char* key, ...){ int64_t rc; token tokens[4]; va_list ap; va_start(ap,key); build_key(tokens, key, ap); rc = lv1_remove_repository_node(tokens[0].l,tokens[1].l,tokens[2].l,tokens[3].l); return rc;}int64_t ps3_find_device(ps3_dev_type dev, uint64_t dev_num, uint64_t *bus_index, uint64_t *device_index){ uint64_t bi; uint64_t di; uint64_t bnd; int64_t rc; uint64_t bt; uint64_t dt; for (bi = 0; bi < 256; bi++) { rc = read_repository(&bt,NULL,KEY_BUS_TYPE,bi); if (rc == LV1_SUCCESS) printf("Found Bus # %ld, type %ld\n", bi, bt); if ((rc == LV1_SUCCESS) && (bt == bus_types[dev])) { rc = read_repository(&bnd,NULL,KEY_BUS_NUMDEV,bi); if (rc == LV1_SUCCESS) { printf(" With %ld devices - ", bnd); for (di = 0; di < bnd; di++) { rc = read_repository(&dt,NULL,KEY_BUS_DEV_TYPE,bi,di); if (rc == LV1_SUCCESS) printf(" %ld:%ld ", di, dt); if ((rc == LV1_SUCCESS) && (dt == dev)) { if (dev_num == 0) { *device_index = di; *bus_index = bi; bi = 257; // Terminate device index loop. di = bnd+1; // Terminate device index loop. } else { dev_num--; } } } printf("\n"); } } } return rc;}int64_t ps3_get_irq(uint64_t bus_index, uint64_t device_index, ps3_interrupt_type intr_type, uint64_t *interrupt_id){ int64_t res = LV1_NO_MATCH; int64_t rc; uint64_t ii; ps3_interrupt_type t; uint64_t id; printf("sizeof ps3_interrupt_type = %ld\n",sizeof(ps3_interrupt_type)); for (ii = 0; ii < 10; ii++) { rc = read_repository((uint64_t*)&t,&id,KEY_BUS_DEV_INTR,bus_index,device_index,ii); printf("IRQ Hunt for %ld #%ld, %ld:%ld = %ld - %ld\n", (uint64_t)intr_type, ii,bus_index,device_index,(uint64_t)t,id); if ((rc == LV1_SUCCESS) && (t == intr_type)) { *interrupt_id = id; res = LV1_SUCCESS; break; /* Exit for loop, we have our answer */ } } return res;}