|
5 | 5 | #ifndef _ASM_POWERPC_GUEST_STATE_BUFFER_H
|
6 | 6 | #define _ASM_POWERPC_GUEST_STATE_BUFFER_H
|
7 | 7 |
|
| 8 | +#include "asm/hvcall.h" |
8 | 9 | #include <linux/gfp.h>
|
9 | 10 | #include <linux/bitmap.h>
|
10 | 11 | #include <asm/plpar_wrappers.h>
|
@@ -313,6 +314,8 @@ struct kvmppc_gs_buff *kvmppc_gsb_new(size_t size, unsigned long guest_id,
|
313 | 314 | unsigned long vcpu_id, gfp_t flags);
|
314 | 315 | void kvmppc_gsb_free(struct kvmppc_gs_buff *gsb);
|
315 | 316 | void *kvmppc_gsb_put(struct kvmppc_gs_buff *gsb, size_t size);
|
| 317 | +int kvmppc_gsb_send(struct kvmppc_gs_buff *gsb, unsigned long flags); |
| 318 | +int kvmppc_gsb_recv(struct kvmppc_gs_buff *gsb, unsigned long flags); |
316 | 319 |
|
317 | 320 | /**
|
318 | 321 | * kvmppc_gsb_header() - the header of a guest state buffer
|
@@ -901,4 +904,92 @@ static inline void kvmppc_gsm_reset(struct kvmppc_gs_msg *gsm)
|
901 | 904 | kvmppc_gsbm_zero(&gsm->bitmap);
|
902 | 905 | }
|
903 | 906 |
|
| 907 | +/** |
| 908 | + * kvmppc_gsb_receive_data - flexibly update values from a guest state buffer |
| 909 | + * @gsb: guest state buffer |
| 910 | + * @gsm: guest state message |
| 911 | + * |
| 912 | + * Requests updated values for the guest state values included in the guest |
| 913 | + * state message. The guest state message will then deserialize the guest state |
| 914 | + * buffer. |
| 915 | + */ |
| 916 | +static inline int kvmppc_gsb_receive_data(struct kvmppc_gs_buff *gsb, |
| 917 | + struct kvmppc_gs_msg *gsm) |
| 918 | +{ |
| 919 | + int rc; |
| 920 | + |
| 921 | + kvmppc_gsb_reset(gsb); |
| 922 | + rc = kvmppc_gsm_fill_info(gsm, gsb); |
| 923 | + if (rc < 0) |
| 924 | + return rc; |
| 925 | + |
| 926 | + rc = kvmppc_gsb_recv(gsb, gsm->flags); |
| 927 | + if (rc < 0) |
| 928 | + return rc; |
| 929 | + |
| 930 | + rc = kvmppc_gsm_refresh_info(gsm, gsb); |
| 931 | + if (rc < 0) |
| 932 | + return rc; |
| 933 | + return 0; |
| 934 | +} |
| 935 | + |
| 936 | +/** |
| 937 | + * kvmppc_gsb_recv - receive a single guest state ID |
| 938 | + * @gsb: guest state buffer |
| 939 | + * @gsm: guest state message |
| 940 | + * @iden: guest state identity |
| 941 | + */ |
| 942 | +static inline int kvmppc_gsb_receive_datum(struct kvmppc_gs_buff *gsb, |
| 943 | + struct kvmppc_gs_msg *gsm, u16 iden) |
| 944 | +{ |
| 945 | + int rc; |
| 946 | + |
| 947 | + kvmppc_gsm_include(gsm, iden); |
| 948 | + rc = kvmppc_gsb_receive_data(gsb, gsm); |
| 949 | + if (rc < 0) |
| 950 | + return rc; |
| 951 | + kvmppc_gsm_reset(gsm); |
| 952 | + return 0; |
| 953 | +} |
| 954 | + |
| 955 | +/** |
| 956 | + * kvmppc_gsb_send_data - flexibly send values from a guest state buffer |
| 957 | + * @gsb: guest state buffer |
| 958 | + * @gsm: guest state message |
| 959 | + * |
| 960 | + * Sends the guest state values included in the guest state message. |
| 961 | + */ |
| 962 | +static inline int kvmppc_gsb_send_data(struct kvmppc_gs_buff *gsb, |
| 963 | + struct kvmppc_gs_msg *gsm) |
| 964 | +{ |
| 965 | + int rc; |
| 966 | + |
| 967 | + kvmppc_gsb_reset(gsb); |
| 968 | + rc = kvmppc_gsm_fill_info(gsm, gsb); |
| 969 | + if (rc < 0) |
| 970 | + return rc; |
| 971 | + rc = kvmppc_gsb_send(gsb, gsm->flags); |
| 972 | + |
| 973 | + return rc; |
| 974 | +} |
| 975 | + |
| 976 | +/** |
| 977 | + * kvmppc_gsb_recv - send a single guest state ID |
| 978 | + * @gsb: guest state buffer |
| 979 | + * @gsm: guest state message |
| 980 | + * @iden: guest state identity |
| 981 | + */ |
| 982 | +static inline int kvmppc_gsb_send_datum(struct kvmppc_gs_buff *gsb, |
| 983 | + struct kvmppc_gs_msg *gsm, u16 iden) |
| 984 | +{ |
| 985 | + int rc; |
| 986 | + |
| 987 | + kvmppc_gsm_include(gsm, iden); |
| 988 | + rc = kvmppc_gsb_send_data(gsb, gsm); |
| 989 | + if (rc < 0) |
| 990 | + return rc; |
| 991 | + kvmppc_gsm_reset(gsm); |
| 992 | + return 0; |
| 993 | +} |
| 994 | + |
904 | 995 | #endif /* _ASM_POWERPC_GUEST_STATE_BUFFER_H */
|
0 commit comments