KVM: PPC: Book3S HV: Define usage types for rmap array in guest memslot

The rmap array in the guest memslot is an array of size number of guest
pages, allocated at memslot creation time. Each rmap entry in this array
is used to store information about the guest page to which it
corresponds. For example for a hpt guest it is used to store a lock bit,
rc bits, a present bit and the index of a hpt entry in the guest hpt
which maps this page. For a radix guest which is running nested guests
it is used to store a pointer to a linked list of nested rmap entries
which store the nested guest physical address which maps this guest
address and for which there is a pte in the shadow page table.

As there are currently two uses for the rmap array, and the potential
for this to expand to more in the future, define a type field (being the
top 8 bits of the rmap entry) to be used to define the type of the rmap
entry which is currently present and define two values for this field
for the two current uses of the rmap array.

Since the nested case uses the rmap entry to store a pointer, define
this type as having the two high bits set as is expected for a pointer.
Define the hpt entry type as having bit 56 set (bit 7 IBM bit ordering).

Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com>
Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
This commit is contained in:
Suraj Jitindar Singh 2019-08-20 16:13:49 +10:00 committed by Paul Mackerras
parent ff7240ccf0
commit d22deab696
2 changed files with 19 additions and 5 deletions

View File

@ -232,11 +232,25 @@ struct revmap_entry {
};
/*
* We use the top bit of each memslot->arch.rmap entry as a lock bit,
* and bit 32 as a present flag. The bottom 32 bits are the
* index in the guest HPT of a HPTE that points to the page.
* The rmap array of size number of guest pages is allocated for each memslot.
* This array is used to store usage specific information about the guest page.
* Below are the encodings of the various possible usage types.
*/
#define KVMPPC_RMAP_LOCK_BIT 63
/* Free bits which can be used to define a new usage */
#define KVMPPC_RMAP_TYPE_MASK 0xff00000000000000
#define KVMPPC_RMAP_NESTED 0xc000000000000000 /* Nested rmap array */
#define KVMPPC_RMAP_HPT 0x0100000000000000 /* HPT guest */
/*
* rmap usage definition for a hash page table (hpt) guest:
* 0x0000080000000000 Lock bit
* 0x0000018000000000 RC bits
* 0x0000000100000000 Present bit
* 0x00000000ffffffff HPT index bits
* The bottom 32 bits are the index in the guest HPT of a HPTE that points to
* the page.
*/
#define KVMPPC_RMAP_LOCK_BIT 43
#define KVMPPC_RMAP_RC_SHIFT 32
#define KVMPPC_RMAP_REFERENCED (HPTE_R_R << KVMPPC_RMAP_RC_SHIFT)
#define KVMPPC_RMAP_PRESENT 0x100000000ul

View File

@ -99,7 +99,7 @@ void kvmppc_add_revmap_chain(struct kvm *kvm, struct revmap_entry *rev,
} else {
rev->forw = rev->back = pte_index;
*rmap = (*rmap & ~KVMPPC_RMAP_INDEX) |
pte_index | KVMPPC_RMAP_PRESENT;
pte_index | KVMPPC_RMAP_PRESENT | KVMPPC_RMAP_HPT;
}
unlock_rmap(rmap);
}