svn commit: r338523 - head/sbin/sysctl

Konstantin Belousov kostikbel at gmail.com
Fri Sep 7 16:26:20 UTC 2018


On Fri, Sep 07, 2018 at 09:00:20AM -0700, John Baldwin wrote:
> On 9/7/18 8:09 AM, Konstantin Belousov wrote:
> > Author: kib
> > Date: Fri Sep  7 15:09:56 2018
> > New Revision: 338523
> > URL: https://svnweb.freebsd.org/changeset/base/338523
> > 
> > Log:
> >   Teach sysctl(8) about the Persistent memory type.
> >   
> >   Add PersistentMemory to the list of sysctl's known memory types
> >   when decoding an EFI memory map.
> >   
> >   Submitted by:	D Scott Phillips <d.scott.phillips at intel.com>
> >   MFC after:	1 week
> >   Approved by:	re (rgrimes)
> > 
> > Modified:
> >   head/sbin/sysctl/sysctl.c
> > 
> > Modified: head/sbin/sysctl/sysctl.c
> > ==============================================================================
> > --- head/sbin/sysctl/sysctl.c	Fri Sep  7 14:37:44 2018	(r338522)
> > +++ head/sbin/sysctl/sysctl.c	Fri Sep  7 15:09:56 2018	(r338523)
> > @@ -704,7 +704,8 @@ S_efi_map(size_t l2, void *p)
> >  		"ACPIMemoryNVS",
> >  		"MemoryMappedIO",
> >  		"MemoryMappedIOPortSpace",
> > -		"PalCode"
> > +		"PalCode",
> > +		"PersistentMemory"
> >  	};
> >  
> >  	/*
> > @@ -733,7 +734,7 @@ S_efi_map(size_t l2, void *p)
> >  
> >  	for (i = 0; i < ndesc; i++,
> >  	    map = efi_next_descriptor(map, efihdr->descriptor_size)) {
> > -		if (map->md_type <= EFI_MD_TYPE_PALCODE)
> > +		if (map->md_type <= EFI_MD_TYPE_PERSISTENT)
> 
> Perhaps this should use nitems(types) instead?  (And I believe it's my
> fault it didn't originally.)

For me, it was more an issue that the code assumes contiguous values for
the EFI_MD_TYPEs constants.

What about the following:

diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c
index 427f3e2309b..3a7463ef411 100644
--- a/sbin/sysctl/sysctl.c
+++ b/sbin/sysctl/sysctl.c
@@ -691,21 +691,21 @@ S_efi_map(size_t l2, void *p)
 	int ndesc, i;
 
 	static const char *types[] = {
-		"Reserved",
-		"LoaderCode",
-		"LoaderData",
-		"BootServicesCode",
-		"BootServicesData",
-		"RuntimeServicesCode",
-		"RuntimeServicesData",
-		"ConventionalMemory",
-		"UnusableMemory",
-		"ACPIReclaimMemory",
-		"ACPIMemoryNVS",
-		"MemoryMappedIO",
-		"MemoryMappedIOPortSpace",
-		"PalCode",
-		"PersistentMemory"
+		[EFI_MD_TYPE_NULL] =	"Reserved",
+		[EFI_MD_TYPE_CODE] =	"LoaderCode",
+		[EFI_MD_TYPE_DATA] =	"LoaderData",
+		[EFI_MD_TYPE_BS_CODE] =	"BootServicesCode",
+		[EFI_MD_TYPE_BS_DATA] =	"BootServicesData",
+		[EFI_MD_TYPE_RT_CODE] =	"RuntimeServicesCode",
+		[EFI_MD_TYPE_RT_DATA] =	"RuntimeServicesData",
+		[EFI_MD_TYPE_FREE] =	"ConventionalMemory",
+		[EFI_MD_TYPE_BAD] =	"UnusableMemory",
+		[EFI_MD_TYPE_RECLAIM] =	"ACPIReclaimMemory",
+		[EFI_MD_TYPE_FIRMWARE] = "ACPIMemoryNVS",
+		[EFI_MD_TYPE_IOMEM] =	"MemoryMappedIO",
+		[EFI_MD_TYPE_IOPORT] =	"MemoryMappedIOPortSpace",
+		[EFI_MD_TYPE_PALCODE] =	"PalCode",
+		[EFI_MD_TYPE_PERSISTENT] = "PersistentMemory",
 	};
 
 	/*
@@ -734,9 +734,10 @@ S_efi_map(size_t l2, void *p)
 
 	for (i = 0; i < ndesc; i++,
 	    map = efi_next_descriptor(map, efihdr->descriptor_size)) {
-		if (map->md_type <= EFI_MD_TYPE_PERSISTENT)
+		type = NULL;
+		if (map->md_type < nitems(types))
 			type = types[map->md_type];
-		else
+		if (type == NULL)
 			type = "<INVALID>";
 		printf("\n%23s %012jx %12p %08jx ", type,
 		    (uintmax_t)map->md_phys, map->md_virt,


More information about the svn-src-all mailing list