1/* 2 * altera.c 3 * 4 * altera FPGA driver 5 * 6 * Copyright (C) Altera Corporation 1998-2001 7 * Copyright (C) 2010,2011 NetUP Inc. 8 * Copyright (C) 2010,2011 Igor M. Liplianin <liplianin@netup.ru> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * 19 * GNU General Public License for more details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with this program; if not, write to the Free Software 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 24 */ 25 26#include <asm/unaligned.h> 27#include <linux/ctype.h> 28#include <linux/string.h> 29#include <linux/firmware.h> 30#include <linux/slab.h> 31#include <linux/module.h> 32#include <misc/altera.h> 33#include "altera-exprt.h" 34#include "altera-jtag.h" 35 36static int debug = 1; 37module_param(debug, int, 0644); 38MODULE_PARM_DESC(debug, "enable debugging information"); 39 40MODULE_DESCRIPTION("altera FPGA kernel module"); 41MODULE_AUTHOR("Igor M. Liplianin <liplianin@netup.ru>"); 42MODULE_LICENSE("GPL"); 43 44#define dprintk(args...) \ 45 if (debug) { \ 46 printk(KERN_DEBUG args); \ 47 } 48 49enum altera_fpga_opcode { 50 OP_NOP = 0, 51 OP_DUP, 52 OP_SWP, 53 OP_ADD, 54 OP_SUB, 55 OP_MULT, 56 OP_DIV, 57 OP_MOD, 58 OP_SHL, 59 OP_SHR, 60 OP_NOT, 61 OP_AND, 62 OP_OR, 63 OP_XOR, 64 OP_INV, 65 OP_GT, 66 OP_LT, 67 OP_RET, 68 OP_CMPS, 69 OP_PINT, 70 OP_PRNT, 71 OP_DSS, 72 OP_DSSC, 73 OP_ISS, 74 OP_ISSC, 75 OP_DPR = 0x1c, 76 OP_DPRL, 77 OP_DPO, 78 OP_DPOL, 79 OP_IPR, 80 OP_IPRL, 81 OP_IPO, 82 OP_IPOL, 83 OP_PCHR, 84 OP_EXIT, 85 OP_EQU, 86 OP_POPT, 87 OP_ABS = 0x2c, 88 OP_BCH0, 89 OP_PSH0 = 0x2f, 90 OP_PSHL = 0x40, 91 OP_PSHV, 92 OP_JMP, 93 OP_CALL, 94 OP_NEXT, 95 OP_PSTR, 96 OP_SINT = 0x47, 97 OP_ST, 98 OP_ISTP, 99 OP_DSTP, 100 OP_SWPN, 101 OP_DUPN, 102 OP_POPV, 103 OP_POPE, 104 OP_POPA, 105 OP_JMPZ, 106 OP_DS, 107 OP_IS, 108 OP_DPRA, 109 OP_DPOA, 110 OP_IPRA, 111 OP_IPOA, 112 OP_EXPT, 113 OP_PSHE, 114 OP_PSHA, 115 OP_DYNA, 116 OP_EXPV = 0x5c, 117 OP_COPY = 0x80, 118 OP_REVA, 119 OP_DSC, 120 OP_ISC, 121 OP_WAIT, 122 OP_VS, 123 OP_CMPA = 0xc0, 124 OP_VSC, 125}; 126 127struct altera_procinfo { 128 char *name; 129 u8 attrs; 130 struct altera_procinfo *next; 131}; 132 133/* This function checks if enough parameters are available on the stack. */ 134static int altera_check_stack(int stack_ptr, int count, int *status) 135{ 136 if (stack_ptr < count) { 137 *status = -EOVERFLOW; 138 return 0; 139 } 140 141 return 1; 142} 143 144static void altera_export_int(char *key, s32 value) 145{ 146 dprintk("Export: key = \"%s\", value = %d\n", key, value); 147} 148 149#define HEX_LINE_CHARS 72 150#define HEX_LINE_BITS (HEX_LINE_CHARS * 4) 151 152static void altera_export_bool_array(char *key, u8 *data, s32 count) 153{ 154 char string[HEX_LINE_CHARS + 1]; 155 s32 i, offset; 156 u32 size, line, lines, linebits, value, j, k; 157 158 if (count > HEX_LINE_BITS) { 159 dprintk("Export: key = \"%s\", %d bits, value = HEX\n", 160 key, count); 161 lines = (count + (HEX_LINE_BITS - 1)) / HEX_LINE_BITS; 162 163 for (line = 0; line < lines; ++line) { 164 if (line < (lines - 1)) { 165 linebits = HEX_LINE_BITS; 166 size = HEX_LINE_CHARS; 167 offset = count - ((line + 1) * HEX_LINE_BITS); 168 } else { 169 linebits = 170 count - ((lines - 1) * HEX_LINE_BITS); 171 size = (linebits + 3) / 4; 172 offset = 0L; 173 } 174 175 string[size] = '\0'; 176 j = size - 1; 177 value = 0; 178 179 for (k = 0; k < linebits; ++k) { 180 i = k + offset; 181 if (data[i >> 3] & (1 << (i & 7))) 182 value |= (1 << (i & 3)); 183 if ((i & 3) == 3) { 184 sprintf(&string[j], "%1x", value); 185 value = 0; 186 --j; 187 } 188 } 189 if ((k & 3) > 0) 190 sprintf(&string[j], "%1x", value); 191 192 dprintk("%s\n", string); 193 } 194 195 } else { 196 size = (count + 3) / 4; 197 string[size] = '\0'; 198 j = size - 1; 199 value = 0; 200 201 for (i = 0; i < count; ++i) { 202 if (data[i >> 3] & (1 << (i & 7))) 203 value |= (1 << (i & 3)); 204 if ((i & 3) == 3) { 205 sprintf(&string[j], "%1x", value); 206 value = 0; 207 --j; 208 } 209 } 210 if ((i & 3) > 0) 211 sprintf(&string[j], "%1x", value); 212 213 dprintk("Export: key = \"%s\", %d bits, value = HEX %s\n", 214 key, count, string); 215 } 216} 217 218static int altera_execute(struct altera_state *astate, 219 u8 *p, 220 s32 program_size, 221 s32 *error_address, 222 int *exit_code, 223 int *format_version) 224{ 225 struct altera_config *aconf = astate->config; 226 char *msg_buff = astate->msg_buff; 227 long *stack = astate->stack; 228 int status = 0; 229 u32 first_word = 0L; 230 u32 action_table = 0L; 231 u32 proc_table = 0L; 232 u32 str_table = 0L; 233 u32 sym_table = 0L; 234 u32 data_sect = 0L; 235 u32 code_sect = 0L; 236 u32 debug_sect = 0L; 237 u32 action_count = 0L; 238 u32 proc_count = 0L; 239 u32 sym_count = 0L; 240 long *vars = NULL; 241 s32 *var_size = NULL; 242 char *attrs = NULL; 243 u8 *proc_attributes = NULL; 244 u32 pc; 245 u32 opcode_address; 246 u32 args[3]; 247 u32 opcode; 248 u32 name_id; 249 u8 charbuf[4]; 250 long long_tmp; 251 u32 variable_id; 252 u8 *charptr_tmp; 253 u8 *charptr_tmp2; 254 long *longptr_tmp; 255 int version = 0; 256 int delta = 0; 257 int stack_ptr = 0; 258 u32 arg_count; 259 int done = 0; 260 int bad_opcode = 0; 261 u32 count; 262 u32 index; 263 u32 index2; 264 s32 long_count; 265 s32 long_idx; 266 s32 long_idx2; 267 u32 i; 268 u32 j; 269 u32 uncomp_size; 270 u32 offset; 271 u32 value; 272 int current_proc = 0; 273 int reverse; 274 275 char *name; 276 277 dprintk("%s\n", __func__); 278 279 /* Read header information */ 280 if (program_size > 52L) { 281 first_word = get_unaligned_be32(&p[0]); 282 version = (first_word & 1L); 283 *format_version = version + 1; 284 delta = version * 8; 285 286 action_table = get_unaligned_be32(&p[4]); 287 proc_table = get_unaligned_be32(&p[8]); 288 str_table = get_unaligned_be32(&p[4 + delta]); 289 sym_table = get_unaligned_be32(&p[16 + delta]); 290 data_sect = get_unaligned_be32(&p[20 + delta]); 291 code_sect = get_unaligned_be32(&p[24 + delta]); 292 debug_sect = get_unaligned_be32(&p[28 + delta]); 293 action_count = get_unaligned_be32(&p[40 + delta]); 294 proc_count = get_unaligned_be32(&p[44 + delta]); 295 sym_count = get_unaligned_be32(&p[48 + (2 * delta)]); 296 } 297 298 if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) { 299 done = 1; 300 status = -EIO; 301 goto exit_done; 302 } 303 304 if (sym_count <= 0) 305 goto exit_done; 306 307 vars = kzalloc(sym_count * sizeof(long), GFP_KERNEL); 308 309 if (vars == NULL) 310 status = -ENOMEM; 311 312 if (status == 0) { 313 var_size = kzalloc(sym_count * sizeof(s32), GFP_KERNEL); 314 315 if (var_size == NULL) 316 status = -ENOMEM; 317 } 318 319 if (status == 0) { 320 attrs = kzalloc(sym_count, GFP_KERNEL); 321 322 if (attrs == NULL) 323 status = -ENOMEM; 324 } 325 326 if ((status == 0) && (version > 0)) { 327 proc_attributes = kzalloc(proc_count, GFP_KERNEL); 328 329 if (proc_attributes == NULL) 330 status = -ENOMEM; 331 } 332 333 if (status != 0) 334 goto exit_done; 335 336 delta = version * 2; 337 338 for (i = 0; i < sym_count; ++i) { 339 offset = (sym_table + ((11 + delta) * i)); 340 341 value = get_unaligned_be32(&p[offset + 3 + delta]); 342 343 attrs[i] = p[offset]; 344 345 /* 346 * use bit 7 of attribute byte to indicate that 347 * this buffer was dynamically allocated 348 * and should be freed later 349 */ 350 attrs[i] &= 0x7f; 351 352 var_size[i] = get_unaligned_be32(&p[offset + 7 + delta]); 353 354 /* 355 * Attribute bits: 356 * bit 0: 0 = read-only, 1 = read-write 357 * bit 1: 0 = not compressed, 1 = compressed 358 * bit 2: 0 = not initialized, 1 = initialized 359 * bit 3: 0 = scalar, 1 = array 360 * bit 4: 0 = Boolean, 1 = integer 361 * bit 5: 0 = declared variable, 362 * 1 = compiler created temporary variable 363 */ 364 365 if ((attrs[i] & 0x0c) == 0x04) 366 /* initialized scalar variable */ 367 vars[i] = value; 368 else if ((attrs[i] & 0x1e) == 0x0e) { 369 /* initialized compressed Boolean array */ 370 uncomp_size = get_unaligned_le32(&p[data_sect + value]); 371 372 /* allocate a buffer for the uncompressed data */ 373 vars[i] = (long)kzalloc(uncomp_size, GFP_KERNEL); 374 if (vars[i] == 0L) 375 status = -ENOMEM; 376 else { 377 /* set flag so buffer will be freed later */ 378 attrs[i] |= 0x80; 379 380 /* uncompress the data */ 381 if (altera_shrink(&p[data_sect + value], 382 var_size[i], 383 (u8 *)vars[i], 384 uncomp_size, 385 version) != uncomp_size) 386 /* decompression failed */ 387 status = -EIO; 388 else 389 var_size[i] = uncomp_size * 8L; 390 391 } 392 } else if ((attrs[i] & 0x1e) == 0x0c) { 393 /* initialized Boolean array */ 394 vars[i] = value + data_sect + (long)p; 395 } else if ((attrs[i] & 0x1c) == 0x1c) { 396 /* initialized integer array */ 397 vars[i] = value + data_sect; 398 } else if ((attrs[i] & 0x0c) == 0x08) { 399 /* uninitialized array */ 400 401 /* flag attrs so that memory is freed */ 402 attrs[i] |= 0x80; 403 404 if (var_size[i] > 0) { 405 u32 size; 406 407 if (attrs[i] & 0x10) 408 /* integer array */ 409 size = (var_size[i] * sizeof(s32)); 410 else 411 /* Boolean array */ 412 size = ((var_size[i] + 7L) / 8L); 413 414 vars[i] = (long)kzalloc(size, GFP_KERNEL); 415 416 if (vars[i] == 0) { 417 status = -ENOMEM; 418 } else { 419 /* zero out memory */ 420 for (j = 0; j < size; ++j) 421 ((u8 *)(vars[i]))[j] = 0; 422 423 } 424 } else 425 vars[i] = 0; 426 427 } else 428 vars[i] = 0; 429 430 } 431 432exit_done: 433 if (status != 0) 434 done = 1; 435 436 altera_jinit(astate); 437 438 pc = code_sect; 439 msg_buff[0] = '\0'; 440 441 /* 442 * For JBC version 2, we will execute the procedures corresponding to 443 * the selected ACTION 444 */ 445 if (version > 0) { 446 if (aconf->action == NULL) { 447 status = -EINVAL; 448 done = 1; 449 } else { 450 int action_found = 0; 451 for (i = 0; (i < action_count) && !action_found; ++i) { 452 name_id = get_unaligned_be32(&p[action_table + 453 (12 * i)]); 454 455 name = &p[str_table + name_id]; 456 457 if (strncasecmp(aconf->action, name, strlen(name)) == 0) { 458 action_found = 1; 459 current_proc = 460 get_unaligned_be32(&p[action_table + 461 (12 * i) + 8]); 462 } 463 } 464 465 if (!action_found) { 466 status = -EINVAL; 467 done = 1; 468 } 469 } 470 471 if (status == 0) { 472 int first_time = 1; 473 i = current_proc; 474 while ((i != 0) || first_time) { 475 first_time = 0; 476 /* check procedure attribute byte */ 477 proc_attributes[i] = 478 (p[proc_table + 479 (13 * i) + 8] & 480 0x03); 481 482 /* 483 * BIT0 - OPTIONAL 484 * BIT1 - RECOMMENDED 485 * BIT6 - FORCED OFF 486 * BIT7 - FORCED ON 487 */ 488 489 i = get_unaligned_be32(&p[proc_table + 490 (13 * i) + 4]); 491 } 492 493 /* 494 * Set current_proc to the first procedure 495 * to be executed 496 */ 497 i = current_proc; 498 while ((i != 0) && 499 ((proc_attributes[i] == 1) || 500 ((proc_attributes[i] & 0xc0) == 0x40))) { 501 i = get_unaligned_be32(&p[proc_table + 502 (13 * i) + 4]); 503 } 504 505 if ((i != 0) || ((i == 0) && (current_proc == 0) && 506 ((proc_attributes[0] != 1) && 507 ((proc_attributes[0] & 0xc0) != 0x40)))) { 508 current_proc = i; 509 pc = code_sect + 510 get_unaligned_be32(&p[proc_table + 511 (13 * i) + 9]); 512 if ((pc < code_sect) || (pc >= debug_sect)) 513 status = -ERANGE; 514 } else 515 /* there are no procedures to execute! */ 516 done = 1; 517 518 } 519 } 520 521 msg_buff[0] = '\0'; 522 523 while (!done) { 524 opcode = (p[pc] & 0xff); 525 opcode_address = pc; 526 ++pc; 527 528 if (debug > 1) 529 printk("opcode: %02x\n", opcode); 530 531 arg_count = (opcode >> 6) & 3; 532 for (i = 0; i < arg_count; ++i) { 533 args[i] = get_unaligned_be32(&p[pc]); 534 pc += 4; 535 } 536 537 switch (opcode) { 538 case OP_NOP: 539 break; 540 case OP_DUP: 541 if (altera_check_stack(stack_ptr, 1, &status)) { 542 stack[stack_ptr] = stack[stack_ptr - 1]; 543 ++stack_ptr; 544 } 545 break; 546 case OP_SWP: 547 if (altera_check_stack(stack_ptr, 2, &status)) { 548 long_tmp = stack[stack_ptr - 2]; 549 stack[stack_ptr - 2] = stack[stack_ptr - 1]; 550 stack[stack_ptr - 1] = long_tmp; 551 } 552 break; 553 case OP_ADD: 554 if (altera_check_stack(stack_ptr, 2, &status)) { 555 --stack_ptr; 556 stack[stack_ptr - 1] += stack[stack_ptr]; 557 } 558 break; 559 case OP_SUB: 560 if (altera_check_stack(stack_ptr, 2, &status)) { 561 --stack_ptr; 562 stack[stack_ptr - 1] -= stack[stack_ptr]; 563 } 564 break; 565 case OP_MULT: 566 if (altera_check_stack(stack_ptr, 2, &status)) { 567 --stack_ptr; 568 stack[stack_ptr - 1] *= stack[stack_ptr]; 569 } 570 break; 571 case OP_DIV: 572 if (altera_check_stack(stack_ptr, 2, &status)) { 573 --stack_ptr; 574 stack[stack_ptr - 1] /= stack[stack_ptr]; 575 } 576 break; 577 case OP_MOD: 578 if (altera_check_stack(stack_ptr, 2, &status)) { 579 --stack_ptr; 580 stack[stack_ptr - 1] %= stack[stack_ptr]; 581 } 582 break; 583 case OP_SHL: 584 if (altera_check_stack(stack_ptr, 2, &status)) { 585 --stack_ptr; 586 stack[stack_ptr - 1] <<= stack[stack_ptr]; 587 } 588 break; 589 case OP_SHR: 590 if (altera_check_stack(stack_ptr, 2, &status)) { 591 --stack_ptr; 592 stack[stack_ptr - 1] >>= stack[stack_ptr]; 593 } 594 break; 595 case OP_NOT: 596 if (altera_check_stack(stack_ptr, 1, &status)) 597 stack[stack_ptr - 1] ^= (-1L); 598 599 break; 600 case OP_AND: 601 if (altera_check_stack(stack_ptr, 2, &status)) { 602 --stack_ptr; 603 stack[stack_ptr - 1] &= stack[stack_ptr]; 604 } 605 break; 606 case OP_OR: 607 if (altera_check_stack(stack_ptr, 2, &status)) { 608 --stack_ptr; 609 stack[stack_ptr - 1] |= stack[stack_ptr]; 610 } 611 break; 612 case OP_XOR: 613 if (altera_check_stack(stack_ptr, 2, &status)) { 614 --stack_ptr; 615 stack[stack_ptr - 1] ^= stack[stack_ptr]; 616 } 617 break; 618 case OP_INV: 619 if (!altera_check_stack(stack_ptr, 1, &status)) 620 break; 621 stack[stack_ptr - 1] = stack[stack_ptr - 1] ? 0L : 1L; 622 break; 623 case OP_GT: 624 if (!altera_check_stack(stack_ptr, 2, &status)) 625 break; 626 --stack_ptr; 627 stack[stack_ptr - 1] = 628 (stack[stack_ptr - 1] > stack[stack_ptr]) ? 629 1L : 0L; 630 631 break; 632 case OP_LT: 633 if (!altera_check_stack(stack_ptr, 2, &status)) 634 break; 635 --stack_ptr; 636 stack[stack_ptr - 1] = 637 (stack[stack_ptr - 1] < stack[stack_ptr]) ? 638 1L : 0L; 639 640 break; 641 case OP_RET: 642 if ((version > 0) && (stack_ptr == 0)) { 643 /* 644 * We completed one of the main procedures 645 * of an ACTION. 646 * Find the next procedure 647 * to be executed and jump to it. 648 * If there are no more procedures, then EXIT. 649 */ 650 i = get_unaligned_be32(&p[proc_table + 651 (13 * current_proc) + 4]); 652 while ((i != 0) && 653 ((proc_attributes[i] == 1) || 654 ((proc_attributes[i] & 0xc0) == 0x40))) 655 i = get_unaligned_be32(&p[proc_table + 656 (13 * i) + 4]); 657 658 if (i == 0) { 659 /* no procedures to execute! */ 660 done = 1; 661 *exit_code = 0; /* success */ 662 } else { 663 current_proc = i; 664 pc = code_sect + get_unaligned_be32( 665 &p[proc_table + 666 (13 * i) + 9]); 667 if ((pc < code_sect) || 668 (pc >= debug_sect)) 669 status = -ERANGE; 670 } 671 672 } else 673 if (altera_check_stack(stack_ptr, 1, &status)) { 674 pc = stack[--stack_ptr] + code_sect; 675 if ((pc <= code_sect) || 676 (pc >= debug_sect)) 677 status = -ERANGE; 678 679 } 680 681 break; 682 case OP_CMPS: 683 /* 684 * Array short compare 685 * ...stack 0 is source 1 value 686 * ...stack 1 is source 2 value 687 * ...stack 2 is mask value 688 * ...stack 3 is count 689 */ 690 if (altera_check_stack(stack_ptr, 4, &status)) { 691 s32 a = stack[--stack_ptr]; 692 s32 b = stack[--stack_ptr]; 693 long_tmp = stack[--stack_ptr]; 694 count = stack[stack_ptr - 1]; 695 696 if ((count < 1) || (count > 32)) 697 status = -ERANGE; 698 else { 699 long_tmp &= ((-1L) >> (32 - count)); 700 701 stack[stack_ptr - 1] = 702 ((a & long_tmp) == (b & long_tmp)) 703 ? 1L : 0L; 704 } 705 } 706 break; 707 case OP_PINT: 708 /* 709 * PRINT add integer 710 * ...stack 0 is integer value 711 */ 712 if (!altera_check_stack(stack_ptr, 1, &status)) 713 break; 714 sprintf(&msg_buff[strlen(msg_buff)], 715 "%ld", stack[--stack_ptr]); 716 break; 717 case OP_PRNT: 718 /* PRINT finish */ 719 if (debug) 720 printk(msg_buff, "\n"); 721 722 msg_buff[0] = '\0'; 723 break; 724 case OP_DSS: 725 /* 726 * DRSCAN short 727 * ...stack 0 is scan data 728 * ...stack 1 is count 729 */ 730 if (!altera_check_stack(stack_ptr, 2, &status)) 731 break; 732 long_tmp = stack[--stack_ptr]; 733 count = stack[--stack_ptr]; 734 put_unaligned_le32(long_tmp, &charbuf[0]); 735 status = altera_drscan(astate, count, charbuf, 0); 736 break; 737 case OP_DSSC: 738 /* 739 * DRSCAN short with capture 740 * ...stack 0 is scan data 741 * ...stack 1 is count 742 */ 743 if (!altera_check_stack(stack_ptr, 2, &status)) 744 break; 745 long_tmp = stack[--stack_ptr]; 746 count = stack[stack_ptr - 1]; 747 put_unaligned_le32(long_tmp, &charbuf[0]); 748 status = altera_swap_dr(astate, count, charbuf, 749 0, charbuf, 0); 750 stack[stack_ptr - 1] = get_unaligned_le32(&charbuf[0]); 751 break; 752 case OP_ISS: 753 /* 754 * IRSCAN short 755 * ...stack 0 is scan data 756 * ...stack 1 is count 757 */ 758 if (!altera_check_stack(stack_ptr, 2, &status)) 759 break; 760 long_tmp = stack[--stack_ptr]; 761 count = stack[--stack_ptr]; 762 put_unaligned_le32(long_tmp, &charbuf[0]); 763 status = altera_irscan(astate, count, charbuf, 0); 764 break; 765 case OP_ISSC: 766 /* 767 * IRSCAN short with capture 768 * ...stack 0 is scan data 769 * ...stack 1 is count 770 */ 771 if (!altera_check_stack(stack_ptr, 2, &status)) 772 break; 773 long_tmp = stack[--stack_ptr]; 774 count = stack[stack_ptr - 1]; 775 put_unaligned_le32(long_tmp, &charbuf[0]); 776 status = altera_swap_ir(astate, count, charbuf, 777 0, charbuf, 0); 778 stack[stack_ptr - 1] = get_unaligned_le32(&charbuf[0]); 779 break; 780 case OP_DPR: 781 if (!altera_check_stack(stack_ptr, 1, &status)) 782 break; 783 count = stack[--stack_ptr]; 784 status = altera_set_dr_pre(&astate->js, count, 0, NULL); 785 break; 786 case OP_DPRL: 787 /* 788 * DRPRE with literal data 789 * ...stack 0 is count 790 * ...stack 1 is literal data 791 */ 792 if (!altera_check_stack(stack_ptr, 2, &status)) 793 break; 794 count = stack[--stack_ptr]; 795 long_tmp = stack[--stack_ptr]; 796 put_unaligned_le32(long_tmp, &charbuf[0]); 797 status = altera_set_dr_pre(&astate->js, count, 0, 798 charbuf); 799 break; 800 case OP_DPO: 801 /* 802 * DRPOST 803 * ...stack 0 is count 804 */ 805 if (altera_check_stack(stack_ptr, 1, &status)) { 806 count = stack[--stack_ptr]; 807 status = altera_set_dr_post(&astate->js, count, 808 0, NULL); 809 } 810 break; 811 case OP_DPOL: 812 /* 813 * DRPOST with literal data 814 * ...stack 0 is count 815 * ...stack 1 is literal data 816 */ 817 if (!altera_check_stack(stack_ptr, 2, &status)) 818 break; 819 count = stack[--stack_ptr]; 820 long_tmp = stack[--stack_ptr]; 821 put_unaligned_le32(long_tmp, &charbuf[0]); 822 status = altera_set_dr_post(&astate->js, count, 0, 823 charbuf); 824 break; 825 case OP_IPR: 826 if (altera_check_stack(stack_ptr, 1, &status)) { 827 count = stack[--stack_ptr]; 828 status = altera_set_ir_pre(&astate->js, count, 829 0, NULL); 830 } 831 break; 832 case OP_IPRL: 833 /* 834 * IRPRE with literal data 835 * ...stack 0 is count 836 * ...stack 1 is literal data 837 */ 838 if (altera_check_stack(stack_ptr, 2, &status)) { 839 count = stack[--stack_ptr]; 840 long_tmp = stack[--stack_ptr]; 841 put_unaligned_le32(long_tmp, &charbuf[0]); 842 status = altera_set_ir_pre(&astate->js, count, 843 0, charbuf); 844 } 845 break; 846 case OP_IPO: 847 /* 848 * IRPOST 849 * ...stack 0 is count 850 */ 851 if (altera_check_stack(stack_ptr, 1, &status)) { 852 count = stack[--stack_ptr]; 853 status = altera_set_ir_post(&astate->js, count, 854 0, NULL); 855 } 856 break; 857 case OP_IPOL: 858 /* 859 * IRPOST with literal data 860 * ...stack 0 is count 861 * ...stack 1 is literal data 862 */ 863 if (!altera_check_stack(stack_ptr, 2, &status)) 864 break; 865 count = stack[--stack_ptr]; 866 long_tmp = stack[--stack_ptr]; 867 put_unaligned_le32(long_tmp, &charbuf[0]); 868 status = altera_set_ir_post(&astate->js, count, 0, 869 charbuf); 870 break; 871 case OP_PCHR: 872 if (altera_check_stack(stack_ptr, 1, &status)) { 873 u8 ch; 874 count = strlen(msg_buff); 875 ch = (char) stack[--stack_ptr]; 876 if ((ch < 1) || (ch > 127)) { 877 /* 878 * character code out of range 879 * instead of flagging an error, 880 * force the value to 127 881 */ 882 ch = 127; 883 } 884 msg_buff[count] = ch; 885 msg_buff[count + 1] = '\0'; 886 } 887 break; 888 case OP_EXIT: 889 if (altera_check_stack(stack_ptr, 1, &status)) 890 *exit_code = stack[--stack_ptr]; 891 892 done = 1; 893 break; 894 case OP_EQU: 895 if (!altera_check_stack(stack_ptr, 2, &status)) 896 break; 897 --stack_ptr; 898 stack[stack_ptr - 1] = 899 (stack[stack_ptr - 1] == stack[stack_ptr]) ? 900 1L : 0L; 901 break; 902 case OP_POPT: 903 if (altera_check_stack(stack_ptr, 1, &status)) 904 --stack_ptr; 905 906 break; 907 case OP_ABS: 908 if (!altera_check_stack(stack_ptr, 1, &status)) 909 break; 910 if (stack[stack_ptr - 1] < 0) 911 stack[stack_ptr - 1] = 0 - stack[stack_ptr - 1]; 912 913 break; 914 case OP_BCH0: 915 /* 916 * Batch operation 0 917 * SWP 918 * SWPN 7 919 * SWP 920 * SWPN 6 921 * DUPN 8 922 * SWPN 2 923 * SWP 924 * DUPN 6 925 * DUPN 6 926 */ 927 928 /* SWP */ 929 if (altera_check_stack(stack_ptr, 2, &status)) { 930 long_tmp = stack[stack_ptr - 2]; 931 stack[stack_ptr - 2] = stack[stack_ptr - 1]; 932 stack[stack_ptr - 1] = long_tmp; 933 } 934 935 /* SWPN 7 */ 936 index = 7 + 1; 937 if (altera_check_stack(stack_ptr, index, &status)) { 938 long_tmp = stack[stack_ptr - index]; 939 stack[stack_ptr - index] = stack[stack_ptr - 1]; 940 stack[stack_ptr - 1] = long_tmp; 941 } 942 943 /* SWP */ 944 if (altera_check_stack(stack_ptr, 2, &status)) { 945 long_tmp = stack[stack_ptr - 2]; 946 stack[stack_ptr - 2] = stack[stack_ptr - 1]; 947 stack[stack_ptr - 1] = long_tmp; 948 } 949 950 /* SWPN 6 */ 951 index = 6 + 1; 952 if (altera_check_stack(stack_ptr, index, &status)) { 953 long_tmp = stack[stack_ptr - index]; 954 stack[stack_ptr - index] = stack[stack_ptr - 1]; 955 stack[stack_ptr - 1] = long_tmp; 956 } 957 958 /* DUPN 8 */ 959 index = 8 + 1; 960 if (altera_check_stack(stack_ptr, index, &status)) { 961 stack[stack_ptr] = stack[stack_ptr - index]; 962 ++stack_ptr; 963 } 964 965 /* SWPN 2 */ 966 index = 2 + 1; 967 if (altera_check_stack(stack_ptr, index, &status)) { 968 long_tmp = stack[stack_ptr - index]; 969 stack[stack_ptr - index] = stack[stack_ptr - 1]; 970 stack[stack_ptr - 1] = long_tmp; 971 } 972 973 /* SWP */ 974 if (altera_check_stack(stack_ptr, 2, &status)) { 975 long_tmp = stack[stack_ptr - 2]; 976 stack[stack_ptr - 2] = stack[stack_ptr - 1]; 977 stack[stack_ptr - 1] = long_tmp; 978 } 979 980 /* DUPN 6 */ 981 index = 6 + 1; 982 if (altera_check_stack(stack_ptr, index, &status)) { 983 stack[stack_ptr] = stack[stack_ptr - index]; 984 ++stack_ptr; 985 } 986 987 /* DUPN 6 */ 988 index = 6 + 1; 989 if (altera_check_stack(stack_ptr, index, &status)) { 990 stack[stack_ptr] = stack[stack_ptr - index]; 991 ++stack_ptr; 992 } 993 break; 994 case OP_PSH0: 995 stack[stack_ptr++] = 0; 996 break; 997 case OP_PSHL: 998 stack[stack_ptr++] = (s32) args[0]; 999 break; 1000 case OP_PSHV: 1001 stack[stack_ptr++] = vars[args[0]]; 1002 break; 1003 case OP_JMP: 1004 pc = args[0] + code_sect; 1005 if ((pc < code_sect) || (pc >= debug_sect)) 1006 status = -ERANGE; 1007 break; 1008 case OP_CALL: 1009 stack[stack_ptr++] = pc; 1010 pc = args[0] + code_sect; 1011 if ((pc < code_sect) || (pc >= debug_sect)) 1012 status = -ERANGE; 1013 break; 1014 case OP_NEXT: 1015 /* 1016 * Process FOR / NEXT loop 1017 * ...argument 0 is variable ID 1018 * ...stack 0 is step value 1019 * ...stack 1 is end value 1020 * ...stack 2 is top address 1021 */ 1022 if (altera_check_stack(stack_ptr, 3, &status)) { 1023 s32 step = stack[stack_ptr - 1]; 1024 s32 end = stack[stack_ptr - 2]; 1025 s32 top = stack[stack_ptr - 3]; 1026 s32 iterator = vars[args[0]]; 1027 int break_out = 0; 1028 1029 if (step < 0) { 1030 if (iterator <= end) 1031 break_out = 1; 1032 } else if (iterator >= end) 1033 break_out = 1; 1034 1035 if (break_out) { 1036 stack_ptr -= 3; 1037 } else { 1038 vars[args[0]] = iterator + step; 1039 pc = top + code_sect; 1040 if ((pc < code_sect) || 1041 (pc >= debug_sect)) 1042 status = -ERANGE; 1043 } 1044 } 1045 break; 1046 case OP_PSTR: 1047 /* 1048 * PRINT add string 1049 * ...argument 0 is string ID 1050 */ 1051 count = strlen(msg_buff); 1052 strlcpy(&msg_buff[count], 1053 &p[str_table + args[0]], 1054 ALTERA_MESSAGE_LENGTH - count); 1055 break; 1056 case OP_SINT: 1057 /* 1058 * STATE intermediate state 1059 * ...argument 0 is state code 1060 */ 1061 status = altera_goto_jstate(astate, args[0]); 1062 break; 1063 case OP_ST: 1064 /* 1065 * STATE final state 1066 * ...argument 0 is state code 1067 */ 1068 status = altera_goto_jstate(astate, args[0]); 1069 break; 1070 case OP_ISTP: 1071 /* 1072 * IRSTOP state 1073 * ...argument 0 is state code 1074 */ 1075 status = altera_set_irstop(&astate->js, args[0]); 1076 break; 1077 case OP_DSTP: 1078 /* 1079 * DRSTOP state 1080 * ...argument 0 is state code 1081 */ 1082 status = altera_set_drstop(&astate->js, args[0]); 1083 break; 1084 1085 case OP_SWPN: 1086 /* 1087 * Exchange top with Nth stack value 1088 * ...argument 0 is 0-based stack entry 1089 * to swap with top element 1090 */ 1091 index = (args[0]) + 1; 1092 if (altera_check_stack(stack_ptr, index, &status)) { 1093 long_tmp = stack[stack_ptr - index]; 1094 stack[stack_ptr - index] = stack[stack_ptr - 1]; 1095 stack[stack_ptr - 1] = long_tmp; 1096 } 1097 break; 1098 case OP_DUPN: 1099 /* 1100 * Duplicate Nth stack value 1101 * ...argument 0 is 0-based stack entry to duplicate 1102 */ 1103 index = (args[0]) + 1; 1104 if (altera_check_stack(stack_ptr, index, &status)) { 1105 stack[stack_ptr] = stack[stack_ptr - index]; 1106 ++stack_ptr; 1107 } 1108 break; 1109 case OP_POPV: 1110 /* 1111 * Pop stack into scalar variable 1112 * ...argument 0 is variable ID 1113 * ...stack 0 is value 1114 */ 1115 if (altera_check_stack(stack_ptr, 1, &status)) 1116 vars[args[0]] = stack[--stack_ptr]; 1117 1118 break; 1119 case OP_POPE: 1120 /* 1121 * Pop stack into integer array element 1122 * ...argument 0 is variable ID 1123 * ...stack 0 is array index 1124 * ...stack 1 is value 1125 */ 1126 if (!altera_check_stack(stack_ptr, 2, &status)) 1127 break; 1128 variable_id = args[0]; 1129 1130 /* 1131 * If variable is read-only, 1132 * convert to writable array 1133 */ 1134 if ((version > 0) && 1135 ((attrs[variable_id] & 0x9c) == 0x1c)) { 1136 /* Allocate a writable buffer for this array */ 1137 count = var_size[variable_id]; 1138 long_tmp = vars[variable_id]; 1139 longptr_tmp = kzalloc(count * sizeof(long), 1140 GFP_KERNEL); 1141 vars[variable_id] = (long)longptr_tmp; 1142 1143 if (vars[variable_id] == 0) { 1144 status = -ENOMEM; 1145 break; 1146 } 1147 1148 /* copy previous contents into buffer */ 1149 for (i = 0; i < count; ++i) { 1150 longptr_tmp[i] = 1151 get_unaligned_be32(&p[long_tmp]); 1152 long_tmp += sizeof(long); 1153 } 1154 1155 /* 1156 * set bit 7 - buffer was 1157 * dynamically allocated 1158 */ 1159 attrs[variable_id] |= 0x80; 1160 1161 /* clear bit 2 - variable is writable */ 1162 attrs[variable_id] &= ~0x04; 1163 attrs[variable_id] |= 0x01; 1164 1165 } 1166 1167 /* check that variable is a writable integer array */ 1168 if ((attrs[variable_id] & 0x1c) != 0x18) 1169 status = -ERANGE; 1170 else { 1171 longptr_tmp = (long *)vars[variable_id]; 1172 1173 /* pop the array index */ 1174 index = stack[--stack_ptr]; 1175 1176 /* pop the value and store it into the array */ 1177 longptr_tmp[index] = stack[--stack_ptr]; 1178 } 1179 1180 break; 1181 case OP_POPA: 1182 /* 1183 * Pop stack into Boolean array 1184 * ...argument 0 is variable ID 1185 * ...stack 0 is count 1186 * ...stack 1 is array index 1187 * ...stack 2 is value 1188 */ 1189 if (!altera_check_stack(stack_ptr, 3, &status)) 1190 break; 1191 variable_id = args[0]; 1192 1193 /* 1194 * If variable is read-only, 1195 * convert to writable array 1196 */ 1197 if ((version > 0) && 1198 ((attrs[variable_id] & 0x9c) == 0x0c)) { 1199 /* Allocate a writable buffer for this array */ 1200 long_tmp = 1201 (var_size[variable_id] + 7L) >> 3L; 1202 charptr_tmp2 = (u8 *)vars[variable_id]; 1203 charptr_tmp = 1204 kzalloc(long_tmp, GFP_KERNEL); 1205 vars[variable_id] = (long)charptr_tmp; 1206 1207 if (vars[variable_id] == 0) { 1208 status = -ENOMEM; 1209 break; 1210 } 1211 1212 /* zero the buffer */ 1213 for (long_idx = 0L; 1214 long_idx < long_tmp; 1215 ++long_idx) { 1216 charptr_tmp[long_idx] = 0; 1217 } 1218 1219 /* copy previous contents into buffer */ 1220 for (long_idx = 0L; 1221 long_idx < var_size[variable_id]; 1222 ++long_idx) { 1223 long_idx2 = long_idx; 1224 1225 if (charptr_tmp2[long_idx2 >> 3] & 1226 (1 << (long_idx2 & 7))) { 1227 charptr_tmp[long_idx >> 3] |= 1228 (1 << (long_idx & 7)); 1229 } 1230 } 1231 1232 /* 1233 * set bit 7 - buffer was 1234 * dynamically allocated 1235 */ 1236 attrs[variable_id] |= 0x80; 1237 1238 /* clear bit 2 - variable is writable */ 1239 attrs[variable_id] &= ~0x04; 1240 attrs[variable_id] |= 0x01; 1241 1242 } 1243 1244 /* 1245 * check that variable is 1246 * a writable Boolean array 1247 */ 1248 if ((attrs[variable_id] & 0x1c) != 0x08) { 1249 status = -ERANGE; 1250 break; 1251 } 1252 1253 charptr_tmp = (u8 *)vars[variable_id]; 1254 1255 /* pop the count (number of bits to copy) */ 1256 long_count = stack[--stack_ptr]; 1257 1258 /* pop the array index */ 1259 long_idx = stack[--stack_ptr]; 1260 1261 reverse = 0; 1262 1263 if (version > 0) { 1264 /* 1265 * stack 0 = array right index 1266 * stack 1 = array left index 1267 */ 1268 1269 if (long_idx > long_count) { 1270 reverse = 1; 1271 long_tmp = long_count; 1272 long_count = 1 + long_idx - 1273 long_count; 1274 long_idx = long_tmp; 1275 1276 /* reverse POPA is not supported */ 1277 status = -ERANGE; 1278 break; 1279 } else 1280 long_count = 1 + long_count - 1281 long_idx; 1282 1283 } 1284 1285 /* pop the data */ 1286 long_tmp = stack[--stack_ptr]; 1287 1288 if (long_count < 1) { 1289 status = -ERANGE; 1290 break; 1291 } 1292 1293 for (i = 0; i < long_count; ++i) { 1294 if (long_tmp & (1L << (s32) i)) 1295 charptr_tmp[long_idx >> 3L] |= 1296 (1L << (long_idx & 7L)); 1297 else 1298 charptr_tmp[long_idx >> 3L] &= 1299 ~(1L << (long_idx & 7L)); 1300 1301 ++long_idx; 1302 } 1303 1304 break; 1305 case OP_JMPZ: 1306 /* 1307 * Pop stack and branch if zero 1308 * ...argument 0 is address 1309 * ...stack 0 is condition value 1310 */ 1311 if (altera_check_stack(stack_ptr, 1, &status)) { 1312 if (stack[--stack_ptr] == 0) { 1313 pc = args[0] + code_sect; 1314 if ((pc < code_sect) || 1315 (pc >= debug_sect)) 1316 status = -ERANGE; 1317 } 1318 } 1319 break; 1320 case OP_DS: 1321 case OP_IS: 1322 /* 1323 * DRSCAN 1324 * IRSCAN 1325 * ...argument 0 is scan data variable ID 1326 * ...stack 0 is array index 1327 * ...stack 1 is count 1328 */ 1329 if (!altera_check_stack(stack_ptr, 2, &status)) 1330 break; 1331 long_idx = stack[--stack_ptr]; 1332 long_count = stack[--stack_ptr]; 1333 reverse = 0; 1334 if (version > 0) { 1335 /* 1336 * stack 0 = array right index 1337 * stack 1 = array left index 1338 * stack 2 = count 1339 */ 1340 long_tmp = long_count; 1341 long_count = stack[--stack_ptr]; 1342 1343 if (long_idx > long_tmp) { 1344 reverse = 1; 1345 long_idx = long_tmp; 1346 } 1347 } 1348 1349 charptr_tmp = (u8 *)vars[args[0]]; 1350 1351 if (reverse) { 1352 /* 1353 * allocate a buffer 1354 * and reverse the data order 1355 */ 1356 charptr_tmp2 = charptr_tmp; 1357 charptr_tmp = kzalloc((long_count >> 3) + 1, 1358 GFP_KERNEL); 1359 if (charptr_tmp == NULL) { 1360 status = -ENOMEM; 1361 break; 1362 } 1363 1364 long_tmp = long_idx + long_count - 1; 1365 long_idx2 = 0; 1366 while (long_idx2 < long_count) { 1367 if (charptr_tmp2[long_tmp >> 3] & 1368 (1 << (long_tmp & 7))) 1369 charptr_tmp[long_idx2 >> 3] |= 1370 (1 << (long_idx2 & 7)); 1371 else 1372 charptr_tmp[long_idx2 >> 3] &= 1373 ~(1 << (long_idx2 & 7)); 1374 1375 --long_tmp; 1376 ++long_idx2; 1377 } 1378 } 1379 1380 if (opcode == 0x51) /* DS */ 1381 status = altera_drscan(astate, long_count, 1382 charptr_tmp, long_idx); 1383 else /* IS */ 1384 status = altera_irscan(astate, long_count, 1385 charptr_tmp, long_idx); 1386 1387 if (reverse) 1388 kfree(charptr_tmp); 1389 1390 break; 1391 case OP_DPRA: 1392 /* 1393 * DRPRE with array data 1394 * ...argument 0 is variable ID 1395 * ...stack 0 is array index 1396 * ...stack 1 is count 1397 */ 1398 if (!altera_check_stack(stack_ptr, 2, &status)) 1399 break; 1400 index = stack[--stack_ptr]; 1401 count = stack[--stack_ptr]; 1402 1403 if (version > 0) 1404 /* 1405 * stack 0 = array right index 1406 * stack 1 = array left index 1407 */ 1408 count = 1 + count - index; 1409 1410 charptr_tmp = (u8 *)vars[args[0]]; 1411 status = altera_set_dr_pre(&astate->js, count, index, 1412 charptr_tmp); 1413 break; 1414 case OP_DPOA: 1415 /* 1416 * DRPOST with array data 1417 * ...argument 0 is variable ID 1418 * ...stack 0 is array index 1419 * ...stack 1 is count 1420 */ 1421 if (!altera_check_stack(stack_ptr, 2, &status)) 1422 break; 1423 index = stack[--stack_ptr]; 1424 count = stack[--stack_ptr]; 1425 1426 if (version > 0) 1427 /* 1428 * stack 0 = array right index 1429 * stack 1 = array left index 1430 */ 1431 count = 1 + count - index; 1432 1433 charptr_tmp = (u8 *)vars[args[0]]; 1434 status = altera_set_dr_post(&astate->js, count, index, 1435 charptr_tmp); 1436 break; 1437 case OP_IPRA: 1438 /* 1439 * IRPRE with array data 1440 * ...argument 0 is variable ID 1441 * ...stack 0 is array index 1442 * ...stack 1 is count 1443 */ 1444 if (!altera_check_stack(stack_ptr, 2, &status)) 1445 break; 1446 index = stack[--stack_ptr]; 1447 count = stack[--stack_ptr]; 1448 1449 if (version > 0) 1450 /* 1451 * stack 0 = array right index 1452 * stack 1 = array left index 1453 */ 1454 count = 1 + count - index; 1455 1456 charptr_tmp = (u8 *)vars[args[0]]; 1457 status = altera_set_ir_pre(&astate->js, count, index, 1458 charptr_tmp); 1459 1460 break; 1461 case OP_IPOA: 1462 /* 1463 * IRPOST with array data 1464 * ...argument 0 is variable ID 1465 * ...stack 0 is array index 1466 * ...stack 1 is count 1467 */ 1468 if (!altera_check_stack(stack_ptr, 2, &status)) 1469 break; 1470 index = stack[--stack_ptr]; 1471 count = stack[--stack_ptr]; 1472 1473 if (version > 0) 1474 /* 1475 * stack 0 = array right index 1476 * stack 1 = array left index 1477 */ 1478 count = 1 + count - index; 1479 1480 charptr_tmp = (u8 *)vars[args[0]]; 1481 status = altera_set_ir_post(&astate->js, count, index, 1482 charptr_tmp); 1483 1484 break; 1485 case OP_EXPT: 1486 /* 1487 * EXPORT 1488 * ...argument 0 is string ID 1489 * ...stack 0 is integer expression 1490 */ 1491 if (altera_check_stack(stack_ptr, 1, &status)) { 1492 name = &p[str_table + args[0]]; 1493 long_tmp = stack[--stack_ptr]; 1494 altera_export_int(name, long_tmp); 1495 } 1496 break; 1497 case OP_PSHE: 1498 /* 1499 * Push integer array element 1500 * ...argument 0 is variable ID 1501 * ...stack 0 is array index 1502 */ 1503 if (!altera_check_stack(stack_ptr, 1, &status)) 1504 break; 1505 variable_id = args[0]; 1506 index = stack[stack_ptr - 1]; 1507 1508 /* check variable type */ 1509 if ((attrs[variable_id] & 0x1f) == 0x19) { 1510 /* writable integer array */ 1511 longptr_tmp = (long *)vars[variable_id]; 1512 stack[stack_ptr - 1] = longptr_tmp[index]; 1513 } else if ((attrs[variable_id] & 0x1f) == 0x1c) { 1514 /* read-only integer array */ 1515 long_tmp = vars[variable_id] + 1516 (index * sizeof(long)); 1517 stack[stack_ptr - 1] = 1518 get_unaligned_be32(&p[long_tmp]); 1519 } else 1520 status = -ERANGE; 1521 1522 break; 1523 case OP_PSHA: 1524 /* 1525 * Push Boolean array 1526 * ...argument 0 is variable ID 1527 * ...stack 0 is count 1528 * ...stack 1 is array index 1529 */ 1530 if (!altera_check_stack(stack_ptr, 2, &status)) 1531 break; 1532 variable_id = args[0]; 1533 1534 /* check that variable is a Boolean array */ 1535 if ((attrs[variable_id] & 0x18) != 0x08) { 1536 status = -ERANGE; 1537 break; 1538 } 1539 1540 charptr_tmp = (u8 *)vars[variable_id]; 1541 1542 /* pop the count (number of bits to copy) */ 1543 count = stack[--stack_ptr]; 1544 1545 /* pop the array index */ 1546 index = stack[stack_ptr - 1]; 1547 1548 if (version > 0) 1549 /* 1550 * stack 0 = array right index 1551 * stack 1 = array left index 1552 */ 1553 count = 1 + count - index; 1554 1555 if ((count < 1) || (count > 32)) { 1556 status = -ERANGE; 1557 break; 1558 } 1559 1560 long_tmp = 0L; 1561 1562 for (i = 0; i < count; ++i) 1563 if (charptr_tmp[(i + index) >> 3] & 1564 (1 << ((i + index) & 7))) 1565 long_tmp |= (1L << i); 1566 1567 stack[stack_ptr - 1] = long_tmp; 1568 1569 break; 1570 case OP_DYNA: 1571 /* 1572 * Dynamically change size of array 1573 * ...argument 0 is variable ID 1574 * ...stack 0 is new size 1575 */ 1576 if (!altera_check_stack(stack_ptr, 1, &status)) 1577 break; 1578 variable_id = args[0]; 1579 long_tmp = stack[--stack_ptr]; 1580 1581 if (long_tmp > var_size[variable_id]) { 1582 var_size[variable_id] = long_tmp; 1583 1584 if (attrs[variable_id] & 0x10) 1585 /* allocate integer array */ 1586 long_tmp *= sizeof(long); 1587 else 1588 /* allocate Boolean array */ 1589 long_tmp = (long_tmp + 7) >> 3; 1590 1591 /* 1592 * If the buffer was previously allocated, 1593 * free it 1594 */ 1595 if (attrs[variable_id] & 0x80) { 1596 kfree((void *)vars[variable_id]); 1597 vars[variable_id] = 0; 1598 } 1599 1600 /* 1601 * Allocate a new buffer 1602 * of the requested size 1603 */ 1604 vars[variable_id] = (long) 1605 kzalloc(long_tmp, GFP_KERNEL); 1606 1607 if (vars[variable_id] == 0) { 1608 status = -ENOMEM; 1609 break; 1610 } 1611 1612 /* 1613 * Set the attribute bit to indicate that 1614 * this buffer was dynamically allocated and 1615 * should be freed later 1616 */ 1617 attrs[variable_id] |= 0x80; 1618 1619 /* zero out memory */ 1620 count = ((var_size[variable_id] + 7L) / 1621 8L); 1622 charptr_tmp = (u8 *)(vars[variable_id]); 1623 for (index = 0; index < count; ++index) 1624 charptr_tmp[index] = 0; 1625 1626 } 1627 1628 break; 1629 case OP_EXPV: 1630 /* 1631 * Export Boolean array 1632 * ...argument 0 is string ID 1633 * ...stack 0 is variable ID 1634 * ...stack 1 is array right index 1635 * ...stack 2 is array left index 1636 */ 1637 if (!altera_check_stack(stack_ptr, 3, &status)) 1638 break; 1639 if (version == 0) { 1640 /* EXPV is not supported in JBC 1.0 */ 1641 bad_opcode = 1; 1642 break; 1643 } 1644 name = &p[str_table + args[0]]; 1645 variable_id = stack[--stack_ptr]; 1646 long_idx = stack[--stack_ptr];/* right indx */ 1647 long_idx2 = stack[--stack_ptr];/* left indx */ 1648 1649 if (long_idx > long_idx2) { 1650 /* reverse indices not supported */ 1651 status = -ERANGE; 1652 break; 1653 } 1654 1655 long_count = 1 + long_idx2 - long_idx; 1656 1657 charptr_tmp = (u8 *)vars[variable_id]; 1658 charptr_tmp2 = NULL; 1659 1660 if ((long_idx & 7L) != 0) { 1661 s32 k = long_idx; 1662 charptr_tmp2 = 1663 kzalloc(((long_count + 7L) / 8L), 1664 GFP_KERNEL); 1665 if (charptr_tmp2 == NULL) { 1666 status = -ENOMEM; 1667 break; 1668 } 1669 1670 for (i = 0; i < long_count; ++i) { 1671 if (charptr_tmp[k >> 3] & 1672 (1 << (k & 7))) 1673 charptr_tmp2[i >> 3] |= 1674 (1 << (i & 7)); 1675 else 1676 charptr_tmp2[i >> 3] &= 1677 ~(1 << (i & 7)); 1678 1679 ++k; 1680 } 1681 charptr_tmp = charptr_tmp2; 1682 1683 } else if (long_idx != 0) 1684 charptr_tmp = &charptr_tmp[long_idx >> 3]; 1685 1686 altera_export_bool_array(name, charptr_tmp, 1687 long_count); 1688 1689 /* free allocated buffer */ 1690 if ((long_idx & 7L) != 0) 1691 kfree(charptr_tmp2); 1692 1693 break; 1694 case OP_COPY: { 1695 /* 1696 * Array copy 1697 * ...argument 0 is dest ID 1698 * ...argument 1 is source ID 1699 * ...stack 0 is count 1700 * ...stack 1 is dest index 1701 * ...stack 2 is source index 1702 */ 1703 s32 copy_count; 1704 s32 copy_index; 1705 s32 copy_index2; 1706 s32 destleft; 1707 s32 src_count; 1708 s32 dest_count; 1709 int src_reverse = 0; 1710 int dest_reverse = 0; 1711 1712 if (!altera_check_stack(stack_ptr, 3, &status)) 1713 break; 1714 1715 copy_count = stack[--stack_ptr]; 1716 copy_index = stack[--stack_ptr]; 1717 copy_index2 = stack[--stack_ptr]; 1718 reverse = 0; 1719 1720 if (version > 0) { 1721 /* 1722 * stack 0 = source right index 1723 * stack 1 = source left index 1724 * stack 2 = destination right index 1725 * stack 3 = destination left index 1726 */ 1727 destleft = stack[--stack_ptr]; 1728 1729 if (copy_count > copy_index) { 1730 src_reverse = 1; 1731 reverse = 1; 1732 src_count = 1 + copy_count - copy_index; 1733 /* copy_index = source start index */ 1734 } else { 1735 src_count = 1 + copy_index - copy_count; 1736 /* source start index */ 1737 copy_index = copy_count; 1738 } 1739 1740 if (copy_index2 > destleft) { 1741 dest_reverse = 1; 1742 reverse = !reverse; 1743 dest_count = 1 + copy_index2 - destleft; 1744 /* destination start index */ 1745 copy_index2 = destleft; 1746 } else 1747 dest_count = 1 + destleft - copy_index2; 1748 1749 copy_count = (src_count < dest_count) ? 1750 src_count : dest_count; 1751 1752 if ((src_reverse || dest_reverse) && 1753 (src_count != dest_count)) 1754 /* 1755 * If either the source or destination 1756 * is reversed, we can't tolerate 1757 * a length mismatch, because we 1758 * "left justify" arrays when copying. 1759 * This won't work correctly 1760 * with reversed arrays. 1761 */ 1762 status = -ERANGE; 1763 1764 } 1765 1766 count = copy_count; 1767 index = copy_index; 1768 index2 = copy_index2; 1769 1770 /* 1771 * If destination is a read-only array, 1772 * allocate a buffer and convert it to a writable array 1773 */ 1774 variable_id = args[1]; 1775 if ((version > 0) && 1776 ((attrs[variable_id] & 0x9c) == 0x0c)) { 1777 /* Allocate a writable buffer for this array */ 1778 long_tmp = 1779 (var_size[variable_id] + 7L) >> 3L; 1780 charptr_tmp2 = (u8 *)vars[variable_id]; 1781 charptr_tmp = 1782 kzalloc(long_tmp, GFP_KERNEL); 1783 vars[variable_id] = (long)charptr_tmp; 1784 1785 if (vars[variable_id] == 0) { 1786 status = -ENOMEM; 1787 break; 1788 } 1789 1790 /* zero the buffer */ 1791 for (long_idx = 0L; long_idx < long_tmp; 1792 ++long_idx) 1793 charptr_tmp[long_idx] = 0; 1794 1795 /* copy previous contents into buffer */ 1796 for (long_idx = 0L; 1797 long_idx < var_size[variable_id]; 1798 ++long_idx) { 1799 long_idx2 = long_idx; 1800 1801 if (charptr_tmp2[long_idx2 >> 3] & 1802 (1 << (long_idx2 & 7))) 1803 charptr_tmp[long_idx >> 3] |= 1804 (1 << (long_idx & 7)); 1805 1806 } 1807 1808 /* 1809 set bit 7 - buffer was dynamically allocated */ 1810 attrs[variable_id] |= 0x80; 1811 1812 /* clear bit 2 - variable is writable */ 1813 attrs[variable_id] &= ~0x04; 1814 attrs[variable_id] |= 0x01; 1815 } 1816 1817 charptr_tmp = (u8 *)vars[args[1]]; 1818 charptr_tmp2 = (u8 *)vars[args[0]]; 1819 1820 /* check if destination is a writable Boolean array */ 1821 if ((attrs[args[1]] & 0x1c) != 0x08) { 1822 status = -ERANGE; 1823 break; 1824 } 1825 1826 if (count < 1) { 1827 status = -ERANGE; 1828 break; 1829 } 1830 1831 if (reverse) 1832 index2 += (count - 1); 1833 1834 for (i = 0; i < count; ++i) { 1835 if (charptr_tmp2[index >> 3] & 1836 (1 << (index & 7))) 1837 charptr_tmp[index2 >> 3] |= 1838 (1 << (index2 & 7)); 1839 else 1840 charptr_tmp[index2 >> 3] &= 1841 ~(1 << (index2 & 7)); 1842 1843 ++index; 1844 if (reverse) 1845 --index2; 1846 else 1847 ++index2; 1848 } 1849 1850 break; 1851 } 1852 case OP_DSC: 1853 case OP_ISC: { 1854 /* 1855 * DRSCAN with capture 1856 * IRSCAN with capture 1857 * ...argument 0 is scan data variable ID 1858 * ...argument 1 is capture variable ID 1859 * ...stack 0 is capture index 1860 * ...stack 1 is scan data index 1861 * ...stack 2 is count 1862 */ 1863 s32 scan_right, scan_left; 1864 s32 capture_count = 0; 1865 s32 scan_count = 0; 1866 s32 capture_index; 1867 s32 scan_index; 1868 1869 if (!altera_check_stack(stack_ptr, 3, &status)) 1870 break; 1871 1872 capture_index = stack[--stack_ptr]; 1873 scan_index = stack[--stack_ptr]; 1874 1875 if (version > 0) { 1876 /* 1877 * stack 0 = capture right index 1878 * stack 1 = capture left index 1879 * stack 2 = scan right index 1880 * stack 3 = scan left index 1881 * stack 4 = count 1882 */ 1883 scan_right = stack[--stack_ptr]; 1884 scan_left = stack[--stack_ptr]; 1885 capture_count = 1 + scan_index - capture_index; 1886 scan_count = 1 + scan_left - scan_right; 1887 scan_index = scan_right; 1888 } 1889 1890 long_count = stack[--stack_ptr]; 1891 /* 1892 * If capture array is read-only, allocate a buffer 1893 * and convert it to a writable array 1894 */ 1895 variable_id = args[1]; 1896 if ((version > 0) && 1897 ((attrs[variable_id] & 0x9c) == 0x0c)) { 1898 /* Allocate a writable buffer for this array */ 1899 long_tmp = 1900 (var_size[variable_id] + 7L) >> 3L; 1901 charptr_tmp2 = (u8 *)vars[variable_id]; 1902 charptr_tmp = 1903 kzalloc(long_tmp, GFP_KERNEL); 1904 vars[variable_id] = (long)charptr_tmp; 1905 1906 if (vars[variable_id] == 0) { 1907 status = -ENOMEM; 1908 break; 1909 } 1910 1911 /* zero the buffer */ 1912 for (long_idx = 0L; long_idx < long_tmp; 1913 ++long_idx) 1914 charptr_tmp[long_idx] = 0; 1915 1916 /* copy previous contents into buffer */ 1917 for (long_idx = 0L; 1918 long_idx < var_size[variable_id]; 1919 ++long_idx) { 1920 long_idx2 = long_idx; 1921 1922 if (charptr_tmp2[long_idx2 >> 3] & 1923 (1 << (long_idx2 & 7))) 1924 charptr_tmp[long_idx >> 3] |= 1925 (1 << (long_idx & 7)); 1926 1927 } 1928 1929 /* 1930 * set bit 7 - buffer was 1931 * dynamically allocated 1932 */ 1933 attrs[variable_id] |= 0x80; 1934 1935 /* clear bit 2 - variable is writable */ 1936 attrs[variable_id] &= ~0x04; 1937 attrs[variable_id] |= 0x01; 1938 1939 } 1940 1941 charptr_tmp = (u8 *)vars[args[0]]; 1942 charptr_tmp2 = (u8 *)vars[args[1]]; 1943 1944 if ((version > 0) && 1945 ((long_count > capture_count) || 1946 (long_count > scan_count))) { 1947 status = -ERANGE; 1948 break; 1949 } 1950 1951 /* 1952 * check that capture array 1953 * is a writable Boolean array 1954 */ 1955 if ((attrs[args[1]] & 0x1c) != 0x08) { 1956 status = -ERANGE; 1957 break; 1958 } 1959 1960 if (status == 0) { 1961 if (opcode == 0x82) /* DSC */ 1962 status = altera_swap_dr(astate, 1963 long_count, 1964 charptr_tmp, 1965 scan_index, 1966 charptr_tmp2, 1967 capture_index); 1968 else /* ISC */ 1969 status = altera_swap_ir(astate, 1970 long_count, 1971 charptr_tmp, 1972 scan_index, 1973 charptr_tmp2, 1974 capture_index); 1975 1976 } 1977 1978 break; 1979 } 1980 case OP_WAIT: 1981 /* 1982 * WAIT 1983 * ...argument 0 is wait state 1984 * ...argument 1 is end state 1985 * ...stack 0 is cycles 1986 * ...stack 1 is microseconds 1987 */ 1988 if (!altera_check_stack(stack_ptr, 2, &status)) 1989 break; 1990 long_tmp = stack[--stack_ptr]; 1991 1992 if (long_tmp != 0L) 1993 status = altera_wait_cycles(astate, long_tmp, 1994 args[0]); 1995 1996 long_tmp = stack[--stack_ptr]; 1997 1998 if ((status == 0) && (long_tmp != 0L)) 1999 status = altera_wait_msecs(astate, 2000 long_tmp, 2001 args[0]); 2002 2003 if ((status == 0) && (args[1] != args[0])) 2004 status = altera_goto_jstate(astate, 2005 args[1]); 2006 2007 if (version > 0) { 2008 --stack_ptr; /* throw away MAX cycles */ 2009 --stack_ptr; /* throw away MAX microseconds */ 2010 } 2011 break; 2012 case OP_CMPA: { 2013 /* 2014 * Array compare 2015 * ...argument 0 is source 1 ID 2016 * ...argument 1 is source 2 ID 2017 * ...argument 2 is mask ID 2018 * ...stack 0 is source 1 index 2019 * ...stack 1 is source 2 index 2020 * ...stack 2 is mask index 2021 * ...stack 3 is count 2022 */ 2023 s32 a, b; 2024 u8 *source1 = (u8 *)vars[args[0]]; 2025 u8 *source2 = (u8 *)vars[args[1]]; 2026 u8 *mask = (u8 *)vars[args[2]]; 2027 u32 index1; 2028 u32 index2; 2029 u32 mask_index; 2030 2031 if (!altera_check_stack(stack_ptr, 4, &status)) 2032 break; 2033 2034 index1 = stack[--stack_ptr]; 2035 index2 = stack[--stack_ptr]; 2036 mask_index = stack[--stack_ptr]; 2037 long_count = stack[--stack_ptr]; 2038 2039 if (version > 0) { 2040 /* 2041 * stack 0 = source 1 right index 2042 * stack 1 = source 1 left index 2043 * stack 2 = source 2 right index 2044 * stack 3 = source 2 left index 2045 * stack 4 = mask right index 2046 * stack 5 = mask left index 2047 */ 2048 s32 mask_right = stack[--stack_ptr]; 2049 s32 mask_left = stack[--stack_ptr]; 2050 /* source 1 count */ 2051 a = 1 + index2 - index1; 2052 /* source 2 count */ 2053 b = 1 + long_count - mask_index; 2054 a = (a < b) ? a : b; 2055 /* mask count */ 2056 b = 1 + mask_left - mask_right; 2057 a = (a < b) ? a : b; 2058 /* source 2 start index */ 2059 index2 = mask_index; 2060 /* mask start index */ 2061 mask_index = mask_right; 2062 long_count = a; 2063 } 2064 2065 long_tmp = 1L; 2066 2067 if (long_count < 1) 2068 status = -ERANGE; 2069 else { 2070 count = long_count; 2071 2072 for (i = 0; i < count; ++i) { 2073 if (mask[mask_index >> 3] & 2074 (1 << (mask_index & 7))) { 2075 a = source1[index1 >> 3] & 2076 (1 << (index1 & 7)) 2077 ? 1 : 0; 2078 b = source2[index2 >> 3] & 2079 (1 << (index2 & 7)) 2080 ? 1 : 0; 2081 2082 if (a != b) /* failure */ 2083 long_tmp = 0L; 2084 } 2085 ++index1; 2086 ++index2; 2087 ++mask_index; 2088 } 2089 } 2090 2091 stack[stack_ptr++] = long_tmp; 2092 2093 break; 2094 } 2095 default: 2096 /* Unrecognized opcode -- ERROR! */ 2097 bad_opcode = 1; 2098 break; 2099 } 2100 2101 if (bad_opcode) 2102 status = -ENOSYS; 2103 2104 if ((stack_ptr < 0) || (stack_ptr >= ALTERA_STACK_SIZE)) 2105 status = -EOVERFLOW; 2106 2107 if (status != 0) { 2108 done = 1; 2109 *error_address = (s32)(opcode_address - code_sect); 2110 } 2111 } 2112 2113 altera_free_buffers(astate); 2114 2115 /* Free all dynamically allocated arrays */ 2116 if ((attrs != NULL) && (vars != NULL)) 2117 for (i = 0; i < sym_count; ++i) 2118 if (attrs[i] & 0x80) 2119 kfree((void *)vars[i]); 2120 2121 kfree(vars); 2122 kfree(var_size); 2123 kfree(attrs); 2124 kfree(proc_attributes); 2125 2126 return status; 2127} 2128 2129static int altera_get_note(u8 *p, s32 program_size, 2130 s32 *offset, char *key, char *value, int length) 2131/* 2132 * Gets key and value of NOTE fields in the JBC file. 2133 * Can be called in two modes: if offset pointer is NULL, 2134 * then the function searches for note fields which match 2135 * the key string provided. If offset is not NULL, then 2136 * the function finds the next note field of any key, 2137 * starting at the offset specified by the offset pointer. 2138 * Returns 0 for success, else appropriate error code 2139 */ 2140{ 2141 int status = -ENODATA; 2142 u32 note_strings = 0L; 2143 u32 note_table = 0L; 2144 u32 note_count = 0L; 2145 u32 first_word = 0L; 2146 int version = 0; 2147 int delta = 0; 2148 char *key_ptr; 2149 char *value_ptr; 2150 int i; 2151 2152 /* Read header information */ 2153 if (program_size > 52L) { 2154 first_word = get_unaligned_be32(&p[0]); 2155 version = (first_word & 1L); 2156 delta = version * 8; 2157 2158 note_strings = get_unaligned_be32(&p[8 + delta]); 2159 note_table = get_unaligned_be32(&p[12 + delta]); 2160 note_count = get_unaligned_be32(&p[44 + (2 * delta)]); 2161 } 2162 2163 if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) 2164 return -EIO; 2165 2166 if (note_count <= 0L) 2167 return status; 2168 2169 if (offset == NULL) { 2170 /* 2171 * We will search for the first note with a specific key, 2172 * and return only the value 2173 */ 2174 for (i = 0; (i < note_count) && 2175 (status != 0); ++i) { 2176 key_ptr = &p[note_strings + 2177 get_unaligned_be32( 2178 &p[note_table + (8 * i)])]; 2179 if ((strncasecmp(key, key_ptr, strlen(key_ptr)) == 0) && 2180 (key != NULL)) { 2181 status = 0; 2182 2183 value_ptr = &p[note_strings + 2184 get_unaligned_be32( 2185 &p[note_table + (8 * i) + 4])]; 2186 2187 if (value != NULL) 2188 strlcpy(value, value_ptr, length); 2189 2190 } 2191 } 2192 } else { 2193 /* 2194 * We will search for the next note, regardless of the key, 2195 * and return both the value and the key 2196 */ 2197 2198 i = *offset; 2199 2200 if ((i >= 0) && (i < note_count)) { 2201 status = 0; 2202 2203 if (key != NULL) 2204 strlcpy(key, &p[note_strings + 2205 get_unaligned_be32( 2206 &p[note_table + (8 * i)])], 2207 length); 2208 2209 if (value != NULL) 2210 strlcpy(value, &p[note_strings + 2211 get_unaligned_be32( 2212 &p[note_table + (8 * i) + 4])], 2213 length); 2214 2215 *offset = i + 1; 2216 } 2217 } 2218 2219 return status; 2220} 2221 2222static int altera_check_crc(u8 *p, s32 program_size) 2223{ 2224 int status = 0; 2225 u16 local_expected = 0, 2226 local_actual = 0, 2227 shift_reg = 0xffff; 2228 int bit, feedback; 2229 u8 databyte; 2230 u32 i; 2231 u32 crc_section = 0L; 2232 u32 first_word = 0L; 2233 int version = 0; 2234 int delta = 0; 2235 2236 if (program_size > 52L) { 2237 first_word = get_unaligned_be32(&p[0]); 2238 version = (first_word & 1L); 2239 delta = version * 8; 2240 2241 crc_section = get_unaligned_be32(&p[32 + delta]); 2242 } 2243 2244 if ((first_word != 0x4A414D00L) && (first_word != 0x4A414D01L)) 2245 status = -EIO; 2246 2247 if (crc_section >= program_size) 2248 status = -EIO; 2249 2250 if (status == 0) { 2251 local_expected = (u16)get_unaligned_be16(&p[crc_section]); 2252 2253 for (i = 0; i < crc_section; ++i) { 2254 databyte = p[i]; 2255 for (bit = 0; bit < 8; bit++) { 2256 feedback = (databyte ^ shift_reg) & 0x01; 2257 shift_reg >>= 1; 2258 if (feedback) 2259 shift_reg ^= 0x8408; 2260 2261 databyte >>= 1; 2262 } 2263 } 2264 2265 local_actual = (u16)~shift_reg; 2266 2267 if (local_expected != local_actual) 2268 status = -EILSEQ; 2269 2270 } 2271 2272 if (debug || status) { 2273 switch (status) { 2274 case 0: 2275 printk(KERN_INFO "%s: CRC matched: %04x\n", __func__, 2276 local_actual); 2277 break; 2278 case -EILSEQ: 2279 printk(KERN_ERR "%s: CRC mismatch: expected %04x, " 2280 "actual %04x\n", __func__, local_expected, 2281 local_actual); 2282 break; 2283 case -ENODATA: 2284 printk(KERN_ERR "%s: expected CRC not found, " 2285 "actual CRC = %04x\n", __func__, 2286 local_actual); 2287 break; 2288 case -EIO: 2289 printk(KERN_ERR "%s: error: format isn't " 2290 "recognized.\n", __func__); 2291 break; 2292 default: 2293 printk(KERN_ERR "%s: CRC function returned error " 2294 "code %d\n", __func__, status); 2295 break; 2296 } 2297 } 2298 2299 return status; 2300} 2301 2302static int altera_get_file_info(u8 *p, 2303 s32 program_size, 2304 int *format_version, 2305 int *action_count, 2306 int *procedure_count) 2307{ 2308 int status = -EIO; 2309 u32 first_word = 0; 2310 int version = 0; 2311 2312 if (program_size <= 52L) 2313 return status; 2314 2315 first_word = get_unaligned_be32(&p[0]); 2316 2317 if ((first_word == 0x4A414D00L) || (first_word == 0x4A414D01L)) { 2318 status = 0; 2319 2320 version = (first_word & 1L); 2321 *format_version = version + 1; 2322 2323 if (version > 0) { 2324 *action_count = get_unaligned_be32(&p[48]); 2325 *procedure_count = get_unaligned_be32(&p[52]); 2326 } 2327 } 2328 2329 return status; 2330} 2331 2332static int altera_get_act_info(u8 *p, 2333 s32 program_size, 2334 int index, 2335 char **name, 2336 char **description, 2337 struct altera_procinfo **proc_list) 2338{ 2339 int status = -EIO; 2340 struct altera_procinfo *procptr = NULL; 2341 struct altera_procinfo *tmpptr = NULL; 2342 u32 first_word = 0L; 2343 u32 action_table = 0L; 2344 u32 proc_table = 0L; 2345 u32 str_table = 0L; 2346 u32 note_strings = 0L; 2347 u32 action_count = 0L; 2348 u32 proc_count = 0L; 2349 u32 act_name_id = 0L; 2350 u32 act_desc_id = 0L; 2351 u32 act_proc_id = 0L; 2352 u32 act_proc_name = 0L; 2353 u8 act_proc_attribute = 0; 2354 2355 if (program_size <= 52L) 2356 return status; 2357 /* Read header information */ 2358 first_word = get_unaligned_be32(&p[0]); 2359 2360 if (first_word != 0x4A414D01L) 2361 return status; 2362 2363 action_table = get_unaligned_be32(&p[4]); 2364 proc_table = get_unaligned_be32(&p[8]); 2365 str_table = get_unaligned_be32(&p[12]); 2366 note_strings = get_unaligned_be32(&p[16]); 2367 action_count = get_unaligned_be32(&p[48]); 2368 proc_count = get_unaligned_be32(&p[52]); 2369 2370 if (index >= action_count) 2371 return status; 2372 2373 act_name_id = get_unaligned_be32(&p[action_table + (12 * index)]); 2374 act_desc_id = get_unaligned_be32(&p[action_table + (12 * index) + 4]); 2375 act_proc_id = get_unaligned_be32(&p[action_table + (12 * index) + 8]); 2376 2377 *name = &p[str_table + act_name_id]; 2378 2379 if (act_desc_id < (note_strings - str_table)) 2380 *description = &p[str_table + act_desc_id]; 2381 2382 do { 2383 act_proc_name = get_unaligned_be32( 2384 &p[proc_table + (13 * act_proc_id)]); 2385 act_proc_attribute = 2386 (p[proc_table + (13 * act_proc_id) + 8] & 0x03); 2387 2388 procptr = 2389 kzalloc(sizeof(struct altera_procinfo), 2390 GFP_KERNEL); 2391 2392 if (procptr == NULL) 2393 status = -ENOMEM; 2394 else { 2395 procptr->name = &p[str_table + act_proc_name]; 2396 procptr->attrs = act_proc_attribute; 2397 procptr->next = NULL; 2398 2399 /* add record to end of linked list */ 2400 if (*proc_list == NULL) 2401 *proc_list = procptr; 2402 else { 2403 tmpptr = *proc_list; 2404 while (tmpptr->next != NULL) 2405 tmpptr = tmpptr->next; 2406 tmpptr->next = procptr; 2407 } 2408 } 2409 2410 act_proc_id = get_unaligned_be32( 2411 &p[proc_table + (13 * act_proc_id) + 4]); 2412 } while ((act_proc_id != 0) && (act_proc_id < proc_count)); 2413 2414 return status; 2415} 2416 2417int altera_init(struct altera_config *config, const struct firmware *fw) 2418{ 2419 struct altera_state *astate = NULL; 2420 struct altera_procinfo *proc_list = NULL; 2421 struct altera_procinfo *procptr = NULL; 2422 char *key = NULL; 2423 char *value = NULL; 2424 char *action_name = NULL; 2425 char *description = NULL; 2426 int exec_result = 0; 2427 int exit_code = 0; 2428 int format_version = 0; 2429 int action_count = 0; 2430 int procedure_count = 0; 2431 int index = 0; 2432 s32 offset = 0L; 2433 s32 error_address = 0L; 2434 int retval = 0; 2435 2436 key = kzalloc(33, GFP_KERNEL); 2437 if (!key) { 2438 retval = -ENOMEM; 2439 goto out; 2440 } 2441 value = kzalloc(257, GFP_KERNEL); 2442 if (!value) { 2443 retval = -ENOMEM; 2444 goto free_key; 2445 } 2446 astate = kzalloc(sizeof(struct altera_state), GFP_KERNEL); 2447 if (!astate) { 2448 retval = -ENOMEM; 2449 goto free_value; 2450 } 2451 2452 astate->config = config; 2453 if (!astate->config->jtag_io) { 2454 dprintk(KERN_INFO "%s: using byteblaster!\n", __func__); 2455 astate->config->jtag_io = netup_jtag_io_lpt; 2456 } 2457 2458 altera_check_crc((u8 *)fw->data, fw->size); 2459 2460 if (debug) { 2461 altera_get_file_info((u8 *)fw->data, fw->size, &format_version, 2462 &action_count, &procedure_count); 2463 printk(KERN_INFO "%s: File format is %s ByteCode format\n", 2464 __func__, (format_version == 2) ? "Jam STAPL" : 2465 "pre-standardized Jam 1.1"); 2466 while (altera_get_note((u8 *)fw->data, fw->size, 2467 &offset, key, value, 256) == 0) 2468 printk(KERN_INFO "%s: NOTE \"%s\" = \"%s\"\n", 2469 __func__, key, value); 2470 } 2471 2472 if (debug && (format_version == 2) && (action_count > 0)) { 2473 printk(KERN_INFO "%s: Actions available:\n", __func__); 2474 for (index = 0; index < action_count; ++index) { 2475 altera_get_act_info((u8 *)fw->data, fw->size, 2476 index, &action_name, 2477 &description, 2478 &proc_list); 2479 2480 if (description == NULL) 2481 printk(KERN_INFO "%s: %s\n", 2482 __func__, 2483 action_name); 2484 else 2485 printk(KERN_INFO "%s: %s \"%s\"\n", 2486 __func__, 2487 action_name, 2488 description); 2489 2490 procptr = proc_list; 2491 while (procptr != NULL) { 2492 if (procptr->attrs != 0) 2493 printk(KERN_INFO "%s: %s (%s)\n", 2494 __func__, 2495 procptr->name, 2496 (procptr->attrs == 1) ? 2497 "optional" : "recommended"); 2498 2499 proc_list = procptr->next; 2500 kfree(procptr); 2501 procptr = proc_list; 2502 } 2503 } 2504 2505 printk(KERN_INFO "\n"); 2506 } 2507 2508 exec_result = altera_execute(astate, (u8 *)fw->data, fw->size, 2509 &error_address, &exit_code, &format_version); 2510 2511 if (exit_code) 2512 exec_result = -EREMOTEIO; 2513 2514 if ((format_version == 2) && (exec_result == -EINVAL)) { 2515 if (astate->config->action == NULL) 2516 printk(KERN_ERR "%s: error: no action specified for " 2517 "Jam STAPL file.\nprogram terminated.\n", 2518 __func__); 2519 else 2520 printk(KERN_ERR "%s: error: action \"%s\"" 2521 " is not supported " 2522 "for this Jam STAPL file.\n" 2523 "Program terminated.\n", __func__, 2524 astate->config->action); 2525 2526 } else if (exec_result) 2527 printk(KERN_ERR "%s: error %d\n", __func__, exec_result); 2528 2529 kfree(astate); 2530free_value: 2531 kfree(value); 2532free_key: 2533 kfree(key); 2534out: 2535 return retval; 2536} 2537EXPORT_SYMBOL(altera_init); 2538