All pastes #571793 Raw Edit

repository.c

public c v1 · immutable
·published 2007-06-17 10:04 UTC
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;}