def test_Class_configure_more_free_buddies_and_mmap(self): pageflags = kpageflags.FlagsDataSource(kpageflags.KPageFlags, "/proc/kpageflags") requests = [] free_buddies = find_free_buddy_pfns(pageflags, 0x100) for pfn in free_buddies: requests.append( physmem.Phys_mem_frame_request(pfn, self.allowed_sources)) config = self.util_Class_configure(requests) claimed = 0 for request, answer in zip(requests, config): # Test, if the request has been properly copied over to the configuration self.assertEqual( request.requested_pfn, answer.request.requested_pfn, "request.requested_pfn differs from the request read from the device" ) self.assertEqual( request.allowed_sources, answer.request.allowed_sources, "request.allowed_sources differs from the request read from the device" ) # print(answer) if (answer.is_claimed()): claimed += 1 print("Claimed: %d of %d" % (claimed, len(requests))) with self.device.mmap(claimed * 4096) as map: pass
def test_Class_configure_no_buddy_allocs_from_hwpoison(self): pageflags = kpageflags.FlagsDataSource(kpageflags.KPageFlags, "/proc/kpageflags") allowed_sources = physmem.SOURCE_HW_POISON_ANON | physmem.SOURCE_HW_POISON_PAGE_CACHE requests = [] free_buddies = find_free_buddy_pfns(pageflags, 0x100) for pfn in free_buddies: requests.append( physmem.Phys_mem_frame_request(pfn, allowed_sources)) config = self.util_Class_configure(requests) claimed = 0 for request, answer in zip(requests, config): # Test, if the request has been properly copied over to the configuration self.assertEqual( request.requested_pfn, answer.request.requested_pfn, "request.requested_pfn differs from the request read from the device" ) self.assertEqual( request.allowed_sources, answer.request.allowed_sources, "request.allowed_sources differs from the request read from the device" ) # print(answer) if (answer.is_claimed()): claimed += 1 self.assertEqual( 0, claimed, "Claimed: %d of %d, although no buddy pages should be claimed by the hw-poison claimer" % (claimed, len(requests)))
def test_Class_configure_more_free_buddies_and_mmap(self): pageflags = kpageflags.FlagsDataSource(kpageflags.KPageFlags, "/proc/kpageflags") requests = [] free_buddies = find_free_buddy_pfns(pageflags, 0x100) for pfn in free_buddies: requests.append(physmem.Phys_mem_frame_request(pfn, self.allowed_sources)) config = self.util_Class_configure(requests) claimed = 0 for request, answer in zip(requests, config): # Test, if the request has been properly copied over to the configuration self.assertEqual( request.requested_pfn, answer.request.requested_pfn, "request.requested_pfn differs from the request read from the device", ) self.assertEqual( request.allowed_sources, answer.request.allowed_sources, "request.allowed_sources differs from the request read from the device", ) # print(answer) if answer.is_claimed(): claimed += 1 print("Claimed: %d of %d" % (claimed, len(requests))) with self.device.mmap(claimed * 4096) as map: pass
def test_Class_configure_no_buddy_allocs_from_hwpoison(self): pageflags = kpageflags.FlagsDataSource(kpageflags.KPageFlags, "/proc/kpageflags") allowed_sources = physmem.SOURCE_HW_POISON_ANON | physmem.SOURCE_HW_POISON_PAGE_CACHE requests = [] free_buddies = find_free_buddy_pfns(pageflags, 0x100) for pfn in free_buddies: requests.append(physmem.Phys_mem_frame_request(pfn, allowed_sources)) config = self.util_Class_configure(requests) claimed = 0 for request, answer in zip(requests, config): # Test, if the request has been properly copied over to the configuration self.assertEqual( request.requested_pfn, answer.request.requested_pfn, "request.requested_pfn differs from the request read from the device", ) self.assertEqual( request.allowed_sources, answer.request.allowed_sources, "request.allowed_sources differs from the request read from the device", ) # print(answer) if answer.is_claimed(): claimed += 1 self.assertEqual( 0, claimed, "Claimed: %d of %d, although no buddy pages should be claimed by the hw-poison claimer" % (claimed, len(requests)), )
def test_buddies(self): pageflags = kpageflags.FlagsDataSource('flags', "/proc/kpageflags") pfns = find_free_buddy_pfns(pageflags, 0x1000) self.configure_mmap_and_test(pfns, SOURCE_FREE_BUDDY_PAGE)
def test_Class_configure_more_free_buddies_and_mmap_and_test(self): allowed_sources = SOURCE_FREE_BUDDY_PAGE pageflags = kpageflags.FlagsDataSource('flags', "/proc/kpageflags") pagecount = kpagecount.CountDataSource('count', "/proc/kpagecount") requests = [] free_buddies = find_free_buddy_pfns(pageflags, 0x100) for pfn in free_buddies: requests.append( physmem.Phys_mem_frame_request(pfn, allowed_sources)) config = self.util_Class_configure(requests) claimed = 0 with pageflags.open() as pf: with pagecount.open() as pc: for request, answer in zip(requests, config): # Test, if the request has been properly copied over to the configuration self.assertEqual( request.requested_pfn, answer.request.requested_pfn, "request.requested_pfn differs from the request read from the device" ) self.assertEqual( request.allowed_sources, answer.request.allowed_sources, "request.allowed_sources differs from the request read from the device" ) # print(answer) if (answer.is_claimed()): claimed += 1 pfn = answer.pfn self.assertEqual(request.requested_pfn, answer.pfn, "requested and aquired pfn differ") flags = pf[pfn] count = pc[pfn] self.failIfEqual( None, flags, "Could not read flags for pfn %d" % (pfn, )) self.failIfEqual( None, count, "Could not read count for pfn %d" % (pfn, )) self.assertFalse( flags.all_set_in(kpageflags.BUDDY), "The page should no longer be a free buddy page. The flags are %s" % (flags, )) #self.failIfEqual(0, flags.flags,"No flags set for pfn %d" % (pfn,)) # We did not map the page yet, so expect 0 mapcount # http://fixunix.com/kernel/488903-patch-2-5-pagemap-change-kpagecount-return-map-count-not-reference-count-page.html self.assertTrue( count == 0, "Pagecount should be 0, but is %d" % (count, )) print("Claimed: %d of %d" % (claimed, len(requests))) size = claimed * 4096 with self.device.mmap(size) as map: self.failIfEqual(None, map, "No map returned") self.assertEquals( 0, map.tell(), "Pointer into mapping should start at 0") # test mapcont for answer in config: if (answer.is_claimed()): pfn = answer.pfn flags = pf[pfn] count = pc[pfn] self.failIfEqual( None, flags, "Could not read flags for pfn %d" % (pfn, )) self.failIfEqual( None, count, "Could not read count for pfn %d" % (pfn, )) # We did map the page yet, so expect 1 mapcount # http://fixunix.com/kernel/488903-patch-2-5-pagemap-change-kpagecount-return-map-count-not-reference-count-page.html self.assertTrue( count == 1, "Pagecount should be 1 becuase we did map the page, but is %d" % (count, )) for i in xrange(0, size): map.write_byte(chr(i % 0xff)) self.assertEqual(size, map.tell(), "Did not reach end of file") map.seek(0) self.assertEquals( 0, map.tell(), "After seek(0): Pointer into mapping should be at 0") for i in xrange(0, size): expected = i % 0xff found = ord(map.read_byte()) self.assertEqual( expected, found, "Expected value %x at %d, not %x" % (expected, i, found))
def test_buddies(self): pageflags = kpageflags.FlagsDataSource("flags", "/proc/kpageflags") pfns = find_free_buddy_pfns(pageflags, 0x1000) self.configure_mmap_and_test(pfns, SOURCE_FREE_BUDDY_PAGE)
def test_Class_configure_more_free_buddies_and_mmap_and_test(self): allowed_sources = SOURCE_FREE_BUDDY_PAGE pageflags = kpageflags.FlagsDataSource("flags", "/proc/kpageflags") pagecount = kpagecount.CountDataSource("count", "/proc/kpagecount") requests = [] free_buddies = find_free_buddy_pfns(pageflags, 0x100) for pfn in free_buddies: requests.append(physmem.Phys_mem_frame_request(pfn, allowed_sources)) config = self.util_Class_configure(requests) claimed = 0 with pageflags.open() as pf: with pagecount.open() as pc: for request, answer in zip(requests, config): # Test, if the request has been properly copied over to the configuration self.assertEqual( request.requested_pfn, answer.request.requested_pfn, "request.requested_pfn differs from the request read from the device", ) self.assertEqual( request.allowed_sources, answer.request.allowed_sources, "request.allowed_sources differs from the request read from the device", ) # print(answer) if answer.is_claimed(): claimed += 1 pfn = answer.pfn self.assertEqual(request.requested_pfn, answer.pfn, "requested and aquired pfn differ") flags = pf[pfn] count = pc[pfn] self.failIfEqual(None, flags, "Could not read flags for pfn %d" % (pfn,)) self.failIfEqual(None, count, "Could not read count for pfn %d" % (pfn,)) self.assertFalse( flags.all_set_in(kpageflags.BUDDY), "The page should no longer be a free buddy page. The flags are %s" % (flags,), ) # self.failIfEqual(0, flags.flags,"No flags set for pfn %d" % (pfn,)) # We did not map the page yet, so expect 0 mapcount # http://fixunix.com/kernel/488903-patch-2-5-pagemap-change-kpagecount-return-map-count-not-reference-count-page.html self.assertTrue(count == 0, "Pagecount should be 0, but is %d" % (count,)) print("Claimed: %d of %d" % (claimed, len(requests))) size = claimed * 4096 with self.device.mmap(size) as map: self.failIfEqual(None, map, "No map returned") self.assertEquals(0, map.tell(), "Pointer into mapping should start at 0") # test mapcont for answer in config: if answer.is_claimed(): pfn = answer.pfn flags = pf[pfn] count = pc[pfn] self.failIfEqual(None, flags, "Could not read flags for pfn %d" % (pfn,)) self.failIfEqual(None, count, "Could not read count for pfn %d" % (pfn,)) # We did map the page yet, so expect 1 mapcount # http://fixunix.com/kernel/488903-patch-2-5-pagemap-change-kpagecount-return-map-count-not-reference-count-page.html self.assertTrue( count == 1, "Pagecount should be 1 becuase we did map the page, but is %d" % (count,) ) for i in xrange(0, size): map.write_byte(chr(i % 0xFF)) self.assertEqual(size, map.tell(), "Did not reach end of file") map.seek(0) self.assertEquals(0, map.tell(), "After seek(0): Pointer into mapping should be at 0") for i in xrange(0, size): expected = i % 0xFF found = ord(map.read_byte()) self.assertEqual(expected, found, "Expected value %x at %d, not %x" % (expected, i, found))