Commit 595e4f7e697e2e6fb252f6be6a83d5b9460b59a3
Committed by
Alexander Graf
1 parent
99dae3bad2
Exists in
master
and in
16 other branches
KVM: PPC: Book3S HV: Use load/store_fp_state functions in HV guest entry/exit
This modifies kvmppc_load_fp and kvmppc_save_fp to use the generic FP/VSX and VMX load/store functions instead of open-coding the FP/VSX/VMX load/store instructions. Since kvmppc_load/save_fp don't follow C calling conventions, we make them private symbols within book3s_hv_rmhandlers.S. Signed-off-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Alexander Graf <agraf@suse.de>
Showing 2 changed files with 22 additions and 66 deletions Side-by-side Diff
arch/powerpc/kernel/asm-offsets.c
... | ... | @@ -426,10 +426,8 @@ |
426 | 426 | DEFINE(VCPU_GPRS, offsetof(struct kvm_vcpu, arch.gpr)); |
427 | 427 | DEFINE(VCPU_VRSAVE, offsetof(struct kvm_vcpu, arch.vrsave)); |
428 | 428 | DEFINE(VCPU_FPRS, offsetof(struct kvm_vcpu, arch.fp.fpr)); |
429 | - DEFINE(VCPU_FPSCR, offsetof(struct kvm_vcpu, arch.fp.fpscr)); | |
430 | 429 | #ifdef CONFIG_ALTIVEC |
431 | 430 | DEFINE(VCPU_VRS, offsetof(struct kvm_vcpu, arch.vr.vr)); |
432 | - DEFINE(VCPU_VSCR, offsetof(struct kvm_vcpu, arch.vr.vscr)); | |
433 | 431 | #endif |
434 | 432 | DEFINE(VCPU_XER, offsetof(struct kvm_vcpu, arch.xer)); |
435 | 433 | DEFINE(VCPU_CTR, offsetof(struct kvm_vcpu, arch.ctr)); |
arch/powerpc/kvm/book3s_hv_rmhandlers.S
... | ... | @@ -1261,7 +1261,7 @@ |
1261 | 1261 | |
1262 | 1262 | /* save FP state */ |
1263 | 1263 | mr r3, r9 |
1264 | - bl .kvmppc_save_fp | |
1264 | + bl kvmppc_save_fp | |
1265 | 1265 | |
1266 | 1266 | /* Increment yield count if they have a VPA */ |
1267 | 1267 | ld r8, VCPU_VPA(r9) /* do they have a VPA? */ |
... | ... | @@ -1691,7 +1691,7 @@ |
1691 | 1691 | std r31, VCPU_GPR(R31)(r3) |
1692 | 1692 | |
1693 | 1693 | /* save FP state */ |
1694 | - bl .kvmppc_save_fp | |
1694 | + bl kvmppc_save_fp | |
1695 | 1695 | |
1696 | 1696 | /* |
1697 | 1697 | * Take a nap until a decrementer or external interrupt occurs, |
1698 | 1698 | |
... | ... | @@ -1869,8 +1869,12 @@ |
1869 | 1869 | /* |
1870 | 1870 | * Save away FP, VMX and VSX registers. |
1871 | 1871 | * r3 = vcpu pointer |
1872 | + * N.B. r30 and r31 are volatile across this function, | |
1873 | + * thus it is not callable from C. | |
1872 | 1874 | */ |
1873 | -_GLOBAL(kvmppc_save_fp) | |
1875 | +kvmppc_save_fp: | |
1876 | + mflr r30 | |
1877 | + mr r31,r3 | |
1874 | 1878 | mfmsr r5 |
1875 | 1879 | ori r8,r5,MSR_FP |
1876 | 1880 | #ifdef CONFIG_ALTIVEC |
1877 | 1881 | |
1878 | 1882 | |
... | ... | @@ -1885,42 +1889,17 @@ |
1885 | 1889 | #endif |
1886 | 1890 | mtmsrd r8 |
1887 | 1891 | isync |
1888 | -#ifdef CONFIG_VSX | |
1889 | -BEGIN_FTR_SECTION | |
1890 | - reg = 0 | |
1891 | - .rept 32 | |
1892 | - li r6,reg*16+VCPU_FPRS | |
1893 | - STXVD2X(reg,R6,R3) | |
1894 | - reg = reg + 1 | |
1895 | - .endr | |
1896 | -FTR_SECTION_ELSE | |
1897 | -#endif | |
1898 | - reg = 0 | |
1899 | - .rept 32 | |
1900 | - stfd reg,reg*8+VCPU_FPRS(r3) | |
1901 | - reg = reg + 1 | |
1902 | - .endr | |
1903 | -#ifdef CONFIG_VSX | |
1904 | -ALT_FTR_SECTION_END_IFSET(CPU_FTR_VSX) | |
1905 | -#endif | |
1906 | - mffs fr0 | |
1907 | - stfd fr0,VCPU_FPSCR(r3) | |
1908 | - | |
1892 | + addi r3,r3,VCPU_FPRS | |
1893 | + bl .store_fp_state | |
1909 | 1894 | #ifdef CONFIG_ALTIVEC |
1910 | 1895 | BEGIN_FTR_SECTION |
1911 | - reg = 0 | |
1912 | - .rept 32 | |
1913 | - li r6,reg*16+VCPU_VRS | |
1914 | - stvx reg,r6,r3 | |
1915 | - reg = reg + 1 | |
1916 | - .endr | |
1917 | - mfvscr vr0 | |
1918 | - li r6,VCPU_VSCR | |
1919 | - stvx vr0,r6,r3 | |
1896 | + addi r3,r31,VCPU_VRS | |
1897 | + bl .store_vr_state | |
1920 | 1898 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) |
1921 | 1899 | #endif |
1922 | 1900 | mfspr r6,SPRN_VRSAVE |
1923 | 1901 | stw r6,VCPU_VRSAVE(r3) |
1902 | + mtlr r30 | |
1924 | 1903 | mtmsrd r5 |
1925 | 1904 | isync |
1926 | 1905 | blr |
1927 | 1906 | |
1928 | 1907 | |
... | ... | @@ -1928,9 +1907,12 @@ |
1928 | 1907 | /* |
1929 | 1908 | * Load up FP, VMX and VSX registers |
1930 | 1909 | * r4 = vcpu pointer |
1910 | + * N.B. r30 and r31 are volatile across this function, | |
1911 | + * thus it is not callable from C. | |
1931 | 1912 | */ |
1932 | - .globl kvmppc_load_fp | |
1933 | 1913 | kvmppc_load_fp: |
1914 | + mflr r30 | |
1915 | + mr r31,r4 | |
1934 | 1916 | mfmsr r9 |
1935 | 1917 | ori r8,r9,MSR_FP |
1936 | 1918 | #ifdef CONFIG_ALTIVEC |
1937 | 1919 | |
1938 | 1920 | |
... | ... | @@ -1945,42 +1927,18 @@ |
1945 | 1927 | #endif |
1946 | 1928 | mtmsrd r8 |
1947 | 1929 | isync |
1948 | - lfd fr0,VCPU_FPSCR(r4) | |
1949 | - MTFSF_L(fr0) | |
1950 | -#ifdef CONFIG_VSX | |
1951 | -BEGIN_FTR_SECTION | |
1952 | - reg = 0 | |
1953 | - .rept 32 | |
1954 | - li r7,reg*16+VCPU_FPRS | |
1955 | - LXVD2X(reg,R7,R4) | |
1956 | - reg = reg + 1 | |
1957 | - .endr | |
1958 | -FTR_SECTION_ELSE | |
1959 | -#endif | |
1960 | - reg = 0 | |
1961 | - .rept 32 | |
1962 | - lfd reg,reg*8+VCPU_FPRS(r4) | |
1963 | - reg = reg + 1 | |
1964 | - .endr | |
1965 | -#ifdef CONFIG_VSX | |
1966 | -ALT_FTR_SECTION_END_IFSET(CPU_FTR_VSX) | |
1967 | -#endif | |
1968 | - | |
1930 | + addi r3,r4,VCPU_FPRS | |
1931 | + bl .load_fp_state | |
1969 | 1932 | #ifdef CONFIG_ALTIVEC |
1970 | 1933 | BEGIN_FTR_SECTION |
1971 | - li r7,VCPU_VSCR | |
1972 | - lvx vr0,r7,r4 | |
1973 | - mtvscr vr0 | |
1974 | - reg = 0 | |
1975 | - .rept 32 | |
1976 | - li r7,reg*16+VCPU_VRS | |
1977 | - lvx reg,r7,r4 | |
1978 | - reg = reg + 1 | |
1979 | - .endr | |
1934 | + addi r3,r31,VCPU_VRS | |
1935 | + bl .load_vr_state | |
1980 | 1936 | END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) |
1981 | 1937 | #endif |
1982 | 1938 | lwz r7,VCPU_VRSAVE(r4) |
1983 | 1939 | mtspr SPRN_VRSAVE,r7 |
1940 | + mtlr r30 | |
1941 | + mr r4,r31 | |
1984 | 1942 | blr |
1985 | 1943 | |
1986 | 1944 | /* |