@@ -22,6 +22,19 @@
static int testflag = 0;
+static void wait_for_flag(void)
+{
+ while (!testflag)
+ mb();
+}
+
+static void set_flag(int val)
+{
+ mb();
+ testflag = val;
+ mb();
+}
+
static void cpu_loop(void)
{
for (;;) {}
@@ -29,21 +42,19 @@ static void cpu_loop(void)
static void test_func(void)
{
- testflag = 1;
- mb();
+ set_flag(1);
cpu_loop();
}
static void test_start(void)
{
struct psw psw;
- psw.mask = extract_psw_mask();
+ psw.mask = extract_psw_mask();
psw.addr = (unsigned long)test_func;
+ set_flag(0);
smp_cpu_setup(1, psw);
- while (!testflag) {
- mb();
- }
+ wait_for_flag();
report(1, "start");
}
@@ -112,27 +123,27 @@ static void ecall(void)
mask = extract_psw_mask();
mask |= PSW_MASK_EXT;
load_psw_mask(mask);
- testflag = 1;
+ set_flag(1);
while (lc->ext_int_code != 0x1202) { mb(); }
report(1, "ecall");
- testflag= 1;
+ set_flag(1);
}
static void test_ecall(void)
{
struct psw psw;
- psw.mask = extract_psw_mask();
+ psw.mask = extract_psw_mask();
psw.addr = (unsigned long)ecall;
report_prefix_push("ecall");
- testflag= 0;
+ set_flag(0);
smp_cpu_destroy(1);
smp_cpu_setup(1, psw);
- while (!testflag) { mb(); }
- testflag= 0;
+ wait_for_flag();
+ set_flag(0);
sigp(1, SIGP_EXTERNAL_CALL, 0, NULL);
- while(!testflag) {mb();}
+ wait_for_flag();
smp_cpu_stop(1);
report_prefix_pop();
}
@@ -147,27 +158,27 @@ static void emcall(void)
mask = extract_psw_mask();
mask |= PSW_MASK_EXT;
load_psw_mask(mask);
- testflag= 1;
+ set_flag(1);
while (lc->ext_int_code != 0x1201) { mb(); }
report(1, "ecall");
- testflag = 1;
+ set_flag(1);
}
static void test_emcall(void)
{
struct psw psw;
- psw.mask = extract_psw_mask();
+ psw.mask = extract_psw_mask();
psw.addr = (unsigned long)emcall;
report_prefix_push("emcall");
- testflag= 0;
+ set_flag(0);
smp_cpu_destroy(1);
smp_cpu_setup(1, psw);
- while (!testflag) { mb(); }
- testflag= 0;
+ wait_for_flag();
+ set_flag(0);
sigp(1, SIGP_EMERGENCY_SIGNAL, 0, NULL);
- while(!testflag) { mb(); }
+ wait_for_flag();
smp_cpu_stop(1);
report_prefix_pop();
}
@@ -177,7 +188,7 @@ static void test_reset_initial(void)
struct cpu_status *status = alloc_pages(0);
struct psw psw;
- psw.mask = extract_psw_mask();
+ psw.mask = extract_psw_mask();
psw.addr = (unsigned long)test_func;
report_prefix_push("reset initial");
@@ -208,7 +219,7 @@ static void test_reset(void)
{
struct psw psw;
- psw.mask = extract_psw_mask();
+ psw.mask = extract_psw_mask();
psw.addr = (unsigned long)test_func;
report_prefix_push("cpu reset");