00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #include "xlateincl.h"
00054
00055 #ifdef _LIBELF_XTND_EXPANDED_DATA
00056 #pragma weak xlate_pro_disk_next_block_xtnd = _xlate_pro_disk_next_block_xtnd
00057 #elif defined(BUILD_OS_DARWIN)
00058 #else
00059 #pragma weak xlate_pro_disk_next_block = _xlate_pro_disk_next_block
00060 #endif
00061
00062 static int
00063 do_64bit_merge_header(xlate_table_pro table,
00064 char** data,
00065 Elf64_Xword * data_size)
00066 {
00067
00068
00069 Uword bytes_used = 0;
00070 char * data_ret = 0;
00071 Uword block_count = 0;
00072 Uword hdr_size = sizeof(xlate_header64_v2);
00073 Uword block_size = sizeof(xlate_blockheader64_v2);
00074 xlate_table_con contab = table->tb_con_table;
00075
00076
00077 xlate_header64_v2 *hdrp;
00078 xlate_blockheader64_v2 *base_oblkp;
00079 xlate_blockheader64_v2 *cur_oblkp;
00080
00081 Block_s *blk = table->tb_blockRet;
00082 Uword numentries = 0;
00083
00084 while(blk) {
00085 ++block_count;
00086 numentries += blk->bk_numEntries;
00087 blk = blk->bk_next;
00088 }
00089
00090 bytes_used = block_count*block_size + hdr_size;
00091
00092 if(data == 0) {
00093 *data_size = bytes_used;
00094 return XLATE_TB_STATUS_NO_ERROR;
00095 }
00096 data_ret = malloc(bytes_used);
00097 if(data_ret == 0) {
00098 return XLATE_TB_STATUS_ALLOC_FAIL;
00099 }
00100
00101
00102 BZERO(data_ret,bytes_used);
00103
00104 hdrp = (xlate_header64_v2 *)data_ret;
00105 base_oblkp = (xlate_blockheader64_v2*) (hdrp+1);
00106
00107 hdrp->hd_version = XLATE_TB_64_V2;
00108
00109 hdrp->hd_tablekind = table->tb_std_tablekind;
00110 hdrp->hd_new_addr_low = table->tb_std_highwater.hw_lowNewAddr;
00111 hdrp->hd_new_addr_high = table->tb_std_highwater.hw_highNewAddr;
00112 hdrp->hd_old_addr_low = table->tb_std_highwater.hw_lowOldAddr;
00113 hdrp->hd_old_addr_high = table->tb_std_highwater.hw_highOldAddr;
00114 {
00115 Elf64_Sxword data_moved;
00116 Elf64_Addr newlow;
00117 Elf64_Addr oldlow;
00118 Elf64_Addr newhigh;
00119 Elf64_Addr oldhigh;
00120 Elf64_Addr startfwa;
00121 Elf64_Addr startlwa;
00122 int old_text_exists;
00123 int old_text_alloc;
00124 int is64bit ;
00125 xlate_tablekind tablekind ;
00126 int tableversion ;
00127 int retstatus;
00128
00129 retstatus = xlate_get_info(contab,
00130 &data_moved,&newlow, &oldlow, &newhigh, &oldhigh,
00131 &startfwa,&startlwa,
00132 0,
00133 &old_text_exists,&old_text_alloc,
00134 &is64bit,&tablekind,&tableversion);
00135 if(retstatus != XLATE_TB_STATUS_NO_ERROR) {
00136 return retstatus;
00137 }
00138
00139 hdrp->hd_old_text_exists = old_text_exists;
00140 hdrp->hd_old_text_alloc = old_text_alloc;
00141 hdrp->hd_block_size = TB_BLOCK_SIZE;
00142 hdrp->hd_reg_info_size = table->tb_regInfoOffset;
00143 hdrp->hd_num_blocks = block_count;
00144 hdrp->hd_num_entries = numentries;
00145
00146
00147 hdrp->hd_data_moved =
00148 data_moved + (Elf64_Sxword)table->tb_data_moved;
00149 hdrp->hd_startup_fwa = table->tb_startup_fwa;
00150 if(hdrp->hd_startup_fwa == 0) {
00151 hdrp->hd_startup_fwa = startfwa;
00152 }
00153 hdrp->hd_startup_lwa = table->tb_startup_lwa;
00154 if(hdrp->hd_startup_lwa == 0) {
00155 hdrp->hd_startup_lwa = startlwa;
00156 }
00157
00158 }
00159 blk = table->tb_blockRet;
00160 cur_oblkp = base_oblkp;
00161 for( ; blk; blk = blk->bk_next, ++cur_oblkp ) {
00162 cur_oblkp->bh_first_new_addr = blk->bk_firstNewAddr;
00163 cur_oblkp->bh_first_old_addr = blk->bk_firstOldAddr;
00164 cur_oblkp->bh_num_entries = blk->bk_numEntries;
00165 cur_oblkp->bh_high_old_addr = blk->bk_high_old_addr;
00166 cur_oblkp->bh_low_old_addr = blk->bk_low_old_addr;
00167 }
00168
00169 *data = data_ret;
00170 *data_size = bytes_used;
00171 return XLATE_TB_STATUS_NO_ERROR;
00172 }
00173
00174 static int
00175 do_32bit_merge_header(xlate_table_pro table,
00176 char** data,
00177 Elf64_Xword * data_size)
00178 {
00179
00180 Uword bytes_used = 0;
00181 char * data_ret = 0;
00182 Uword block_count = 0;
00183 Uword hdr_size = sizeof(xlate_header32_v2);
00184 Uword block_size = sizeof(xlate_blockheader32_v2);
00185 xlate_table_con contab = table->tb_con_table;
00186
00187
00188 xlate_header32_v2 *hdrp;
00189 xlate_blockheader32_v2 *base_oblkp;
00190 xlate_blockheader32_v2 *cur_oblkp;
00191
00192 Block_s *blk = table->tb_blockRet;
00193 Uword numentries = 0;
00194
00195 while(blk) {
00196 ++block_count;
00197 numentries += blk->bk_numEntries;
00198 blk = blk->bk_next;
00199 }
00200
00201 bytes_used = block_count*block_size + hdr_size;
00202
00203 if(data == 0) {
00204 *data_size = bytes_used;
00205 return XLATE_TB_STATUS_NO_ERROR;
00206 }
00207 data_ret = malloc(bytes_used);
00208 if(data_ret == 0) {
00209 return XLATE_TB_STATUS_ALLOC_FAIL;
00210 }
00211
00212
00213 BZERO(data_ret,bytes_used);
00214
00215 hdrp = (xlate_header32_v2 *)data_ret;
00216 base_oblkp = (xlate_blockheader32_v2*) (hdrp+1);
00217
00218 hdrp->hd_version = XLATE_TB_32_V2;
00219
00220 hdrp->hd_tablekind = table->tb_std_tablekind;
00221 hdrp->hd_new_addr_low =
00222 (Elf32_Word)table->tb_std_highwater.hw_lowNewAddr;
00223 hdrp->hd_new_addr_high =
00224 (Elf32_Word)table->tb_std_highwater.hw_highNewAddr;
00225 hdrp->hd_old_addr_low =
00226 (Elf32_Word)table->tb_std_highwater.hw_lowOldAddr;
00227 hdrp->hd_old_addr_high =
00228 (Elf32_Word)table->tb_std_highwater.hw_highOldAddr;
00229 {
00230 Elf64_Sxword data_moved;
00231 Elf64_Addr newlow;
00232 Elf64_Addr oldlow;
00233 Elf64_Addr newhigh;
00234 Elf64_Addr oldhigh;
00235 Elf64_Addr startfwa;
00236 Elf64_Addr startlwa;
00237 int old_text_exists;
00238 int old_text_alloc;
00239 int is64bit ;
00240 xlate_tablekind tablekind ;
00241 int tableversion ;
00242 int retstatus;
00243
00244 retstatus = xlate_get_info(contab,
00245 &data_moved,&newlow, &oldlow, &newhigh, &oldhigh,
00246 &startfwa,&startlwa,
00247 0,
00248 &old_text_exists,&old_text_alloc,
00249 &is64bit,&tablekind,&tableversion);
00250 if(retstatus != XLATE_TB_STATUS_NO_ERROR) {
00251 return retstatus;
00252 }
00253
00254 hdrp->hd_old_text_exists = (unsigned char)old_text_exists;
00255 hdrp->hd_old_text_alloc = (unsigned char)old_text_alloc;
00256 hdrp->hd_block_size = TB_BLOCK_SIZE;
00257 hdrp->hd_reg_info_size = (Elf32_Sword)table->tb_regInfoOffset;
00258 hdrp->hd_num_blocks = (Elf32_Sword)block_count;
00259 hdrp->hd_num_entries = (Elf32_Sword)numentries;
00260
00261
00262 hdrp->hd_data_moved =(Elf32_Sword)
00263 ((Elf64_Sxword)data_moved + (Elf64_Sxword)table->tb_data_moved);
00264 hdrp->hd_startup_fwa = (Elf32_Word)table->tb_startup_fwa;
00265 if(hdrp->hd_startup_fwa == 0) {
00266 hdrp->hd_startup_fwa =
00267 (Elf32_Word)startfwa;
00268 }
00269 hdrp->hd_startup_lwa = (Elf32_Word)table->tb_startup_lwa;
00270 if(hdrp->hd_startup_lwa == 0) {
00271 hdrp->hd_startup_lwa =
00272 (Elf32_Word)startlwa;
00273 }
00274 }
00275
00276 blk = table->tb_blockRet;
00277 cur_oblkp = base_oblkp;
00278 for( ; blk; blk = blk->bk_next, ++cur_oblkp ) {
00279 cur_oblkp->bh_first_new_addr =
00280 (Elf32_Word)blk->bk_firstNewAddr;
00281 cur_oblkp->bh_first_old_addr =
00282 (Elf32_Word)blk->bk_firstOldAddr;
00283 cur_oblkp->bh_num_entries =
00284 (Elf32_Word)blk->bk_numEntries;
00285 cur_oblkp->bh_high_old_addr =
00286 (Elf32_Word)blk->bk_high_old_addr;
00287 cur_oblkp->bh_low_old_addr =
00288 (Elf32_Word)blk->bk_low_old_addr;
00289 }
00290
00291 *data = data_ret;
00292 *data_size = bytes_used;
00293 return XLATE_TB_STATUS_NO_ERROR;
00294 }
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 static int
00306 do_reginfo_merge(xlate_table_pro table,
00307 char** data,
00308 Elf64_Xword * data_size)
00309 {
00310 Uword new_bytes_used = table->tb_regInfoOffset;
00311 xlate_table_con contab = table->tb_con_table;
00312
00313
00314 char * base_reginfo = contab->xc_reginfo_data;
00315 Uword base_reginfo_len = contab->xc_hdr.ich_total_reginfo_bytes;
00316
00317 Uword bytes_used = new_bytes_used + base_reginfo_len;
00318 char* data_ret = 0;
00319
00320 if(bytes_used == 0) {
00321 return XLATE_TB_STATUS_ALREADY_DONE;
00322 }
00323
00324 if(data == 0) {
00325 *data_size = bytes_used;
00326 return XLATE_TB_STATUS_NO_ERROR;
00327 }
00328 data_ret = (char *)malloc(bytes_used);
00329 if(data_ret == 0) {
00330 return XLATE_TB_STATUS_ALLOC_FAIL;
00331 }
00332 if(base_reginfo_len > 0) {
00333 memcpy(data_ret,base_reginfo, base_reginfo_len);
00334 }
00335 if(new_bytes_used > 0) {
00336 memcpy(data_ret+base_reginfo_len,table->tb_regInfo,new_bytes_used);
00337 }
00338 *data_size = bytes_used;
00339 *data = data_ret;
00340 return XLATE_TB_STATUS_NO_ERROR;
00341
00342 }
00343
00344
00345
00346 static int
00347 _xlate_do_simple_32bit_header(xlate_table_pro table,
00348 char** data,
00349 Elf64_Xword * data_size)
00350 {
00351 Uword bytes_used = 0;
00352 char * data_ret = 0;
00353 Uword block_count = 0;
00354 Uword hdr_size = sizeof(xlate_header32_v2);
00355 Uword block_size = sizeof(xlate_blockheader32_v2);
00356
00357 xlate_header32_v2 *hdrp;
00358 xlate_blockheader32_v2 *base_oblkp;
00359 xlate_blockheader32_v2 *cur_oblkp;
00360
00361 Block_s *blk = table->tb_blockRet;
00362 Uword numentries = 0;
00363
00364 while(blk) {
00365 ++block_count;
00366 numentries += blk->bk_numEntries;
00367 blk = blk->bk_next;
00368 }
00369
00370 bytes_used = block_count*block_size + hdr_size;
00371
00372 if(data == 0) {
00373 *data_size = bytes_used;
00374 return XLATE_TB_STATUS_NO_ERROR;
00375 }
00376 data_ret = malloc(bytes_used);
00377 if(data_ret == 0) {
00378 return XLATE_TB_STATUS_ALLOC_FAIL;
00379 }
00380
00381
00382 BZERO(data_ret,bytes_used);
00383
00384 hdrp = (xlate_header32_v2 *)data_ret;
00385 base_oblkp = (xlate_blockheader32_v2*) (hdrp+1);
00386
00387 hdrp->hd_version = XLATE_TB_32_V2;
00388 if(table->tb_header_set_to_std_or_debug == XLATE_PRO_STANDARD_SETUP){
00389 hdrp->hd_tablekind = table->tb_std_tablekind;
00390 hdrp->hd_new_addr_low =
00391 (Elf32_Word)table->tb_std_highwater.hw_lowNewAddr;
00392 hdrp->hd_new_addr_high =
00393 (Elf32_Word)table->tb_std_highwater.hw_highNewAddr;
00394 hdrp->hd_old_addr_low =
00395 (Elf32_Word)table->tb_std_highwater.hw_lowOldAddr;
00396 hdrp->hd_old_addr_high =
00397 (Elf32_Word)table->tb_std_highwater.hw_highOldAddr;
00398 } else {
00399 hdrp->hd_tablekind = table->tb_debug_tablekind;
00400 hdrp->hd_new_addr_low =
00401 (Elf32_Word)table->tb_debug_highwater.hw_lowNewAddr;
00402 hdrp->hd_new_addr_high =
00403 (Elf32_Word)table->tb_debug_highwater.hw_highNewAddr;
00404 hdrp->hd_old_addr_low =
00405 (Elf32_Word)table->tb_debug_highwater.hw_lowOldAddr;
00406 hdrp->hd_old_addr_high =
00407 (Elf32_Word)table->tb_debug_highwater.hw_highOldAddr;
00408 }
00409
00410 hdrp->hd_old_text_exists = (unsigned char)table->tb_old_text_exists;
00411 hdrp->hd_old_text_alloc = (unsigned char)table->tb_old_text_alloc;
00412 hdrp->hd_block_size = TB_BLOCK_SIZE;
00413 hdrp->hd_reg_info_size = (Elf32_Word)table->tb_regInfoOffset;
00414 hdrp->hd_num_blocks = (Elf32_Word)block_count;
00415 hdrp->hd_num_entries = (Elf32_Sword)numentries;
00416
00417
00418 hdrp->hd_data_moved = (Elf32_Sword)table->tb_data_moved;
00419 hdrp->hd_startup_fwa = (Elf32_Word)table->tb_startup_fwa;
00420 hdrp->hd_startup_lwa = (Elf32_Word)table->tb_startup_lwa;
00421
00422 blk = table->tb_blockRet;
00423 cur_oblkp = base_oblkp;
00424 for( ; blk; blk = blk->bk_next, ++cur_oblkp ) {
00425 cur_oblkp->bh_first_new_addr =
00426 (Elf32_Word)blk->bk_firstNewAddr;
00427 cur_oblkp->bh_first_old_addr =
00428 (Elf32_Word)blk->bk_firstOldAddr;
00429 cur_oblkp->bh_num_entries =
00430 (Elf32_Word)blk->bk_numEntries;
00431 cur_oblkp->bh_high_old_addr =
00432 (Elf32_Word)blk->bk_high_old_addr;
00433 cur_oblkp->bh_low_old_addr =
00434 (Elf32_Word)blk->bk_low_old_addr;
00435 }
00436
00437 *data = data_ret;
00438 *data_size = bytes_used;
00439 return XLATE_TB_STATUS_NO_ERROR;
00440 }
00441
00442
00443
00444
00445 static int
00446 _xlate_do_simple_64bit_header(xlate_table_pro table,
00447 char** data,
00448 Elf64_Xword * data_size)
00449 {
00450 Uword bytes_used = 0;
00451 char * data_ret = 0;
00452 Uword block_count = 0;
00453 Uword hdr_size = sizeof(xlate_header64_v2);
00454 Uword block_size = sizeof(xlate_blockheader64_v2);
00455
00456 xlate_header64_v2 *hdrp;
00457 xlate_blockheader64_v2 *base_oblkp;
00458 xlate_blockheader64_v2 *cur_oblkp;
00459
00460 Block_s *blk = table->tb_blockRet;
00461 Uword numentries = 0;
00462
00463 while(blk) {
00464 ++block_count;
00465 numentries += blk->bk_numEntries;
00466 blk = blk->bk_next;
00467 }
00468
00469 bytes_used = block_count*block_size + hdr_size;
00470 if(data == 0) {
00471 *data_size = bytes_used;
00472 return XLATE_TB_STATUS_NO_ERROR;
00473 }
00474
00475 data_ret = malloc(bytes_used);
00476 if(data_ret == 0) {
00477 return XLATE_TB_STATUS_ALLOC_FAIL;
00478 }
00479
00480
00481 BZERO(data_ret,bytes_used);
00482
00483 hdrp = (xlate_header64_v2 *)data_ret;
00484 base_oblkp = (xlate_blockheader64_v2*) (hdrp+1);
00485
00486 hdrp->hd_version = XLATE_TB_64_V2;
00487 if(table->tb_header_set_to_std_or_debug == XLATE_PRO_STANDARD_SETUP){
00488 hdrp->hd_tablekind = table->tb_std_tablekind;
00489 hdrp->hd_new_addr_low = table->tb_std_highwater.hw_lowNewAddr;
00490 hdrp->hd_new_addr_high = table->tb_std_highwater.hw_highNewAddr;
00491 hdrp->hd_old_addr_low = table->tb_std_highwater.hw_lowOldAddr;
00492 hdrp->hd_old_addr_high = table->tb_std_highwater.hw_highOldAddr;
00493 } else {
00494 hdrp->hd_tablekind = table->tb_debug_tablekind;
00495 hdrp->hd_new_addr_low = table->tb_debug_highwater.hw_lowNewAddr;
00496 hdrp->hd_new_addr_high = table->tb_debug_highwater.hw_highNewAddr;
00497 hdrp->hd_old_addr_low = table->tb_debug_highwater.hw_lowOldAddr;
00498 hdrp->hd_old_addr_high = table->tb_debug_highwater.hw_highOldAddr;
00499 }
00500
00501 hdrp->hd_old_text_exists = table->tb_old_text_exists;
00502 hdrp->hd_old_text_alloc = table->tb_old_text_alloc;
00503 hdrp->hd_block_size = TB_BLOCK_SIZE;
00504 hdrp->hd_reg_info_size = table->tb_regInfoOffset;
00505 hdrp->hd_num_blocks = block_count;
00506 hdrp->hd_num_entries = numentries;
00507
00508
00509 hdrp->hd_data_moved = table->tb_data_moved;
00510 hdrp->hd_startup_fwa = table->tb_startup_fwa;
00511 hdrp->hd_startup_lwa = table->tb_startup_lwa;
00512
00513 blk = table->tb_blockRet;
00514 cur_oblkp = base_oblkp;
00515 for( ; blk; blk = blk->bk_next, ++cur_oblkp ) {
00516 cur_oblkp->bh_first_new_addr = blk->bk_firstNewAddr;
00517 cur_oblkp->bh_first_old_addr = blk->bk_firstOldAddr;
00518 cur_oblkp->bh_num_entries = blk->bk_numEntries;
00519 cur_oblkp->bh_high_old_addr = blk->bk_high_old_addr;
00520 cur_oblkp->bh_low_old_addr = blk->bk_low_old_addr;
00521 }
00522
00523 *data = data_ret;
00524 *data_size = bytes_used;
00525 return XLATE_TB_STATUS_NO_ERROR;
00526 }
00527
00528
00529 static int
00530 _xlate_do_local_reginfo(xlate_table_pro table,
00531 char** data,
00532 Elf64_Xword * data_size)
00533 {
00534 Uword bytes_used = table->tb_regInfoOffset;
00535 char *data_ret;
00536
00537 if(data == 0) {
00538 *data_size = bytes_used;
00539 return XLATE_TB_STATUS_NO_ERROR;
00540 }
00541 data_ret = (char *)malloc(bytes_used);
00542 if(data_ret == 0) {
00543 return XLATE_TB_STATUS_ALLOC_FAIL;
00544 }
00545 memcpy(data_ret,table->tb_regInfo, bytes_used);
00546 *data_size = bytes_used;
00547 *data = data_ret;
00548 return XLATE_TB_STATUS_NO_ERROR;
00549 }
00550
00551
00552 static int
00553 _xlate_do_current_block(xlate_table_pro table,
00554 char** data,
00555 Elf64_Xword * data_size)
00556 {
00557 char *data_ret;
00558 Block_s *curblock = table->tb_blockRet;
00559 Uword bytes_initialized = curblock->bk_next_data_to_use;
00560
00561 table->tb_blockRet = curblock->bk_next;
00562
00563 if(data == 0) {
00564 *data_size = TB_BLOCK_SIZE;
00565 return XLATE_TB_STATUS_NO_ERROR;
00566 }
00567 data_ret = (char *)malloc(TB_BLOCK_SIZE);
00568 if(data_ret == 0) {
00569 return XLATE_TB_STATUS_ALLOC_FAIL;
00570 }
00571 memcpy(data_ret,curblock->bk_data, bytes_initialized);
00572 if(bytes_initialized <TB_BLOCK_SIZE) {
00573 BZERO(data_ret + bytes_initialized,TB_BLOCK_SIZE - bytes_initialized);
00574 }
00575
00576
00577
00578 *data_size = TB_BLOCK_SIZE;
00579 *data = data_ret;
00580 return XLATE_TB_STATUS_NO_ERROR;
00581 }
00582
00583 int xlate_pro_disk_next_block(xlate_table_pro table,
00584 char** data,
00585 Elf64_Xword * data_size)
00586 {
00587 int retstatus = XLATE_TB_STATUS_NO_ERROR;
00588 if(table->tb_magic != PRO_MAGIC_VAL) {
00589 return XLATE_TB_STATUS_INVALID_TABLE;
00590 }
00591 if(table->tb_no_new_entries_allowed == 0) {
00592
00593 return XLATE_TB_STATUS_BLOCK_REQ_SEQ_ERR;
00594 }
00595 if(table->tb_header_set_to_std_or_debug == XLATE_PRO_STANDARD_SETUP) {
00596 if(table->tb_con_table) {
00597
00598 if(table->tb_std_header_returned == 0) {
00599 if(table->tb_is64bit) {
00600 retstatus = do_64bit_merge_header(table,data,data_size);
00601 } else {
00602 retstatus = do_32bit_merge_header(table,data,data_size);
00603 }
00604 table->tb_std_header_returned = 1;
00605 } else if(table->tb_blockRet) {
00606 retstatus = _xlate_do_current_block(table,data,data_size);
00607 } else if(table->tb_reginfoRet == 0) {
00608
00609
00610
00611
00612 retstatus = do_reginfo_merge(table,data,data_size);
00613 table->tb_reginfoRet = 1;
00614 } else {
00615 return XLATE_TB_STATUS_ALREADY_DONE;
00616 }
00617 } else {
00618 if(table->tb_std_header_returned == 0) {
00619 if(table->tb_is64bit) {
00620 retstatus = _xlate_do_simple_64bit_header(table,data,data_size);
00621 } else {
00622 retstatus = _xlate_do_simple_32bit_header(table,data,data_size);
00623 }
00624 table->tb_std_header_returned = 1;
00625 } else if(table->tb_blockRet) {
00626 retstatus = _xlate_do_current_block(table,data,data_size);
00627 } else if(table->tb_reginfoRet == 0 && table->tb_regInfoOffset > 0) {
00628 retstatus = _xlate_do_local_reginfo(table,data,data_size);
00629 table->tb_reginfoRet = 1;
00630 } else {
00631 return XLATE_TB_STATUS_ALREADY_DONE;
00632 }
00633 }
00634 } else if(table->tb_header_set_to_std_or_debug == XLATE_PRO_DEBUG_SETUP){
00635 if(table->tb_std_header_returned == 0) {
00636 if(table->tb_is64bit) {
00637 retstatus = _xlate_do_simple_64bit_header(table,data,data_size);
00638 } else {
00639 retstatus = _xlate_do_simple_32bit_header(table,data,data_size);
00640 }
00641 table->tb_std_header_returned = 1;
00642 } else if(table->tb_blockRet) {
00643 retstatus = _xlate_do_current_block(table,data,data_size);
00644 } else if(table->tb_reginfoRet == 0 && table->tb_regInfoOffset > 0) {
00645 retstatus = _xlate_do_local_reginfo(table,data,data_size);
00646 table->tb_reginfoRet = 1;
00647 } else {
00648 return XLATE_TB_STATUS_ALREADY_DONE;
00649 }
00650 } else {
00651 return XLATE_TB_STATUS_PRO_REQ_INVALID;
00652 }
00653
00654
00655 return retstatus;
00656 }
00657