예제 #1
0
파일: guest.cpp 프로젝트: saltstar/smartnix
// static
zx_status_t Guest::Create(ktl::unique_ptr<Guest>* out) {
    // Check that the CPU supports VMX.
    if (!x86_feature_test(X86_FEATURE_VMX)) {
        return ZX_ERR_NOT_SUPPORTED;
    }

    zx_status_t status = alloc_vmx_state();
    if (status != ZX_OK) {
        return status;
    }

    fbl::AllocChecker ac;
    ktl::unique_ptr<Guest> guest(new (&ac) Guest);
    if (!ac.check()) {
        return ZX_ERR_NO_MEMORY;
    }

    status = hypervisor::GuestPhysicalAddressSpace::Create(&guest->gpas_);
    if (status != ZX_OK) {
        return status;
    }

    // Setup common MSR bitmaps.
    VmxInfo vmx_info;
    status = guest->msr_bitmaps_page_.Alloc(vmx_info, UINT8_MAX);
    if (status != ZX_OK) {
        return status;
    }

    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_PAT);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_EFER);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_FS_BASE);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_GS_BASE);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_KERNEL_GS_BASE);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_STAR);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_LSTAR);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_FMASK);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_TSC_ADJUST);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_TSC_AUX);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_SYSENTER_CS);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_SYSENTER_ESP);
    ignore_msr(&guest->msr_bitmaps_page_, true, X86_MSR_IA32_SYSENTER_EIP);

    // Setup VPID allocator
    fbl::AutoLock lock(&guest->vcpu_mutex_);
    status = guest->vpid_allocator_.Init();
    if (status != ZX_OK) {
        return status;
    }

    *out = ktl::move(guest);
    return ZX_OK;
}
// -------------------- EDAC Tests ----------------------
void FileAccessControllerTests::doTestEDAC(EntityDataAccessController *edac) {
	StartTrace(FileAccessControllerTests.doTestEDAC);

	if (t_assert(edac != NULL)) {
		String user("user"), guest("guest"), unknown("unknown"), coffee("coffee");
		Anything groups;
		groups.Append("coffee");
		groups.Append("movies");
		Anything allowed;
		Anything empty = Anything(Anything::ArrayMarker());

		// empty group
		t_assert(edac->GetAllowedEntitiesForGroup(guest, allowed));
		t_assert(!allowed.IsNull());
		assertEqual(0L, allowed.GetSize());

		// single group
		t_assert(edac->GetAllowedEntitiesForGroup(user, allowed));
		assertEqual(2L, allowed.GetSize());
		t_assert(allowed.Contains("changePW"));
		t_assert(allowed.Contains("resetPW"));

		// group list
		t_assert(edac->GetAllowedEntitiesForGroups(groups, allowed));
		assertEqual(5L, allowed.GetSize());
		t_assert(allowed.Contains("tv"));
		t_assert(allowed.Contains("espressomachine"));
		t_assert(!allowed.Contains("changePW"));

		t_assert(edac->GetAllowedEntitiesForGroups(empty, allowed));
		t_assert(!allowed.IsNull());
		assertEqual(0L, allowed.GetSize());

		// specific tests
		t_assert(edac->IsAllowed(user, "resetPW"));
		t_assert(edac->IsAllowed(coffee, "cookiejar"));
		t_assert(!edac->IsAllowed(guest, "everything"));

		// tests with unknown
		t_assert(!edac->IsAllowed(unknown, "format c:"));
		t_assert(!edac->GetAllowedEntitiesForGroup(unknown, allowed));
		empty.Append(coffee);
		empty.Append(unknown);
		t_assert(!edac->GetAllowedEntitiesForGroups(empty, allowed));
	}
}