On Tue, Dec 21, 2021 at 09:40:36AM -0600, Michael Roth wrote:
On Mon, Dec 20, 2021 at 01:49:15AM +0000, Mingwei Zhang wrote:
On Thu, Dec 16, 2021, Michael Roth wrote:
+}
+static void +test_common(struct kvm_vm *vm, struct ucall *uc,
uint8_t *shared_buf, uint8_t *private_buf)
+{
- bool success;
- /* Initial guest check-in. */
- vcpu_run(vm, VCPU_ID);
- CHECK_SHARED_SYNC(vm, VCPU_ID, uc, 100);
- /* Ensure initial private pages are intact/encrypted. */
- success = check_buf(private_buf, PRIVATE_PAGES, PAGE_STRIDE, 0x42);
- TEST_ASSERT(!success, "Initial guest memory not encrypted!");
- vcpu_run(vm, VCPU_ID);
- CHECK_SHARED_SYNC(vm, VCPU_ID, uc, 101);
- /* Ensure host userspace can't read newly-written encrypted data. */
- success = check_buf(private_buf, PRIVATE_PAGES, PAGE_STRIDE, 0x43);
I am not sure if it is safe here. Since the cache coherency is not there for neither SEV or SEV-ES. Reading confidential memory from host side will generate cache lines that is not coherent with the guest. So might be better to add clfush here?
On the guest side, the cachelines are tagged based on ASID, so in this case the guest would populate it's own cachelines when it writes new data to private buf.
On a host without SME coherency bit, there is a possibility that whatever data the host had previously written to private_buf with C=0/ASID=0, prior to the guest writing to it, might still be present in the cache, but for this test that's okay since the guest has purposely written new data to confirm that the host does not see the new data. What data the host *actually* sees, stale cache data vs. new reads of guest private memory with C=0 (e.g. ciphertext) are both okay as far as the test is concerned. clflush() would probably make sense here, but if failure to do so somehow results in the above assumptions not holding, and the test ends up seeing the newly-written data, we definitely want this test to fail loudly, so leaving out the clflush() to cover that corner case seems like a good idea.
Actually it might be good to check both of those cases, e.g.:
//check private buf (possibly with stale cache for sme_coherency=0) clflush() //check private buf again (with fresh read of guest memory)
I'll take a look at that.
-Mike