File Index
Files and directories
Sign in
FILE

guest-state-buffer.h

File preview with syntax highlighting.

linux-6.19.14/arch/powerpc/include/asm/guest-state-buffer.h C
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Interface based on include/net/netlink.h
   4 */
   5#ifndef _ASM_POWERPC_GUEST_STATE_BUFFER_H
   6#define _ASM_POWERPC_GUEST_STATE_BUFFER_H
   7
   8#include "asm/hvcall.h"
   9#include <linux/gfp.h>
  10#include <linux/bitmap.h>
  11#include <asm/plpar_wrappers.h>
  12
  13/**************************************************************************
  14 * Guest State Buffer Constants
  15 **************************************************************************/
  16/* Element without a value and any length */
  17#define KVMPPC_GSID_BLANK			0x0000
  18/* Size required for the L0's internal VCPU representation */
  19#define KVMPPC_GSID_HOST_STATE_SIZE		0x0001
  20 /* Minimum size for the H_GUEST_RUN_VCPU output buffer */
  21#define KVMPPC_GSID_RUN_OUTPUT_MIN_SIZE		0x0002
  22 /* "Logical" PVR value as defined in the PAPR */
  23#define KVMPPC_GSID_LOGICAL_PVR			0x0003
  24 /* L0 relative timebase offset */
  25#define KVMPPC_GSID_TB_OFFSET			0x0004
  26 /* Partition Scoped Page Table Info */
  27#define KVMPPC_GSID_PARTITION_TABLE		0x0005
  28 /* Process Table Info */
  29#define KVMPPC_GSID_PROCESS_TABLE		0x0006
  30
  31/* Guest Management Heap Size */
  32#define KVMPPC_GSID_L0_GUEST_HEAP		0x0800
  33
  34/* Guest Management Heap Max Size */
  35#define KVMPPC_GSID_L0_GUEST_HEAP_MAX		0x0801
  36
  37/* Guest Pagetable Size */
  38#define KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE	0x0802
  39
  40/* Guest Pagetable Max Size */
  41#define KVMPPC_GSID_L0_GUEST_PGTABLE_SIZE_MAX	0x0803
  42
  43/* Guest Pagetable Reclaim in bytes */
  44#define KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM	0x0804
  45
  46/* H_GUEST_RUN_VCPU input buffer Info */
  47#define KVMPPC_GSID_RUN_INPUT			0x0C00
  48/* H_GUEST_RUN_VCPU output buffer Info */
  49#define KVMPPC_GSID_RUN_OUTPUT			0x0C01
  50#define KVMPPC_GSID_VPA				0x0C02
  51
  52#define KVMPPC_GSID_GPR(x)			(0x1000 + (x))
  53#define KVMPPC_GSID_HDEC_EXPIRY_TB		0x1020
  54#define KVMPPC_GSID_NIA				0x1021
  55#define KVMPPC_GSID_MSR				0x1022
  56#define KVMPPC_GSID_LR				0x1023
  57#define KVMPPC_GSID_XER				0x1024
  58#define KVMPPC_GSID_CTR				0x1025
  59#define KVMPPC_GSID_CFAR			0x1026
  60#define KVMPPC_GSID_SRR0			0x1027
  61#define KVMPPC_GSID_SRR1			0x1028
  62#define KVMPPC_GSID_DAR				0x1029
  63#define KVMPPC_GSID_DEC_EXPIRY_TB		0x102A
  64#define KVMPPC_GSID_VTB				0x102B
  65#define KVMPPC_GSID_LPCR			0x102C
  66#define KVMPPC_GSID_HFSCR			0x102D
  67#define KVMPPC_GSID_FSCR			0x102E
  68#define KVMPPC_GSID_FPSCR			0x102F
  69#define KVMPPC_GSID_DAWR0			0x1030
  70#define KVMPPC_GSID_DAWR1			0x1031
  71#define KVMPPC_GSID_CIABR			0x1032
  72#define KVMPPC_GSID_PURR			0x1033
  73#define KVMPPC_GSID_SPURR			0x1034
  74#define KVMPPC_GSID_IC				0x1035
  75#define KVMPPC_GSID_SPRG0			0x1036
  76#define KVMPPC_GSID_SPRG1			0x1037
  77#define KVMPPC_GSID_SPRG2			0x1038
  78#define KVMPPC_GSID_SPRG3			0x1039
  79#define KVMPPC_GSID_PPR				0x103A
  80#define KVMPPC_GSID_MMCR(x)			(0x103B + (x))
  81#define KVMPPC_GSID_MMCRA			0x103F
  82#define KVMPPC_GSID_SIER(x)			(0x1040 + (x))
  83#define KVMPPC_GSID_BESCR			0x1043
  84#define KVMPPC_GSID_EBBHR			0x1044
  85#define KVMPPC_GSID_EBBRR			0x1045
  86#define KVMPPC_GSID_AMR				0x1046
  87#define KVMPPC_GSID_IAMR			0x1047
  88#define KVMPPC_GSID_AMOR			0x1048
  89#define KVMPPC_GSID_UAMOR			0x1049
  90#define KVMPPC_GSID_SDAR			0x104A
  91#define KVMPPC_GSID_SIAR			0x104B
  92#define KVMPPC_GSID_DSCR			0x104C
  93#define KVMPPC_GSID_TAR				0x104D
  94#define KVMPPC_GSID_DEXCR			0x104E
  95#define KVMPPC_GSID_HDEXCR			0x104F
  96#define KVMPPC_GSID_HASHKEYR			0x1050
  97#define KVMPPC_GSID_HASHPKEYR			0x1051
  98#define KVMPPC_GSID_CTRL			0x1052
  99#define KVMPPC_GSID_DPDES			0x1053
 100
 101#define KVMPPC_GSID_CR				0x2000
 102#define KVMPPC_GSID_PIDR			0x2001
 103#define KVMPPC_GSID_DSISR			0x2002
 104#define KVMPPC_GSID_VSCR			0x2003
 105#define KVMPPC_GSID_VRSAVE			0x2004
 106#define KVMPPC_GSID_DAWRX0			0x2005
 107#define KVMPPC_GSID_DAWRX1			0x2006
 108#define KVMPPC_GSID_PMC(x)			(0x2007 + (x))
 109#define KVMPPC_GSID_WORT			0x200D
 110#define KVMPPC_GSID_PSPB			0x200E
 111
 112#define KVMPPC_GSID_VSRS(x)			(0x3000 + (x))
 113
 114#define KVMPPC_GSID_HDAR			0xF000
 115#define KVMPPC_GSID_HDSISR			0xF001
 116#define KVMPPC_GSID_HEIR			0xF002
 117#define KVMPPC_GSID_ASDR			0xF003
 118
 119#define KVMPPC_GSE_GUESTWIDE_START KVMPPC_GSID_BLANK
 120#define KVMPPC_GSE_GUESTWIDE_END KVMPPC_GSID_PROCESS_TABLE
 121#define KVMPPC_GSE_GUESTWIDE_COUNT \
 122	(KVMPPC_GSE_GUESTWIDE_END - KVMPPC_GSE_GUESTWIDE_START + 1)
 123
 124#define KVMPPC_GSE_HOSTWIDE_START KVMPPC_GSID_L0_GUEST_HEAP
 125#define KVMPPC_GSE_HOSTWIDE_END KVMPPC_GSID_L0_GUEST_PGTABLE_RECLAIM
 126#define KVMPPC_GSE_HOSTWIDE_COUNT \
 127	(KVMPPC_GSE_HOSTWIDE_END - KVMPPC_GSE_HOSTWIDE_START + 1)
 128
 129#define KVMPPC_GSE_META_START KVMPPC_GSID_RUN_INPUT
 130#define KVMPPC_GSE_META_END KVMPPC_GSID_VPA
 131#define KVMPPC_GSE_META_COUNT (KVMPPC_GSE_META_END - KVMPPC_GSE_META_START + 1)
 132
 133#define KVMPPC_GSE_DW_REGS_START KVMPPC_GSID_GPR(0)
 134#define KVMPPC_GSE_DW_REGS_END KVMPPC_GSID_DPDES
 135#define KVMPPC_GSE_DW_REGS_COUNT \
 136	(KVMPPC_GSE_DW_REGS_END - KVMPPC_GSE_DW_REGS_START + 1)
 137
 138#define KVMPPC_GSE_W_REGS_START KVMPPC_GSID_CR
 139#define KVMPPC_GSE_W_REGS_END KVMPPC_GSID_PSPB
 140#define KVMPPC_GSE_W_REGS_COUNT \
 141	(KVMPPC_GSE_W_REGS_END - KVMPPC_GSE_W_REGS_START + 1)
 142
 143#define KVMPPC_GSE_VSRS_START KVMPPC_GSID_VSRS(0)
 144#define KVMPPC_GSE_VSRS_END KVMPPC_GSID_VSRS(63)
 145#define KVMPPC_GSE_VSRS_COUNT (KVMPPC_GSE_VSRS_END - KVMPPC_GSE_VSRS_START + 1)
 146
 147#define KVMPPC_GSE_INTR_REGS_START KVMPPC_GSID_HDAR
 148#define KVMPPC_GSE_INTR_REGS_END KVMPPC_GSID_ASDR
 149#define KVMPPC_GSE_INTR_REGS_COUNT \
 150	(KVMPPC_GSE_INTR_REGS_END - KVMPPC_GSE_INTR_REGS_START + 1)
 151
 152#define KVMPPC_GSE_IDEN_COUNT                                 \
 153	(KVMPPC_GSE_HOSTWIDE_COUNT + \
 154	 KVMPPC_GSE_GUESTWIDE_COUNT + KVMPPC_GSE_META_COUNT + \
 155	 KVMPPC_GSE_DW_REGS_COUNT + KVMPPC_GSE_W_REGS_COUNT + \
 156	 KVMPPC_GSE_VSRS_COUNT + KVMPPC_GSE_INTR_REGS_COUNT)
 157
 158/**
 159 * Ranges of guest state buffer elements
 160 */
 161enum {
 162	KVMPPC_GS_CLASS_GUESTWIDE = 0x01,
 163	KVMPPC_GS_CLASS_HOSTWIDE = 0x02,
 164	KVMPPC_GS_CLASS_META = 0x04,
 165	KVMPPC_GS_CLASS_DWORD_REG = 0x08,
 166	KVMPPC_GS_CLASS_WORD_REG = 0x10,
 167	KVMPPC_GS_CLASS_VECTOR = 0x18,
 168	KVMPPC_GS_CLASS_INTR = 0x20,
 169};
 170
 171/**
 172 * Types of guest state buffer elements
 173 */
 174enum {
 175	KVMPPC_GSE_BE32,
 176	KVMPPC_GSE_BE64,
 177	KVMPPC_GSE_VEC128,
 178	KVMPPC_GSE_PARTITION_TABLE,
 179	KVMPPC_GSE_PROCESS_TABLE,
 180	KVMPPC_GSE_BUFFER,
 181	__KVMPPC_GSE_TYPE_MAX,
 182};
 183
 184/**
 185 * Flags for guest state elements
 186 */
 187enum {
 188	KVMPPC_GS_FLAGS_WIDE = 0x01,
 189	KVMPPC_GS_FLAGS_HOST_WIDE = 0x02,
 190};
 191
 192/**
 193 * struct kvmppc_gs_part_table - deserialized partition table information
 194 * element
 195 * @address: start of the partition table
 196 * @ea_bits: number of bits in the effective address
 197 * @gpd_size: root page directory size
 198 */
 199struct kvmppc_gs_part_table {
 200	u64 address;
 201	u64 ea_bits;
 202	u64 gpd_size;
 203};
 204
 205/**
 206 * struct kvmppc_gs_proc_table - deserialized process table information element
 207 * @address: start of the process table
 208 * @gpd_size: process table size
 209 */
 210struct kvmppc_gs_proc_table {
 211	u64 address;
 212	u64 gpd_size;
 213};
 214
 215/**
 216 * struct kvmppc_gs_buff_info - deserialized meta guest state buffer information
 217 * @address: start of the guest state buffer
 218 * @size: size of the guest state buffer
 219 */
 220struct kvmppc_gs_buff_info {
 221	u64 address;
 222	u64 size;
 223};
 224
 225/**
 226 * struct kvmppc_gs_header - serialized guest state buffer header
 227 * @nelem: count of guest state elements in the buffer
 228 * @data: start of the stream of elements in the buffer
 229 */
 230struct kvmppc_gs_header {
 231	__be32 nelems;
 232	char data[];
 233} __packed;
 234
 235/**
 236 * struct kvmppc_gs_elem - serialized guest state buffer element
 237 * @iden: Guest State ID
 238 * @len: length of data
 239 * @data: the guest state buffer element's value
 240 */
 241struct kvmppc_gs_elem {
 242	__be16 iden;
 243	__be16 len;
 244	char data[];
 245} __packed;
 246
 247/**
 248 * struct kvmppc_gs_buff - a guest state buffer with metadata.
 249 * @capacity: total length of the buffer
 250 * @len: current length of the elements and header
 251 * @guest_id: guest id associated with the buffer
 252 * @vcpu_id: vcpu_id associated with the buffer
 253 * @hdr: the serialised guest state buffer
 254 */
 255struct kvmppc_gs_buff {
 256	size_t capacity;
 257	size_t len;
 258	unsigned long guest_id;
 259	unsigned long vcpu_id;
 260	struct kvmppc_gs_header *hdr;
 261};
 262
 263/**
 264 * struct kvmppc_gs_bitmap - a bitmap for element ids
 265 * @bitmap: a bitmap large enough for all Guest State IDs
 266 */
 267struct kvmppc_gs_bitmap {
 268	/* private: */
 269	DECLARE_BITMAP(bitmap, KVMPPC_GSE_IDEN_COUNT);
 270};
 271
 272/**
 273 * struct kvmppc_gs_parser - a map of element ids to locations in a buffer
 274 * @iterator: bitmap used for iterating
 275 * @gses: contains the pointers to elements
 276 *
 277 * A guest state parser is used for deserialising a guest state buffer.
 278 * Given a buffer, it then allows looking up guest state elements using
 279 * a guest state id.
 280 */
 281struct kvmppc_gs_parser {
 282	/* private: */
 283	struct kvmppc_gs_bitmap iterator;
 284	struct kvmppc_gs_elem *gses[KVMPPC_GSE_IDEN_COUNT];
 285};
 286
 287enum {
 288	GSM_GUEST_WIDE = 0x1,
 289	GSM_SEND = 0x2,
 290	GSM_RECEIVE = 0x4,
 291	GSM_GSB_OWNER = 0x8,
 292};
 293
 294struct kvmppc_gs_msg;
 295
 296/**
 297 * struct kvmppc_gs_msg_ops - guest state message behavior
 298 * @get_size: maximum size required for the message data
 299 * @fill_info: serializes to the guest state buffer format
 300 * @refresh_info: dserializes from the guest state buffer format
 301 */
 302struct kvmppc_gs_msg_ops {
 303	size_t (*get_size)(struct kvmppc_gs_msg *gsm);
 304	int (*fill_info)(struct kvmppc_gs_buff *gsb, struct kvmppc_gs_msg *gsm);
 305	int (*refresh_info)(struct kvmppc_gs_msg *gsm,
 306			    struct kvmppc_gs_buff *gsb);
 307};
 308
 309/**
 310 * struct kvmppc_gs_msg - a guest state message
 311 * @bitmap: the guest state ids that should be included
 312 * @ops: modify message behavior for reading and writing to buffers
 313 * @flags: host wide, guest wide or thread wide
 314 * @data: location where buffer data will be written to or from.
 315 *
 316 * A guest state message is allows flexibility in sending in receiving data
 317 * in a guest state buffer format.
 318 */
 319struct kvmppc_gs_msg {
 320	struct kvmppc_gs_bitmap bitmap;
 321	struct kvmppc_gs_msg_ops *ops;
 322	unsigned long flags;
 323	void *data;
 324};
 325
 326/**************************************************************************
 327 * Guest State IDs
 328 **************************************************************************/
 329
 330u16 kvmppc_gsid_size(u16 iden);
 331unsigned long kvmppc_gsid_flags(u16 iden);
 332u64 kvmppc_gsid_mask(u16 iden);
 333
 334/**************************************************************************
 335 * Guest State Buffers
 336 **************************************************************************/
 337struct kvmppc_gs_buff *kvmppc_gsb_new(size_t size, unsigned long guest_id,
 338				      unsigned long vcpu_id, gfp_t flags);
 339void kvmppc_gsb_free(struct kvmppc_gs_buff *gsb);
 340void *kvmppc_gsb_put(struct kvmppc_gs_buff *gsb, size_t size);
 341int kvmppc_gsb_send(struct kvmppc_gs_buff *gsb, unsigned long flags);
 342int kvmppc_gsb_recv(struct kvmppc_gs_buff *gsb, unsigned long flags);
 343
 344/**
 345 * kvmppc_gsb_header() - the header of a guest state buffer
 346 * @gsb: guest state buffer
 347 *
 348 * Returns a pointer to the buffer header.
 349 */
 350static inline struct kvmppc_gs_header *
 351kvmppc_gsb_header(struct kvmppc_gs_buff *gsb)
 352{
 353	return gsb->hdr;
 354}
 355
 356/**
 357 * kvmppc_gsb_data() - the elements of a guest state buffer
 358 * @gsb: guest state buffer
 359 *
 360 * Returns a pointer to the first element of the buffer data.
 361 */
 362static inline struct kvmppc_gs_elem *kvmppc_gsb_data(struct kvmppc_gs_buff *gsb)
 363{
 364	return (struct kvmppc_gs_elem *)kvmppc_gsb_header(gsb)->data;
 365}
 366
 367/**
 368 * kvmppc_gsb_len() - the current length of a guest state buffer
 369 * @gsb: guest state buffer
 370 *
 371 * Returns the length including the header of a buffer.
 372 */
 373static inline size_t kvmppc_gsb_len(struct kvmppc_gs_buff *gsb)
 374{
 375	return gsb->len;
 376}
 377
 378/**
 379 * kvmppc_gsb_capacity() - the capacity of a guest state buffer
 380 * @gsb: guest state buffer
 381 *
 382 * Returns the capacity of a buffer.
 383 */
 384static inline size_t kvmppc_gsb_capacity(struct kvmppc_gs_buff *gsb)
 385{
 386	return gsb->capacity;
 387}
 388
 389/**
 390 * kvmppc_gsb_paddress() - the physical address of buffer
 391 * @gsb: guest state buffer
 392 *
 393 * Returns the physical address of the buffer.
 394 */
 395static inline u64 kvmppc_gsb_paddress(struct kvmppc_gs_buff *gsb)
 396{
 397	return __pa(kvmppc_gsb_header(gsb));
 398}
 399
 400/**
 401 * kvmppc_gsb_nelems() - the number of elements in a buffer
 402 * @gsb: guest state buffer
 403 *
 404 * Returns the number of elements in a buffer
 405 */
 406static inline u32 kvmppc_gsb_nelems(struct kvmppc_gs_buff *gsb)
 407{
 408	return be32_to_cpu(kvmppc_gsb_header(gsb)->nelems);
 409}
 410
 411/**
 412 * kvmppc_gsb_reset() - empty a guest state buffer
 413 * @gsb: guest state buffer
 414 *
 415 * Reset the number of elements and length of buffer to empty.
 416 */
 417static inline void kvmppc_gsb_reset(struct kvmppc_gs_buff *gsb)
 418{
 419	kvmppc_gsb_header(gsb)->nelems = cpu_to_be32(0);
 420	gsb->len = sizeof(struct kvmppc_gs_header);
 421}
 422
 423/**
 424 * kvmppc_gsb_data_len() - the length of a buffer excluding the header
 425 * @gsb: guest state buffer
 426 *
 427 * Returns the length of a buffer excluding the header
 428 */
 429static inline size_t kvmppc_gsb_data_len(struct kvmppc_gs_buff *gsb)
 430{
 431	return gsb->len - sizeof(struct kvmppc_gs_header);
 432}
 433
 434/**
 435 * kvmppc_gsb_data_cap() - the capacity of a buffer excluding the header
 436 * @gsb: guest state buffer
 437 *
 438 * Returns the capacity of a buffer excluding the header
 439 */
 440static inline size_t kvmppc_gsb_data_cap(struct kvmppc_gs_buff *gsb)
 441{
 442	return gsb->capacity - sizeof(struct kvmppc_gs_header);
 443}
 444
 445/**
 446 * kvmppc_gsb_for_each_elem - iterate over the elements in a buffer
 447 * @i: loop counter
 448 * @pos: set to current element
 449 * @gsb: guest state buffer
 450 * @rem: initialized to buffer capacity, holds bytes currently remaining in
 451 *  stream
 452 */
 453#define kvmppc_gsb_for_each_elem(i, pos, gsb, rem)               \
 454	kvmppc_gse_for_each_elem(i, kvmppc_gsb_nelems(gsb), pos, \
 455				 kvmppc_gsb_data(gsb),           \
 456				 kvmppc_gsb_data_cap(gsb), rem)
 457
 458/**************************************************************************
 459 * Guest State Elements
 460 **************************************************************************/
 461
 462/**
 463 * kvmppc_gse_iden() - guest state ID of element
 464 * @gse: guest state element
 465 *
 466 * Return the guest state ID in host endianness.
 467 */
 468static inline u16 kvmppc_gse_iden(const struct kvmppc_gs_elem *gse)
 469{
 470	return be16_to_cpu(gse->iden);
 471}
 472
 473/**
 474 * kvmppc_gse_len() - length of guest state element data
 475 * @gse: guest state element
 476 *
 477 * Returns the length of guest state element data
 478 */
 479static inline u16 kvmppc_gse_len(const struct kvmppc_gs_elem *gse)
 480{
 481	return be16_to_cpu(gse->len);
 482}
 483
 484/**
 485 * kvmppc_gse_total_len() - total length of guest state element
 486 * @gse: guest state element
 487 *
 488 * Returns the length of the data plus the ID and size header.
 489 */
 490static inline u16 kvmppc_gse_total_len(const struct kvmppc_gs_elem *gse)
 491{
 492	return be16_to_cpu(gse->len) + sizeof(*gse);
 493}
 494
 495/**
 496 * kvmppc_gse_total_size() - space needed for a given data length
 497 * @size: data length
 498 *
 499 * Returns size plus the space needed for the ID and size header.
 500 */
 501static inline u16 kvmppc_gse_total_size(u16 size)
 502{
 503	return sizeof(struct kvmppc_gs_elem) + size;
 504}
 505
 506/**
 507 * kvmppc_gse_data() - pointer to data of a guest state element
 508 * @gse: guest state element
 509 *
 510 * Returns a pointer to the beginning of guest state element data.
 511 */
 512static inline void *kvmppc_gse_data(const struct kvmppc_gs_elem *gse)
 513{
 514	return (void *)gse->data;
 515}
 516
 517/**
 518 * kvmppc_gse_ok() - checks space exists for guest state element
 519 * @gse: guest state element
 520 * @remaining: bytes of space remaining
 521 *
 522 * Returns true if the guest state element can fit in remaining space.
 523 */
 524static inline bool kvmppc_gse_ok(const struct kvmppc_gs_elem *gse,
 525				 int remaining)
 526{
 527	return remaining >= kvmppc_gse_total_len(gse);
 528}
 529
 530/**
 531 * kvmppc_gse_next() - iterate to the next guest state element in a stream
 532 * @gse: stream of guest state elements
 533 * @remaining: length of the guest element stream
 534 *
 535 * Returns the next guest state element in a stream of elements. The length of
 536 * the stream is updated in remaining.
 537 */
 538static inline struct kvmppc_gs_elem *
 539kvmppc_gse_next(const struct kvmppc_gs_elem *gse, int *remaining)
 540{
 541	int len = sizeof(*gse) + kvmppc_gse_len(gse);
 542
 543	*remaining -= len;
 544	return (struct kvmppc_gs_elem *)(gse->data + kvmppc_gse_len(gse));
 545}
 546
 547/**
 548 * kvmppc_gse_for_each_elem - iterate over a stream of guest state elements
 549 * @i: loop counter
 550 * @max: number of elements
 551 * @pos: set to current element
 552 * @head: head of elements
 553 * @len: length of the stream
 554 * @rem: initialized to len, holds bytes currently remaining elements
 555 */
 556#define kvmppc_gse_for_each_elem(i, max, pos, head, len, rem)                  \
 557	for (i = 0, pos = head, rem = len; kvmppc_gse_ok(pos, rem) && i < max; \
 558	     pos = kvmppc_gse_next(pos, &(rem)), i++)
 559
 560int __kvmppc_gse_put(struct kvmppc_gs_buff *gsb, u16 iden, u16 size,
 561		     const void *data);
 562int kvmppc_gse_parse(struct kvmppc_gs_parser *gsp, struct kvmppc_gs_buff *gsb);
 563
 564/**
 565 * kvmppc_gse_put_be32() - add a be32 guest state element to a buffer
 566 * @gsb: guest state buffer to add element to
 567 * @iden: guest state ID
 568 * @val: big endian value
 569 */
 570static inline int kvmppc_gse_put_be32(struct kvmppc_gs_buff *gsb, u16 iden,
 571				      __be32 val)
 572{
 573	__be32 tmp;
 574
 575	tmp = val;
 576	return __kvmppc_gse_put(gsb, iden, sizeof(__be32), &tmp);
 577}
 578
 579/**
 580 * kvmppc_gse_put_u32() - add a host endian 32bit int guest state element to a
 581 * buffer
 582 * @gsb: guest state buffer to add element to
 583 * @iden: guest state ID
 584 * @val: host endian value
 585 */
 586static inline int kvmppc_gse_put_u32(struct kvmppc_gs_buff *gsb, u16 iden,
 587				     u32 val)
 588{
 589	__be32 tmp;
 590
 591	val &= kvmppc_gsid_mask(iden);
 592	tmp = cpu_to_be32(val);
 593	return kvmppc_gse_put_be32(gsb, iden, tmp);
 594}
 595
 596/**
 597 * kvmppc_gse_put_be64() - add a be64 guest state element to a buffer
 598 * @gsb: guest state buffer to add element to
 599 * @iden: guest state ID
 600 * @val: big endian value
 601 */
 602static inline int kvmppc_gse_put_be64(struct kvmppc_gs_buff *gsb, u16 iden,
 603				      __be64 val)
 604{
 605	__be64 tmp;
 606
 607	tmp = val;
 608	return __kvmppc_gse_put(gsb, iden, sizeof(__be64), &tmp);
 609}
 610
 611/**
 612 * kvmppc_gse_put_u64() - add a host endian 64bit guest state element to a
 613 * buffer
 614 * @gsb: guest state buffer to add element to
 615 * @iden: guest state ID
 616 * @val: host endian value
 617 */
 618static inline int kvmppc_gse_put_u64(struct kvmppc_gs_buff *gsb, u16 iden,
 619				     u64 val)
 620{
 621	__be64 tmp;
 622
 623	val &= kvmppc_gsid_mask(iden);
 624	tmp = cpu_to_be64(val);
 625	return kvmppc_gse_put_be64(gsb, iden, tmp);
 626}
 627
 628/**
 629 * __kvmppc_gse_put_reg() - add a register type guest state element to a buffer
 630 * @gsb: guest state buffer to add element to
 631 * @iden: guest state ID
 632 * @val: host endian value
 633 *
 634 * Adds a register type guest state element. Uses the guest state ID for
 635 * determining the length of the guest element. If the guest state ID has
 636 * bits that can not be set they will be cleared.
 637 */
 638static inline int __kvmppc_gse_put_reg(struct kvmppc_gs_buff *gsb, u16 iden,
 639				       u64 val)
 640{
 641	val &= kvmppc_gsid_mask(iden);
 642	if (kvmppc_gsid_size(iden) == sizeof(u64))
 643		return kvmppc_gse_put_u64(gsb, iden, val);
 644
 645	if (kvmppc_gsid_size(iden) == sizeof(u32)) {
 646		u32 tmp;
 647
 648		tmp = (u32)val;
 649		if (tmp != val)
 650			return -EINVAL;
 651
 652		return kvmppc_gse_put_u32(gsb, iden, tmp);
 653	}
 654	return -EINVAL;
 655}
 656
 657/**
 658 * kvmppc_gse_put_vector128() - add a vector guest state element to a buffer
 659 * @gsb: guest state buffer to add element to
 660 * @iden: guest state ID
 661 * @val: 16 byte vector value
 662 */
 663static inline int kvmppc_gse_put_vector128(struct kvmppc_gs_buff *gsb, u16 iden,
 664					   vector128 *val)
 665{
 666	__be64 tmp[2] = { 0 };
 667	union {
 668		__vector128 v;
 669		u64 dw[2];
 670	} u;
 671
 672	u.v = *val;
 673	tmp[0] = cpu_to_be64(u.dw[TS_FPROFFSET]);
 674#ifdef CONFIG_VSX
 675	tmp[1] = cpu_to_be64(u.dw[TS_VSRLOWOFFSET]);
 676#endif
 677	return __kvmppc_gse_put(gsb, iden, sizeof(tmp), &tmp);
 678}
 679
 680/**
 681 * kvmppc_gse_put_part_table() - add a partition table guest state element to a
 682 * buffer
 683 * @gsb: guest state buffer to add element to
 684 * @iden: guest state ID
 685 * @val: partition table value
 686 */
 687static inline int kvmppc_gse_put_part_table(struct kvmppc_gs_buff *gsb,
 688					    u16 iden,
 689					    struct kvmppc_gs_part_table val)
 690{
 691	__be64 tmp[3];
 692
 693	tmp[0] = cpu_to_be64(val.address);
 694	tmp[1] = cpu_to_be64(val.ea_bits);
 695	tmp[2] = cpu_to_be64(val.gpd_size);
 696	return __kvmppc_gse_put(gsb, KVMPPC_GSID_PARTITION_TABLE, sizeof(tmp),
 697				&tmp);
 698}
 699
 700/**
 701 * kvmppc_gse_put_proc_table() - add a process table guest state element to a
 702 * buffer
 703 * @gsb: guest state buffer to add element to
 704 * @iden: guest state ID
 705 * @val: process table value
 706 */
 707static inline int kvmppc_gse_put_proc_table(struct kvmppc_gs_buff *gsb,
 708					    u16 iden,
 709					    struct kvmppc_gs_proc_table val)
 710{
 711	__be64 tmp[2];
 712
 713	tmp[0] = cpu_to_be64(val.address);
 714	tmp[1] = cpu_to_be64(val.gpd_size);
 715	return __kvmppc_gse_put(gsb, KVMPPC_GSID_PROCESS_TABLE, sizeof(tmp),
 716				&tmp);
 717}
 718
 719/**
 720 * kvmppc_gse_put_buff_info() - adds a GSB description guest state element to a
 721 * buffer
 722 * @gsb: guest state buffer to add element to
 723 * @iden: guest state ID
 724 * @val: guest state buffer description value
 725 */
 726static inline int kvmppc_gse_put_buff_info(struct kvmppc_gs_buff *gsb, u16 iden,
 727					   struct kvmppc_gs_buff_info val)
 728{
 729	__be64 tmp[2];
 730
 731	tmp[0] = cpu_to_be64(val.address);
 732	tmp[1] = cpu_to_be64(val.size);
 733	return __kvmppc_gse_put(gsb, iden, sizeof(tmp), &tmp);
 734}
 735
 736int __kvmppc_gse_put(struct kvmppc_gs_buff *gsb, u16 iden, u16 size,
 737		     const void *data);
 738
 739/**
 740 * kvmppc_gse_get_be32() - return the data of a be32 element
 741 * @gse: guest state element
 742 */
 743static inline __be32 kvmppc_gse_get_be32(const struct kvmppc_gs_elem *gse)
 744{
 745	if (WARN_ON(kvmppc_gse_len(gse) != sizeof(__be32)))
 746		return 0;
 747	return *(__be32 *)kvmppc_gse_data(gse);
 748}
 749
 750/**
 751 * kvmppc_gse_get_u32() - return the data of a be32 element in host endianness
 752 * @gse: guest state element
 753 */
 754static inline u32 kvmppc_gse_get_u32(const struct kvmppc_gs_elem *gse)
 755{
 756	return be32_to_cpu(kvmppc_gse_get_be32(gse));
 757}
 758
 759/**
 760 * kvmppc_gse_get_be64() - return the data of a be64 element
 761 * @gse: guest state element
 762 */
 763static inline __be64 kvmppc_gse_get_be64(const struct kvmppc_gs_elem *gse)
 764{
 765	if (WARN_ON(kvmppc_gse_len(gse) != sizeof(__be64)))
 766		return 0;
 767	return *(__be64 *)kvmppc_gse_data(gse);
 768}
 769
 770/**
 771 * kvmppc_gse_get_u64() - return the data of a be64 element in host endianness
 772 * @gse: guest state element
 773 */
 774static inline u64 kvmppc_gse_get_u64(const struct kvmppc_gs_elem *gse)
 775{
 776	return be64_to_cpu(kvmppc_gse_get_be64(gse));
 777}
 778
 779/**
 780 * kvmppc_gse_get_vector128() - return the data of a vector element
 781 * @gse: guest state element
 782 */
 783static inline void kvmppc_gse_get_vector128(const struct kvmppc_gs_elem *gse,
 784					    vector128 *v)
 785{
 786	union {
 787		__vector128 v;
 788		u64 dw[2];
 789	} u = { 0 };
 790	__be64 *src;
 791
 792	if (WARN_ON(kvmppc_gse_len(gse) != sizeof(__vector128)))
 793		*v = u.v;
 794
 795	src = (__be64 *)kvmppc_gse_data(gse);
 796	u.dw[TS_FPROFFSET] = be64_to_cpu(src[0]);
 797#ifdef CONFIG_VSX
 798	u.dw[TS_VSRLOWOFFSET] = be64_to_cpu(src[1]);
 799#endif
 800	*v = u.v;
 801}
 802
 803/**************************************************************************
 804 * Guest State Bitmap
 805 **************************************************************************/
 806
 807bool kvmppc_gsbm_test(struct kvmppc_gs_bitmap *gsbm, u16 iden);
 808void kvmppc_gsbm_set(struct kvmppc_gs_bitmap *gsbm, u16 iden);
 809void kvmppc_gsbm_clear(struct kvmppc_gs_bitmap *gsbm, u16 iden);
 810u16 kvmppc_gsbm_next(struct kvmppc_gs_bitmap *gsbm, u16 prev);
 811
 812/**
 813 * kvmppc_gsbm_zero - zero the entire bitmap
 814 * @gsbm: guest state buffer bitmap
 815 */
 816static inline void kvmppc_gsbm_zero(struct kvmppc_gs_bitmap *gsbm)
 817{
 818	bitmap_zero(gsbm->bitmap, KVMPPC_GSE_IDEN_COUNT);
 819}
 820
 821/**
 822 * kvmppc_gsbm_fill - fill the entire bitmap
 823 * @gsbm: guest state buffer bitmap
 824 */
 825static inline void kvmppc_gsbm_fill(struct kvmppc_gs_bitmap *gsbm)
 826{
 827	bitmap_fill(gsbm->bitmap, KVMPPC_GSE_IDEN_COUNT);
 828	clear_bit(0, gsbm->bitmap);
 829}
 830
 831/**
 832 * kvmppc_gsbm_for_each - iterate the present guest state IDs
 833 * @gsbm: guest state buffer bitmap
 834 * @iden: current guest state ID
 835 */
 836#define kvmppc_gsbm_for_each(gsbm, iden)                  \
 837	for (iden = kvmppc_gsbm_next(gsbm, 0); iden != 0; \
 838	     iden = kvmppc_gsbm_next(gsbm, iden))
 839
 840/**************************************************************************
 841 * Guest State Parser
 842 **************************************************************************/
 843
 844void kvmppc_gsp_insert(struct kvmppc_gs_parser *gsp, u16 iden,
 845		       struct kvmppc_gs_elem *gse);
 846struct kvmppc_gs_elem *kvmppc_gsp_lookup(struct kvmppc_gs_parser *gsp,
 847					 u16 iden);
 848
 849/**
 850 * kvmppc_gsp_for_each - iterate the <guest state IDs, guest state element>
 851 * pairs
 852 * @gsp: guest state buffer bitmap
 853 * @iden: current guest state ID
 854 * @gse: guest state element
 855 */
 856#define kvmppc_gsp_for_each(gsp, iden, gse)                              \
 857	for (iden = kvmppc_gsbm_next(&(gsp)->iterator, 0),               \
 858	    gse = kvmppc_gsp_lookup((gsp), iden);                        \
 859	     iden != 0; iden = kvmppc_gsbm_next(&(gsp)->iterator, iden), \
 860	    gse = kvmppc_gsp_lookup((gsp), iden))
 861
 862/**************************************************************************
 863 * Guest State Message
 864 **************************************************************************/
 865
 866/**
 867 * kvmppc_gsm_for_each - iterate the guest state IDs included in a guest state
 868 * message
 869 * @gsp: guest state buffer bitmap
 870 * @iden: current guest state ID
 871 * @gse: guest state element
 872 */
 873#define kvmppc_gsm_for_each(gsm, iden)                            \
 874	for (iden = kvmppc_gsbm_next(&gsm->bitmap, 0); iden != 0; \
 875	     iden = kvmppc_gsbm_next(&gsm->bitmap, iden))
 876
 877int kvmppc_gsm_init(struct kvmppc_gs_msg *mgs, struct kvmppc_gs_msg_ops *ops,
 878		    void *data, unsigned long flags);
 879
 880struct kvmppc_gs_msg *kvmppc_gsm_new(struct kvmppc_gs_msg_ops *ops, void *data,
 881				     unsigned long flags, gfp_t gfp_flags);
 882void kvmppc_gsm_free(struct kvmppc_gs_msg *gsm);
 883size_t kvmppc_gsm_size(struct kvmppc_gs_msg *gsm);
 884int kvmppc_gsm_fill_info(struct kvmppc_gs_msg *gsm, struct kvmppc_gs_buff *gsb);
 885int kvmppc_gsm_refresh_info(struct kvmppc_gs_msg *gsm,
 886			    struct kvmppc_gs_buff *gsb);
 887
 888/**
 889 * kvmppc_gsm_include - indicate a guest state ID should be included when
 890 * serializing
 891 * @gsm: guest state message
 892 * @iden: guest state ID
 893 */
 894static inline void kvmppc_gsm_include(struct kvmppc_gs_msg *gsm, u16 iden)
 895{
 896	kvmppc_gsbm_set(&gsm->bitmap, iden);
 897}
 898
 899/**
 900 * kvmppc_gsm_includes - check if a guest state ID will be included when
 901 * serializing
 902 * @gsm: guest state message
 903 * @iden: guest state ID
 904 */
 905static inline bool kvmppc_gsm_includes(struct kvmppc_gs_msg *gsm, u16 iden)
 906{
 907	return kvmppc_gsbm_test(&gsm->bitmap, iden);
 908}
 909
 910/**
 911 * kvmppc_gsm_includes - indicate all guest state IDs should be included when
 912 * serializing
 913 * @gsm: guest state message
 914 * @iden: guest state ID
 915 */
 916static inline void kvmppc_gsm_include_all(struct kvmppc_gs_msg *gsm)
 917{
 918	kvmppc_gsbm_fill(&gsm->bitmap);
 919}
 920
 921/**
 922 * kvmppc_gsm_include - clear the guest state IDs that should be included when
 923 * serializing
 924 * @gsm: guest state message
 925 */
 926static inline void kvmppc_gsm_reset(struct kvmppc_gs_msg *gsm)
 927{
 928	kvmppc_gsbm_zero(&gsm->bitmap);
 929}
 930
 931/**
 932 * kvmppc_gsb_receive_data - flexibly update values from a guest state buffer
 933 * @gsb: guest state buffer
 934 * @gsm: guest state message
 935 *
 936 * Requests updated values for the guest state values included in the guest
 937 * state message. The guest state message will then deserialize the guest state
 938 * buffer.
 939 */
 940static inline int kvmppc_gsb_receive_data(struct kvmppc_gs_buff *gsb,
 941					  struct kvmppc_gs_msg *gsm)
 942{
 943	int rc;
 944
 945	kvmppc_gsb_reset(gsb);
 946	rc = kvmppc_gsm_fill_info(gsm, gsb);
 947	if (rc < 0)
 948		return rc;
 949
 950	rc = kvmppc_gsb_recv(gsb, gsm->flags);
 951	if (rc < 0)
 952		return rc;
 953
 954	rc = kvmppc_gsm_refresh_info(gsm, gsb);
 955	if (rc < 0)
 956		return rc;
 957	return 0;
 958}
 959
 960/**
 961 * kvmppc_gsb_recv - receive a single guest state ID
 962 * @gsb: guest state buffer
 963 * @gsm: guest state message
 964 * @iden: guest state identity
 965 */
 966static inline int kvmppc_gsb_receive_datum(struct kvmppc_gs_buff *gsb,
 967					   struct kvmppc_gs_msg *gsm, u16 iden)
 968{
 969	int rc;
 970
 971	kvmppc_gsm_include(gsm, iden);
 972	rc = kvmppc_gsb_receive_data(gsb, gsm);
 973	if (rc < 0)
 974		return rc;
 975	kvmppc_gsm_reset(gsm);
 976	return 0;
 977}
 978
 979/**
 980 * kvmppc_gsb_send_data - flexibly send values from a guest state buffer
 981 * @gsb: guest state buffer
 982 * @gsm: guest state message
 983 *
 984 * Sends the guest state values included in the guest state message.
 985 */
 986static inline int kvmppc_gsb_send_data(struct kvmppc_gs_buff *gsb,
 987				       struct kvmppc_gs_msg *gsm)
 988{
 989	int rc;
 990
 991	kvmppc_gsb_reset(gsb);
 992	rc = kvmppc_gsm_fill_info(gsm, gsb);
 993	if (rc < 0)
 994		return rc;
 995	rc = kvmppc_gsb_send(gsb, gsm->flags);
 996
 997	return rc;
 998}
 999
1000/**
1001 * kvmppc_gsb_recv - send a single guest state ID
1002 * @gsb: guest state buffer
1003 * @gsm: guest state message
1004 * @iden: guest state identity
1005 */
1006static inline int kvmppc_gsb_send_datum(struct kvmppc_gs_buff *gsb,
1007					struct kvmppc_gs_msg *gsm, u16 iden)
1008{
1009	int rc;
1010
1011	kvmppc_gsm_include(gsm, iden);
1012	rc = kvmppc_gsb_send_data(gsb, gsm);
1013	if (rc < 0)
1014		return rc;
1015	kvmppc_gsm_reset(gsm);
1016	return 0;
1017}
1018
1019#endif /* _ASM_POWERPC_GUEST_STATE_BUFFER_H */
~/ Read-only file preview.