Commit e1d4294a4534ef0c14fa83e958f352f5f783e931
1 parent
c3c7c292
more tests
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@51 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
79 additions
and
0 deletions
tests/test-i386.c
| ... | ... | @@ -714,6 +714,10 @@ void test_segs(void) |
| 714 | 714 | long long ldt_table[3]; |
| 715 | 715 | int res, res2; |
| 716 | 716 | char tmp; |
| 717 | + struct { | |
| 718 | + uint32_t offset; | |
| 719 | + uint16_t seg; | |
| 720 | + } __attribute__((packed)) segoff; | |
| 717 | 721 | |
| 718 | 722 | ldt.entry_number = 1; |
| 719 | 723 | ldt.base_addr = (unsigned long)&seg_data1; |
| ... | ... | @@ -772,6 +776,14 @@ void test_segs(void) |
| 772 | 776 | : "r" (MK_SEL(1)), "r" (&tmp)); |
| 773 | 777 | printf("DS[1] = %02x\n", res); |
| 774 | 778 | printf("SS[tmp] = %02x\n", res2); |
| 779 | + | |
| 780 | + segoff.seg = MK_SEL(2); | |
| 781 | + segoff.offset = 0xabcdef12; | |
| 782 | + asm volatile("lfs %2, %0\n\t" | |
| 783 | + "movl %%fs, %1\n\t" | |
| 784 | + : "=r" (res), "=g" (res2) | |
| 785 | + : "m" (segoff)); | |
| 786 | + printf("FS:reg = %04x:%08x\n", res2, res); | |
| 775 | 787 | } |
| 776 | 788 | |
| 777 | 789 | /* 16 bit code test */ |
| ... | ... | @@ -812,6 +824,71 @@ void test_code16(void) |
| 812 | 824 | printf("func3() = 0x%08x\n", res); |
| 813 | 825 | } |
| 814 | 826 | |
| 827 | +void test_misc(void) | |
| 828 | +{ | |
| 829 | + char table[256]; | |
| 830 | + int res, i; | |
| 831 | + | |
| 832 | + for(i=0;i<256;i++) table[i] = 256 - i; | |
| 833 | + res = 0x12345678; | |
| 834 | + asm ("xlat" : "=a" (res) : "b" (table), "0" (res)); | |
| 835 | + printf("xlat: EAX=%08x\n", res); | |
| 836 | +} | |
| 837 | + | |
| 838 | +uint8_t str_buffer[4096]; | |
| 839 | + | |
| 840 | +#define TEST_STRING1(OP, size, DF, REP)\ | |
| 841 | +{\ | |
| 842 | + int esi, edi, eax, ecx, eflags;\ | |
| 843 | +\ | |
| 844 | + esi = (long)(str_buffer + sizeof(str_buffer) / 2);\ | |
| 845 | + edi = (long)(str_buffer + sizeof(str_buffer) / 2) + 16;\ | |
| 846 | + eax = 0x12345678;\ | |
| 847 | + ecx = 17;\ | |
| 848 | +\ | |
| 849 | + asm volatile ("pushl $0\n\t"\ | |
| 850 | + "popf\n\t"\ | |
| 851 | + DF "\n\t"\ | |
| 852 | + REP #OP size "\n\t"\ | |
| 853 | + "cld\n\t"\ | |
| 854 | + "pushf\n\t"\ | |
| 855 | + "popl %4\n\t"\ | |
| 856 | + : "=S" (esi), "=D" (edi), "=a" (eax), "=c" (ecx), "=g" (eflags)\ | |
| 857 | + : "0" (esi), "1" (edi), "2" (eax), "3" (ecx));\ | |
| 858 | + printf("%-10s ESI=%08x EDI=%08x EAX=%08x ECX=%08x EFL=%04x\n",\ | |
| 859 | + REP #OP size, esi, edi, eax, ecx,\ | |
| 860 | + eflags & (CC_C | CC_P | CC_Z | CC_S | CC_O | CC_A));\ | |
| 861 | +} | |
| 862 | + | |
| 863 | +#define TEST_STRING(OP, REP)\ | |
| 864 | + TEST_STRING1(OP, "b", "", REP);\ | |
| 865 | + TEST_STRING1(OP, "w", "", REP);\ | |
| 866 | + TEST_STRING1(OP, "l", "", REP);\ | |
| 867 | + TEST_STRING1(OP, "b", "std", REP);\ | |
| 868 | + TEST_STRING1(OP, "w", "std", REP);\ | |
| 869 | + TEST_STRING1(OP, "l", "std", REP) | |
| 870 | + | |
| 871 | +void test_string(void) | |
| 872 | +{ | |
| 873 | + int i; | |
| 874 | + for(i = 0;i < sizeof(str_buffer); i++) | |
| 875 | + str_buffer[i] = i + 0x56; | |
| 876 | + TEST_STRING(stos, ""); | |
| 877 | + TEST_STRING(stos, "rep "); | |
| 878 | + TEST_STRING(lods, ""); /* to verify stos */ | |
| 879 | + TEST_STRING(lods, "rep "); | |
| 880 | + TEST_STRING(movs, ""); | |
| 881 | + TEST_STRING(movs, "rep "); | |
| 882 | + TEST_STRING(lods, ""); /* to verify stos */ | |
| 883 | + | |
| 884 | + /* XXX: better tests */ | |
| 885 | + TEST_STRING(scas, ""); | |
| 886 | + TEST_STRING(scas, "repz "); | |
| 887 | + TEST_STRING(scas, "repnz "); | |
| 888 | + TEST_STRING(cmps, ""); | |
| 889 | + TEST_STRING(cmps, "repz "); | |
| 890 | + TEST_STRING(cmps, "repnz "); | |
| 891 | +} | |
| 815 | 892 | |
| 816 | 893 | static void *call_end __init_call = NULL; |
| 817 | 894 | |
| ... | ... | @@ -831,6 +908,8 @@ int main(int argc, char **argv) |
| 831 | 908 | test_floats(); |
| 832 | 909 | test_bcd(); |
| 833 | 910 | test_xchg(); |
| 911 | + test_string(); | |
| 912 | + test_misc(); | |
| 834 | 913 | test_lea(); |
| 835 | 914 | test_segs(); |
| 836 | 915 | test_code16(); | ... | ... |