Skip to content

Commit 0fca5b2

Browse files
Add option to skip memtest in SRM
Previously the memtest was always skipped
1 parent 120575a commit 0fca5b2

File tree

3 files changed

+63
-59
lines changed

3 files changed

+63
-59
lines changed

src/AlphaCPU.cpp

Lines changed: 42 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ void CAlphaCPU::init() {
399399
icache_enabled = true;
400400
flush_icache();
401401
icache_enabled = myCfg->get_bool_value("icache", false);
402+
skip_memtest_hack = myCfg->get_bool_value("skip_memtest_hack", false);
402403

403404
tbia(ACCESS_READ);
404405
tbia(ACCESS_EXEC);
@@ -560,75 +561,57 @@ void CAlphaCPU::check_state() {
560561
return;
561562
}
562563

563-
inline void CAlphaCPU::skip_memtest()
564-
{
565-
if (!(state.current_pc & U64(0x8b000)))
566-
{
567-
return;
568-
}
564+
/**
565+
* Skip SRM memtest.
566+
*
567+
* Hack that skips memory check in SRM.
568+
**/
569+
inline void CAlphaCPU::skip_memtest() {
570+
if (!(state.current_pc & U64(0x8b000))) {
571+
return;
572+
}
569573

570-
if (state.current_pc == U64(0x8bb90))
571-
{
572-
if (state.r[5] != U64(0xaaaaaaaaaaaaaaaa))
573-
{
574-
printf("wrong memory check skip!\n");
575-
}
576-
else
577-
{
578-
state.r[0] = state.r[4];
579-
}
574+
if (state.current_pc == U64(0x8bb90)) {
575+
if (state.r[5] != U64(0xaaaaaaaaaaaaaaaa)) {
576+
printf("wrong memory check skip!\n");
577+
} else {
578+
state.r[0] = state.r[4];
580579
}
580+
}
581581

582-
if (state.current_pc == U64(0x8bbe0))
583-
{
584-
if (state.r[5] != U64(0xaaaaaaaaaaaaaaaa))
585-
{
586-
printf("wrong memory check skip!\n");
587-
}
588-
else
589-
{
590-
state.r[16] = 0;
591-
}
582+
if (state.current_pc == U64(0x8bbe0)) {
583+
if (state.r[5] != U64(0xaaaaaaaaaaaaaaaa)) {
584+
printf("wrong memory check skip!\n");
585+
} else {
586+
state.r[16] = 0;
592587
}
588+
}
593589

594-
if (state.current_pc == U64(0x8bc28))
595-
{
596-
if (state.r[5] != U64(0xaaaaaaaaaaaaaaaa))
597-
{
598-
printf("wrong memory check skip!\n");
599-
}
600-
else
601-
{
602-
state.r[8] = state.r[4];
603-
}
590+
if (state.current_pc == U64(0x8bc28)) {
591+
if (state.r[5] != U64(0xaaaaaaaaaaaaaaaa)) {
592+
printf("wrong memory check skip!\n");
593+
} else {
594+
state.r[8] = state.r[4];
604595
}
596+
}
605597

606-
if (state.current_pc == U64(0x8bc70))
607-
{
608-
if (state.r[7] != U64(0x5555555555555555))
609-
{
610-
printf("wrong memory check skip1!\n");
611-
}
612-
else
613-
{
614-
state.r[0] = 0;
615-
}
598+
if (state.current_pc == U64(0x8bc70)) {
599+
if (state.r[7] != U64(0x5555555555555555)) {
600+
printf("wrong memory check skip1!\n");
601+
} else {
602+
state.r[0] = 0;
616603
}
604+
}
617605

618-
if (state.current_pc == U64(0x8bcb0))
619-
{
620-
if (state.r[7] != U64(0x5555555555555555))
621-
{
622-
printf("wrong memory check skip2!\n");
623-
}
624-
else
625-
{
626-
state.r[3] = state.r[4];
627-
}
606+
if (state.current_pc == U64(0x8bcb0)) {
607+
if (state.r[7] != U64(0x5555555555555555)) {
608+
printf("wrong memory check skip2!\n");
609+
} else {
610+
state.r[3] = state.r[4];
628611
}
612+
}
629613
}
630614

631-
632615
/**
633616
* \brief Called each clock-cycle.
634617
*
@@ -682,7 +665,8 @@ void CAlphaCPU::execute() {
682665
#endif
683666
state.current_pc = state.pc;
684667

685-
skip_memtest();
668+
if (skip_memtest_hack)
669+
skip_memtest();
686670

687671
// Service interrupts
688672
if (DO_ACTION) {

src/AlphaCPU.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ class CAlphaCPU : public CSystemComponent, public CRunnable {
423423
int vmspal_int_initiate_interrupt();
424424

425425
bool icache_enabled;
426+
bool skip_memtest_hack;
426427

427428
// ... ... ...
428429
u64 cc_large;
@@ -565,7 +566,7 @@ class CAlphaCPU : public CSystemComponent, public CRunnable {
565566
u64 last_write_loc;
566567
#endif
567568

568-
void skip_memtest();
569+
void skip_memtest();
569570
};
570571

571572
/** Translate raw register (0..31) number to a number that takes PALshadow

src/es40-cfg.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,23 @@ int main_cfg(int argc, char *argv[]) {
444444

445445
icache_q.ask();
446446

447+
MultipleChoiceQuestion skip_memtest_hack_q;
448+
449+
skip_memtest_hack_q.setQuestion("Do you want to skip memtest on SRM start?");
450+
skip_memtest_hack_q.setExplanation(
451+
"This makes startup significantly faster, but may not work with some "
452+
"versions of the firmware.");
453+
skip_memtest_hack_q.setDefault("no");
454+
skip_memtest_hack_q.addAnswer(
455+
"yes", "true",
456+
"Skip memtest hack enabled. CPU detects the instruction pointer where "
457+
"the memtest starts and skips it.");
458+
skip_memtest_hack_q.addAnswer("no", "false",
459+
"Skip memtest hack disabled. Firmware checks "
460+
"all available memory on startup.");
461+
462+
skip_memtest_hack_q.ask();
463+
447464
NumberQuestion mhz_q;
448465

449466
mhz_q.setQuestion("What should the reported speed of the CPU's be in MHz?");
@@ -462,6 +479,8 @@ int main_cfg(int argc, char *argv[]) {
462479
os << " {\n";
463480
os << " speed = " << mhz_q.getAnswer() << "M;\n";
464481
os << " icache = " << icache_q.getAnswer() << ";\n";
482+
os << " skip_memtest_hack = " << skip_memtest_hack_q.getAnswer()
483+
<< ";\n";
465484
os << " }\n\n";
466485
}
467486

0 commit comments

Comments
 (0)