Revision 99a0949b hw/ppc.c
b/hw/ppc.c | ||
---|---|---|
377 | 377 |
} |
378 | 378 |
/*****************************************************************************/ |
379 | 379 |
/* PowerPC time base and decrementer emulation */ |
380 |
struct ppc_tb_t {
|
|
380 |
struct ppc_tb { |
|
381 | 381 |
/* Time base management */ |
382 | 382 |
int64_t tb_offset; /* Compensation */ |
383 | 383 |
int64_t atb_offset; /* Compensation */ |
... | ... | |
394 | 394 |
void *opaque; |
395 | 395 |
}; |
396 | 396 |
|
397 |
static inline uint64_t cpu_ppc_get_tb(ppc_tb_t *tb_env, uint64_t vmclk,
|
|
397 |
static inline uint64_t cpu_ppc_get_tb(a_ppc_tb *tb_env, uint64_t vmclk,
|
|
398 | 398 |
int64_t tb_offset) |
399 | 399 |
{ |
400 | 400 |
/* TB time in tb periods */ |
... | ... | |
403 | 403 |
|
404 | 404 |
uint32_t cpu_ppc_load_tbl (CPUState *env) |
405 | 405 |
{ |
406 |
ppc_tb_t *tb_env = env->tb_env;
|
|
406 |
a_ppc_tb *tb_env = env->tb_env;
|
|
407 | 407 |
uint64_t tb; |
408 | 408 |
|
409 | 409 |
tb = cpu_ppc_get_tb(tb_env, qemu_get_clock(vm_clock), tb_env->tb_offset); |
... | ... | |
414 | 414 |
|
415 | 415 |
static inline uint32_t _cpu_ppc_load_tbu(CPUState *env) |
416 | 416 |
{ |
417 |
ppc_tb_t *tb_env = env->tb_env;
|
|
417 |
a_ppc_tb *tb_env = env->tb_env;
|
|
418 | 418 |
uint64_t tb; |
419 | 419 |
|
420 | 420 |
tb = cpu_ppc_get_tb(tb_env, qemu_get_clock(vm_clock), tb_env->tb_offset); |
... | ... | |
428 | 428 |
return _cpu_ppc_load_tbu(env); |
429 | 429 |
} |
430 | 430 |
|
431 |
static inline void cpu_ppc_store_tb(ppc_tb_t *tb_env, uint64_t vmclk,
|
|
431 |
static inline void cpu_ppc_store_tb(a_ppc_tb *tb_env, uint64_t vmclk,
|
|
432 | 432 |
int64_t *tb_offsetp, uint64_t value) |
433 | 433 |
{ |
434 | 434 |
*tb_offsetp = value - muldiv64(vmclk, tb_env->tb_freq, get_ticks_per_sec()); |
... | ... | |
438 | 438 |
|
439 | 439 |
void cpu_ppc_store_tbl (CPUState *env, uint32_t value) |
440 | 440 |
{ |
441 |
ppc_tb_t *tb_env = env->tb_env;
|
|
441 |
a_ppc_tb *tb_env = env->tb_env;
|
|
442 | 442 |
uint64_t tb; |
443 | 443 |
|
444 | 444 |
tb = cpu_ppc_get_tb(tb_env, qemu_get_clock(vm_clock), tb_env->tb_offset); |
... | ... | |
449 | 449 |
|
450 | 450 |
static inline void _cpu_ppc_store_tbu(CPUState *env, uint32_t value) |
451 | 451 |
{ |
452 |
ppc_tb_t *tb_env = env->tb_env;
|
|
452 |
a_ppc_tb *tb_env = env->tb_env;
|
|
453 | 453 |
uint64_t tb; |
454 | 454 |
|
455 | 455 |
tb = cpu_ppc_get_tb(tb_env, qemu_get_clock(vm_clock), tb_env->tb_offset); |
... | ... | |
465 | 465 |
|
466 | 466 |
uint32_t cpu_ppc_load_atbl (CPUState *env) |
467 | 467 |
{ |
468 |
ppc_tb_t *tb_env = env->tb_env;
|
|
468 |
a_ppc_tb *tb_env = env->tb_env;
|
|
469 | 469 |
uint64_t tb; |
470 | 470 |
|
471 | 471 |
tb = cpu_ppc_get_tb(tb_env, qemu_get_clock(vm_clock), tb_env->atb_offset); |
... | ... | |
476 | 476 |
|
477 | 477 |
uint32_t cpu_ppc_load_atbu (CPUState *env) |
478 | 478 |
{ |
479 |
ppc_tb_t *tb_env = env->tb_env;
|
|
479 |
a_ppc_tb *tb_env = env->tb_env;
|
|
480 | 480 |
uint64_t tb; |
481 | 481 |
|
482 | 482 |
tb = cpu_ppc_get_tb(tb_env, qemu_get_clock(vm_clock), tb_env->atb_offset); |
... | ... | |
487 | 487 |
|
488 | 488 |
void cpu_ppc_store_atbl (CPUState *env, uint32_t value) |
489 | 489 |
{ |
490 |
ppc_tb_t *tb_env = env->tb_env;
|
|
490 |
a_ppc_tb *tb_env = env->tb_env;
|
|
491 | 491 |
uint64_t tb; |
492 | 492 |
|
493 | 493 |
tb = cpu_ppc_get_tb(tb_env, qemu_get_clock(vm_clock), tb_env->atb_offset); |
... | ... | |
498 | 498 |
|
499 | 499 |
void cpu_ppc_store_atbu (CPUState *env, uint32_t value) |
500 | 500 |
{ |
501 |
ppc_tb_t *tb_env = env->tb_env;
|
|
501 |
a_ppc_tb *tb_env = env->tb_env;
|
|
502 | 502 |
uint64_t tb; |
503 | 503 |
|
504 | 504 |
tb = cpu_ppc_get_tb(tb_env, qemu_get_clock(vm_clock), tb_env->atb_offset); |
... | ... | |
509 | 509 |
|
510 | 510 |
static void cpu_ppc_tb_stop (CPUState *env) |
511 | 511 |
{ |
512 |
ppc_tb_t *tb_env = env->tb_env;
|
|
512 |
a_ppc_tb *tb_env = env->tb_env;
|
|
513 | 513 |
uint64_t tb, atb, vmclk; |
514 | 514 |
|
515 | 515 |
/* If the time base is already frozen, do nothing */ |
... | ... | |
531 | 531 |
|
532 | 532 |
static void cpu_ppc_tb_start (CPUState *env) |
533 | 533 |
{ |
534 |
ppc_tb_t *tb_env = env->tb_env;
|
|
534 |
a_ppc_tb *tb_env = env->tb_env;
|
|
535 | 535 |
uint64_t tb, atb, vmclk; |
536 | 536 |
|
537 | 537 |
/* If the time base is not frozen, do nothing */ |
... | ... | |
552 | 552 |
|
553 | 553 |
static inline uint32_t _cpu_ppc_load_decr(CPUState *env, uint64_t next) |
554 | 554 |
{ |
555 |
ppc_tb_t *tb_env = env->tb_env;
|
|
555 |
a_ppc_tb *tb_env = env->tb_env;
|
|
556 | 556 |
uint32_t decr; |
557 | 557 |
int64_t diff; |
558 | 558 |
|
... | ... | |
568 | 568 |
|
569 | 569 |
uint32_t cpu_ppc_load_decr (CPUState *env) |
570 | 570 |
{ |
571 |
ppc_tb_t *tb_env = env->tb_env;
|
|
571 |
a_ppc_tb *tb_env = env->tb_env;
|
|
572 | 572 |
|
573 | 573 |
return _cpu_ppc_load_decr(env, tb_env->decr_next); |
574 | 574 |
} |
575 | 575 |
|
576 | 576 |
uint32_t cpu_ppc_load_hdecr (CPUState *env) |
577 | 577 |
{ |
578 |
ppc_tb_t *tb_env = env->tb_env;
|
|
578 |
a_ppc_tb *tb_env = env->tb_env;
|
|
579 | 579 |
|
580 | 580 |
return _cpu_ppc_load_decr(env, tb_env->hdecr_next); |
581 | 581 |
} |
582 | 582 |
|
583 | 583 |
uint64_t cpu_ppc_load_purr (CPUState *env) |
584 | 584 |
{ |
585 |
ppc_tb_t *tb_env = env->tb_env;
|
|
585 |
a_ppc_tb *tb_env = env->tb_env;
|
|
586 | 586 |
uint64_t diff; |
587 | 587 |
|
588 | 588 |
diff = qemu_get_clock(vm_clock) - tb_env->purr_start; |
... | ... | |
613 | 613 |
uint32_t decr, uint32_t value, |
614 | 614 |
int is_excp) |
615 | 615 |
{ |
616 |
ppc_tb_t *tb_env = env->tb_env;
|
|
616 |
a_ppc_tb *tb_env = env->tb_env;
|
|
617 | 617 |
uint64_t now, next; |
618 | 618 |
|
619 | 619 |
LOG_TB("%s: %08" PRIx32 " => %08" PRIx32 "\n", __func__, |
... | ... | |
637 | 637 |
static inline void _cpu_ppc_store_decr(CPUState *env, uint32_t decr, |
638 | 638 |
uint32_t value, int is_excp) |
639 | 639 |
{ |
640 |
ppc_tb_t *tb_env = env->tb_env;
|
|
640 |
a_ppc_tb *tb_env = env->tb_env;
|
|
641 | 641 |
|
642 | 642 |
__cpu_ppc_store_decr(env, &tb_env->decr_next, tb_env->decr_timer, |
643 | 643 |
&cpu_ppc_decr_excp, decr, value, is_excp); |
... | ... | |
656 | 656 |
static inline void _cpu_ppc_store_hdecr(CPUState *env, uint32_t hdecr, |
657 | 657 |
uint32_t value, int is_excp) |
658 | 658 |
{ |
659 |
ppc_tb_t *tb_env = env->tb_env;
|
|
659 |
a_ppc_tb *tb_env = env->tb_env;
|
|
660 | 660 |
|
661 | 661 |
if (tb_env->hdecr_timer != NULL) { |
662 | 662 |
__cpu_ppc_store_decr(env, &tb_env->hdecr_next, tb_env->hdecr_timer, |
... | ... | |
676 | 676 |
|
677 | 677 |
void cpu_ppc_store_purr (CPUState *env, uint64_t value) |
678 | 678 |
{ |
679 |
ppc_tb_t *tb_env = env->tb_env;
|
|
679 |
a_ppc_tb *tb_env = env->tb_env;
|
|
680 | 680 |
|
681 | 681 |
tb_env->purr_load = value; |
682 | 682 |
tb_env->purr_start = qemu_get_clock(vm_clock); |
... | ... | |
685 | 685 |
static void cpu_ppc_set_tb_clk (void *opaque, uint32_t freq) |
686 | 686 |
{ |
687 | 687 |
CPUState *env = opaque; |
688 |
ppc_tb_t *tb_env = env->tb_env;
|
|
688 |
a_ppc_tb *tb_env = env->tb_env;
|
|
689 | 689 |
|
690 | 690 |
tb_env->tb_freq = freq; |
691 | 691 |
tb_env->decr_freq = freq; |
... | ... | |
701 | 701 |
/* Set up (once) timebase frequency (in Hz) */ |
702 | 702 |
clk_setup_cb cpu_ppc_tb_init (CPUState *env, uint32_t freq) |
703 | 703 |
{ |
704 |
ppc_tb_t *tb_env;
|
|
704 |
a_ppc_tb *tb_env;
|
|
705 | 705 |
|
706 |
tb_env = qemu_mallocz(sizeof(ppc_tb_t));
|
|
706 |
tb_env = qemu_mallocz(sizeof(a_ppc_tb));
|
|
707 | 707 |
env->tb_env = tb_env; |
708 | 708 |
/* Create new timer */ |
709 | 709 |
tb_env->decr_timer = qemu_new_timer(vm_clock, &cpu_ppc_decr_cb, env); |
... | ... | |
751 | 751 |
/* Embedded PowerPC timers */ |
752 | 752 |
|
753 | 753 |
/* PIT, FIT & WDT */ |
754 |
typedef struct ppcemb_timer_t ppcemb_timer_t;
|
|
755 |
struct ppcemb_timer_t {
|
|
754 |
typedef struct ppcemb_timer a_ppcemb_timer;
|
|
755 |
struct ppcemb_timer { |
|
756 | 756 |
uint64_t pit_reload; /* PIT auto-reload value */ |
757 | 757 |
uint64_t fit_next; /* Tick for next FIT interrupt */ |
758 | 758 |
struct QEMUTimer *fit_timer; |
... | ... | |
764 | 764 |
static void cpu_4xx_fit_cb (void *opaque) |
765 | 765 |
{ |
766 | 766 |
CPUState *env; |
767 |
ppc_tb_t *tb_env;
|
|
768 |
ppcemb_timer_t *ppcemb_timer;
|
|
767 |
a_ppc_tb *tb_env;
|
|
768 |
a_ppcemb_timer *ppcemb_timer;
|
|
769 | 769 |
uint64_t now, next; |
770 | 770 |
|
771 | 771 |
env = opaque; |
... | ... | |
802 | 802 |
} |
803 | 803 |
|
804 | 804 |
/* Programmable interval timer */ |
805 |
static void start_stop_pit (CPUState *env, ppc_tb_t *tb_env, int is_excp)
|
|
805 |
static void start_stop_pit (CPUState *env, a_ppc_tb *tb_env, int is_excp)
|
|
806 | 806 |
{ |
807 |
ppcemb_timer_t *ppcemb_timer;
|
|
807 |
a_ppcemb_timer *ppcemb_timer;
|
|
808 | 808 |
uint64_t now, next; |
809 | 809 |
|
810 | 810 |
ppcemb_timer = tb_env->opaque; |
... | ... | |
832 | 832 |
static void cpu_4xx_pit_cb (void *opaque) |
833 | 833 |
{ |
834 | 834 |
CPUState *env; |
835 |
ppc_tb_t *tb_env;
|
|
836 |
ppcemb_timer_t *ppcemb_timer;
|
|
835 |
a_ppc_tb *tb_env;
|
|
836 |
a_ppcemb_timer *ppcemb_timer;
|
|
837 | 837 |
|
838 | 838 |
env = opaque; |
839 | 839 |
tb_env = env->tb_env; |
... | ... | |
854 | 854 |
static void cpu_4xx_wdt_cb (void *opaque) |
855 | 855 |
{ |
856 | 856 |
CPUState *env; |
857 |
ppc_tb_t *tb_env;
|
|
858 |
ppcemb_timer_t *ppcemb_timer;
|
|
857 |
a_ppc_tb *tb_env;
|
|
858 |
a_ppcemb_timer *ppcemb_timer;
|
|
859 | 859 |
uint64_t now, next; |
860 | 860 |
|
861 | 861 |
env = opaque; |
... | ... | |
920 | 920 |
|
921 | 921 |
void store_40x_pit (CPUState *env, target_ulong val) |
922 | 922 |
{ |
923 |
ppc_tb_t *tb_env;
|
|
924 |
ppcemb_timer_t *ppcemb_timer;
|
|
923 |
a_ppc_tb *tb_env;
|
|
924 |
a_ppcemb_timer *ppcemb_timer;
|
|
925 | 925 |
|
926 | 926 |
tb_env = env->tb_env; |
927 | 927 |
ppcemb_timer = tb_env->opaque; |
... | ... | |
945 | 945 |
|
946 | 946 |
void store_booke_tcr (CPUState *env, target_ulong val) |
947 | 947 |
{ |
948 |
ppc_tb_t *tb_env;
|
|
948 |
a_ppc_tb *tb_env;
|
|
949 | 949 |
|
950 | 950 |
tb_env = env->tb_env; |
951 | 951 |
LOG_TB("%s: val " TARGET_FMT_lx "\n", __func__, val); |
... | ... | |
957 | 957 |
static void ppc_emb_set_tb_clk (void *opaque, uint32_t freq) |
958 | 958 |
{ |
959 | 959 |
CPUState *env = opaque; |
960 |
ppc_tb_t *tb_env = env->tb_env;
|
|
960 |
a_ppc_tb *tb_env = env->tb_env;
|
|
961 | 961 |
|
962 | 962 |
LOG_TB("%s set new frequency to %" PRIu32 "\n", __func__, |
963 | 963 |
freq); |
... | ... | |
968 | 968 |
|
969 | 969 |
clk_setup_cb ppc_emb_timers_init (CPUState *env, uint32_t freq) |
970 | 970 |
{ |
971 |
ppc_tb_t *tb_env;
|
|
972 |
ppcemb_timer_t *ppcemb_timer;
|
|
971 |
a_ppc_tb *tb_env;
|
|
972 |
a_ppcemb_timer *ppcemb_timer;
|
|
973 | 973 |
|
974 |
tb_env = qemu_mallocz(sizeof(ppc_tb_t));
|
|
974 |
tb_env = qemu_mallocz(sizeof(a_ppc_tb));
|
|
975 | 975 |
env->tb_env = tb_env; |
976 |
ppcemb_timer = qemu_mallocz(sizeof(ppcemb_timer_t));
|
|
976 |
ppcemb_timer = qemu_mallocz(sizeof(a_ppcemb_timer));
|
|
977 | 977 |
tb_env->tb_freq = freq; |
978 | 978 |
tb_env->decr_freq = freq; |
979 | 979 |
tb_env->opaque = ppcemb_timer; |
... | ... | |
992 | 992 |
|
993 | 993 |
/*****************************************************************************/ |
994 | 994 |
/* Embedded PowerPC Device Control Registers */ |
995 |
typedef struct ppc_dcrn_t ppc_dcrn_t;
|
|
996 |
struct ppc_dcrn_t {
|
|
995 |
typedef struct ppc_dcrn a_ppc_dcrn;
|
|
996 |
struct ppc_dcrn { |
|
997 | 997 |
dcr_read_cb dcr_read; |
998 | 998 |
dcr_write_cb dcr_write; |
999 | 999 |
void *opaque; |
... | ... | |
1003 | 1003 |
* using DCRIPR to get the 22 upper bits of the DCR address |
1004 | 1004 |
*/ |
1005 | 1005 |
#define DCRN_NB 1024 |
1006 |
struct ppc_dcr_t {
|
|
1007 |
ppc_dcrn_t dcrn[DCRN_NB];
|
|
1006 |
struct ppc_dcr { |
|
1007 |
a_ppc_dcrn dcrn[DCRN_NB];
|
|
1008 | 1008 |
int (*read_error)(int dcrn); |
1009 | 1009 |
int (*write_error)(int dcrn); |
1010 | 1010 |
}; |
1011 | 1011 |
|
1012 |
int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, target_ulong *valp)
|
|
1012 |
int ppc_dcr_read (a_ppc_dcr *dcr_env, int dcrn, target_ulong *valp)
|
|
1013 | 1013 |
{ |
1014 |
ppc_dcrn_t *dcr;
|
|
1014 |
a_ppc_dcrn *dcr;
|
|
1015 | 1015 |
|
1016 | 1016 |
if (dcrn < 0 || dcrn >= DCRN_NB) |
1017 | 1017 |
goto error; |
... | ... | |
1029 | 1029 |
return -1; |
1030 | 1030 |
} |
1031 | 1031 |
|
1032 |
int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val)
|
|
1032 |
int ppc_dcr_write (a_ppc_dcr *dcr_env, int dcrn, target_ulong val)
|
|
1033 | 1033 |
{ |
1034 |
ppc_dcrn_t *dcr;
|
|
1034 |
a_ppc_dcrn *dcr;
|
|
1035 | 1035 |
|
1036 | 1036 |
if (dcrn < 0 || dcrn >= DCRN_NB) |
1037 | 1037 |
goto error; |
... | ... | |
1052 | 1052 |
int ppc_dcr_register (CPUState *env, int dcrn, void *opaque, |
1053 | 1053 |
dcr_read_cb dcr_read, dcr_write_cb dcr_write) |
1054 | 1054 |
{ |
1055 |
ppc_dcr_t *dcr_env;
|
|
1056 |
ppc_dcrn_t *dcr;
|
|
1055 |
a_ppc_dcr *dcr_env;
|
|
1056 |
a_ppc_dcrn *dcr;
|
|
1057 | 1057 |
|
1058 | 1058 |
dcr_env = env->dcr_env; |
1059 | 1059 |
if (dcr_env == NULL) |
... | ... | |
1075 | 1075 |
int ppc_dcr_init (CPUState *env, int (*read_error)(int dcrn), |
1076 | 1076 |
int (*write_error)(int dcrn)) |
1077 | 1077 |
{ |
1078 |
ppc_dcr_t *dcr_env;
|
|
1078 |
a_ppc_dcr *dcr_env;
|
|
1079 | 1079 |
|
1080 |
dcr_env = qemu_mallocz(sizeof(ppc_dcr_t));
|
|
1080 |
dcr_env = qemu_mallocz(sizeof(a_ppc_dcr));
|
|
1081 | 1081 |
dcr_env->read_error = read_error; |
1082 | 1082 |
dcr_env->write_error = write_error; |
1083 | 1083 |
env->dcr_env = dcr_env; |
... | ... | |
1117 | 1117 |
|
1118 | 1118 |
/*****************************************************************************/ |
1119 | 1119 |
/* NVRAM helpers */ |
1120 |
static inline uint32_t nvram_read (nvram_t *nvram, uint32_t addr)
|
|
1120 |
static inline uint32_t nvram_read (a_nvram *nvram, uint32_t addr)
|
|
1121 | 1121 |
{ |
1122 | 1122 |
return (*nvram->read_fn)(nvram->opaque, addr);; |
1123 | 1123 |
} |
1124 | 1124 |
|
1125 |
static inline void nvram_write (nvram_t *nvram, uint32_t addr, uint32_t val)
|
|
1125 |
static inline void nvram_write (a_nvram *nvram, uint32_t addr, uint32_t val)
|
|
1126 | 1126 |
{ |
1127 | 1127 |
(*nvram->write_fn)(nvram->opaque, addr, val); |
1128 | 1128 |
} |
1129 | 1129 |
|
1130 |
void NVRAM_set_byte (nvram_t *nvram, uint32_t addr, uint8_t value)
|
|
1130 |
void NVRAM_set_byte (a_nvram *nvram, uint32_t addr, uint8_t value)
|
|
1131 | 1131 |
{ |
1132 | 1132 |
nvram_write(nvram, addr, value); |
1133 | 1133 |
} |
1134 | 1134 |
|
1135 |
uint8_t NVRAM_get_byte (nvram_t *nvram, uint32_t addr)
|
|
1135 |
uint8_t NVRAM_get_byte (a_nvram *nvram, uint32_t addr)
|
|
1136 | 1136 |
{ |
1137 | 1137 |
return nvram_read(nvram, addr); |
1138 | 1138 |
} |
1139 | 1139 |
|
1140 |
void NVRAM_set_word (nvram_t *nvram, uint32_t addr, uint16_t value)
|
|
1140 |
void NVRAM_set_word (a_nvram *nvram, uint32_t addr, uint16_t value)
|
|
1141 | 1141 |
{ |
1142 | 1142 |
nvram_write(nvram, addr, value >> 8); |
1143 | 1143 |
nvram_write(nvram, addr + 1, value & 0xFF); |
1144 | 1144 |
} |
1145 | 1145 |
|
1146 |
uint16_t NVRAM_get_word (nvram_t *nvram, uint32_t addr)
|
|
1146 |
uint16_t NVRAM_get_word (a_nvram *nvram, uint32_t addr)
|
|
1147 | 1147 |
{ |
1148 | 1148 |
uint16_t tmp; |
1149 | 1149 |
|
... | ... | |
1153 | 1153 |
return tmp; |
1154 | 1154 |
} |
1155 | 1155 |
|
1156 |
void NVRAM_set_lword (nvram_t *nvram, uint32_t addr, uint32_t value)
|
|
1156 |
void NVRAM_set_lword (a_nvram *nvram, uint32_t addr, uint32_t value)
|
|
1157 | 1157 |
{ |
1158 | 1158 |
nvram_write(nvram, addr, value >> 24); |
1159 | 1159 |
nvram_write(nvram, addr + 1, (value >> 16) & 0xFF); |
... | ... | |
1161 | 1161 |
nvram_write(nvram, addr + 3, value & 0xFF); |
1162 | 1162 |
} |
1163 | 1163 |
|
1164 |
uint32_t NVRAM_get_lword (nvram_t *nvram, uint32_t addr)
|
|
1164 |
uint32_t NVRAM_get_lword (a_nvram *nvram, uint32_t addr)
|
|
1165 | 1165 |
{ |
1166 | 1166 |
uint32_t tmp; |
1167 | 1167 |
|
... | ... | |
1173 | 1173 |
return tmp; |
1174 | 1174 |
} |
1175 | 1175 |
|
1176 |
void NVRAM_set_string (nvram_t *nvram, uint32_t addr,
|
|
1176 |
void NVRAM_set_string (a_nvram *nvram, uint32_t addr,
|
|
1177 | 1177 |
const char *str, uint32_t max) |
1178 | 1178 |
{ |
1179 | 1179 |
int i; |
... | ... | |
1185 | 1185 |
nvram_write(nvram, addr + max - 1, '\0'); |
1186 | 1186 |
} |
1187 | 1187 |
|
1188 |
int NVRAM_get_string (nvram_t *nvram, uint8_t *dst, uint16_t addr, int max)
|
|
1188 |
int NVRAM_get_string (a_nvram *nvram, uint8_t *dst, uint16_t addr, int max)
|
|
1189 | 1189 |
{ |
1190 | 1190 |
int i; |
1191 | 1191 |
|
... | ... | |
1214 | 1214 |
return tmp; |
1215 | 1215 |
} |
1216 | 1216 |
|
1217 |
static uint16_t NVRAM_compute_crc (nvram_t *nvram, uint32_t start, uint32_t count)
|
|
1217 |
static uint16_t NVRAM_compute_crc (a_nvram *nvram, uint32_t start, uint32_t count)
|
|
1218 | 1218 |
{ |
1219 | 1219 |
uint32_t i; |
1220 | 1220 |
uint16_t crc = 0xFFFF; |
... | ... | |
1234 | 1234 |
|
1235 | 1235 |
#define CMDLINE_ADDR 0x017ff000 |
1236 | 1236 |
|
1237 |
int PPC_NVRAM_set_params (nvram_t *nvram, uint16_t NVRAM_size,
|
|
1237 |
int PPC_NVRAM_set_params (a_nvram *nvram, uint16_t NVRAM_size,
|
|
1238 | 1238 |
const char *arch, |
1239 | 1239 |
uint32_t RAM_size, int boot_device, |
1240 | 1240 |
uint32_t kernel_image, uint32_t kernel_size, |
Also available in: Unified diff