@@ -183,6 +183,19 @@ void test_pop(void *mem)
report("ret", 1);
}
+void test_ljmp(void *mem)
+{
+ unsigned char *m = mem;
+ volatile int res = 1;
+
+ *(unsigned long**)m = &&jmpf;
+ asm volatile ("data16/mov %%cs, %0":"=m"(*(m + sizeof(unsigned long))));
+ asm volatile ("rex64/ljmp *%0"::"m"(*m));
+ res = 0;
+jmpf:
+ report("ljmp", res);
+}
+
unsigned long read_cr0(void)
{
unsigned long cr0;
@@ -258,6 +271,7 @@ int main()
test_smsw();
test_lmsw();
+ test_ljmp(mem);
printf("\nSUMMARY: %d tests, %d failures\n", tests, fails);
return fails ? 1 : 0;