diff --git a/dmidecode.c b/dmidecode.c
index 0d3d825..bd96efb 100644
--- a/dmidecode.c
+++ b/dmidecode.c
@@ -6209,6 +6209,7 @@ int main(int argc, char * const argv[])
 	size_t size;
 	int efi;
 	u8 *buf = NULL;
+	u64 scan_base = 0xF0000ULL;
 
 	/*
 	 * We don't want stdout and stderr to be mixed up if both are
@@ -6227,7 +6228,9 @@ int main(int argc, char * const argv[])
 	opt.devmem = DEFAULT_MEM_DEV;
 	opt.flags = 0;
 	opt.handle = ~0U;
-
+	#ifdef __OpenBSD__
+		opt.flags |= FLAG_NO_SYSFS;
+	#endif
 	if (parse_command_line(argc, argv)<0)
 	{
 		ret = 2;
@@ -6253,8 +6256,12 @@ int main(int argc, char * const argv[])
 	}
 
 	if (!(opt.flags & FLAG_QUIET))
+	{
 		pr_comment("dmidecode %s", VERSION);
-
+			#ifdef __OpenBSD__
+				pr_info("Defaulting to --no-sysfs on OpenBSD.");
+			#endif
+	}
 	/* Read from dump if so instructed */
 	size = 0x20;
 	if (opt.flags & FLAG_FROM_DUMP)
@@ -6359,10 +6366,21 @@ int main(int argc, char * const argv[])
 
 memory_scan:
 #if defined __i386__ || defined __x86_64__
+	/* Fallback to memory scan (x86, x86_64) */
 	if (!(opt.flags & FLAG_QUIET))
 		pr_info("Scanning %s for entry point.", opt.devmem);
-	/* Fallback to memory scan (x86, x86_64) */
-	if ((buf = mem_chunk(0xF0000, 0x10000, opt.devmem)) == NULL)
+
+        /* Use memory base address if provided */
+        if (opt.flags & FLAG_MEM_BASE)
+        {
+                scan_base = opt.mem_base;
+                if (!(opt.flags & FLAG_QUIET))
+                        pr_info("Scanning from memory base 0x%llx.", scan_base);
+        }
+        else
+                scan_base = 0xF0000;
+ 
+       if ((buf = mem_chunk(scan_base, 0x10000, opt.devmem)) == NULL)
 	{
 		ret = 1;
 		goto exit_free;
diff --git a/dmiopt.c b/dmiopt.c
index 0db14e0..2d68c26 100644
--- a/dmiopt.c
+++ b/dmiopt.c
@@ -30,10 +30,10 @@
 #include "util.h"
 #include "dmidecode.h"
 #include "dmiopt.h"
-
+#include "dmioutput.h"
 
 /* Options are global */
-struct opt opt;
+struct opt opt = {0};
 
 
 /*
@@ -266,11 +266,12 @@ int parse_command_line(int argc, char * const argv[])
 {
 	int option;
 	unsigned int i;
-	const char *optstring = "d:hqs:t:uH:V";
+	const char *optstring = "d:hqm:Qs:t:uB:F:H:O:SLTV";
 	struct option longopts[] = {
 		{ "dev-mem", required_argument, NULL, 'd' },
 		{ "help", no_argument, NULL, 'h' },
 		{ "quiet", no_argument, NULL, 'q' },
+		{ "mem-base", required_argument, NULL, 'm' },
 		{ "no-quirks", no_argument, NULL, 'Q' },
 		{ "string", required_argument, NULL, 's' },
 		{ "type", required_argument, NULL, 't' },
@@ -303,6 +304,14 @@ int parse_command_line(int argc, char * const argv[])
 			case 'h':
 				opt.flags |= FLAG_HELP;
 				break;
+                        case 'm':
+                                if (sscanf(optarg, "0x%llx", &opt.mem_base) != 1)
+                                {
+                                        pr_info("Memory base address in format 0x<address> required: %s\n", optarg);
+                                        return -1;
+                                } else
+                                        opt.flags |= FLAG_MEM_BASE;
+                                break;
 			case 'q':
 				opt.flags |= FLAG_QUIET;
 				break;
@@ -387,18 +396,19 @@ void print_help(void)
 		"Options are:\n"
 		" -d, --dev-mem FILE     Read memory from device FILE (default: " DEFAULT_MEM_DEV ")\n"
 		" -h, --help             Display this help text and exit\n"
+		" -m, --mem-base 0xADDR  Memory-scan for Entrypoint from base ADDR\n"
 		" -q, --quiet            Less verbose output\n"
-		"     --no-quirks        Decode everything without quirks\n"
+		" -Q, --no-quirks        Decode everything without quirks\n"
 		" -s, --string KEYWORD   Only display the value of the given DMI string\n"
-		"     --list-strings     List available string keywords and exit\n"
+		" -L, --list-strings     List available string keywords and exit\n"
 		" -t, --type TYPE        Only display the entries of given type\n"
-		"     --list-types       List available type keywords and exit\n"
+		" -T, --list-types       List available type keywords and exit\n"
 		" -H, --handle HANDLE    Only display the entry of given handle\n"
 		" -u, --dump             Do not decode the entries\n"
-		"     --dump-bin FILE    Dump the DMI data to a binary file\n"
-		"     --from-dump FILE   Read the DMI data from a binary file\n"
-		"     --no-sysfs         Do not attempt to read DMI data from sysfs files\n"
-		"     --oem-string N     Only display the value of the given OEM string\n"
+		" -B, --dump-bin FILE    Dump the DMI data to a binary file\n"
+		" -F, --from-dump FILE   Read the DMI data from a binary file\n"
+		" -S, --no-sysfs         Do not attempt to read DMI data from sysfs files\n"
+		" -O, --oem-string N     Only display the value of the given OEM string\n"
 		" -V, --version          Display the version and exit\n";
 
 	printf("%s", help);
diff --git a/dmiopt.h b/dmiopt.h
index ae04778..0e39803 100644
--- a/dmiopt.h
+++ b/dmiopt.h
@@ -32,6 +32,7 @@ struct opt
 {
 	const char *devmem;
 	unsigned int flags;
+	u64 mem_base;
 	u8 *type;
 	const struct string_keyword *string;
 	char *dumpfile;
@@ -48,6 +49,7 @@ extern struct opt opt;
 #define FLAG_NO_SYSFS           (1 << 6)
 #define FLAG_NO_QUIRKS          (1 << 7)
 #define FLAG_LIST               (1 << 8)
+#define FLAG_MEM_BASE           (1 << 9)
 
 int parse_command_line(int argc, char * const argv[]);
 void print_help(void);
diff --git a/man/dmidecode.8 b/man/dmidecode.8
index c4c292d..d0fcd66 100644
--- a/man/dmidecode.8
+++ b/man/dmidecode.8
@@ -72,7 +72,7 @@ Read memory from device \fIFILE\fP (default: \fI/dev/mem\fP)
 Be less verbose. Unknown, inactive and \s-1OEM\s0-specific entries are not
 displayed. Meta-data and handle references are hidden.
 .TP
-.BR "  " "  " "--no-quirks"
+.BR "-Q" ", " "--no-quirks"
 Decode everything exactly as it is in the table, without trying to fix up
 common mistakes or hide irrelevant fields.
 This mode is primarily aimed at firmware developers.
@@ -132,7 +132,7 @@ typically from files under
 .IR /sys/devices/virtual/dmi/id .
 Most of these files are even readable by regular users.
 .TP
-.BR "  " "  " "--list-strings"
+.BR "-L" ", " "--list-strings"
 List available string keywords, which can then be passed to the \fB--string\fP
 option.
 .TP
@@ -161,7 +161,7 @@ is printed and
 .B dmidecode
 exits with an error.
 .TP
-.BR "  " "  " "--list-types"
+.BR "-T" ", " "--list-types"
 List available type keywords, which can then be passed to the \fB--type\fP
 option.
 .TP
@@ -169,27 +169,35 @@ option.
 Only display the entry whose handle matches \fIHANDLE\fP.
 \fIHANDLE\fP is a 16-bit integer.
 .TP
+.BR "-m" ", " "--mem-base \fIADDRESS\fP"
+If memory-scanning (default: /dev/mem, see -d option above) is used,
+scan a 64kB range starting at \fIADDRESS\fP rather than the Legacy BIOS
+range 0xF0000 to 0xFFFFF. \fIADDRESS\fP format: 0xnnnnnnnnnnnnnnnn ,
+a 64-bit integer. Leading zeros may be omitted.
+Useful for legacy-free systems that do not have EFI or sysfs structures,
+which are tried first.
+.TP
 .BR "-u" ", " "--dump"
 Do not decode the entries, dump their contents as hexadecimal instead.
 Note that this is still a text output, no binary data will be thrown upon
 you. The strings attached to each entry are displayed as both
 hexadecimal and \s-1ASCII\s0. This option is mainly useful for debugging.
 .TP
-.BR "  " "  " "--dump-bin \fIFILE\fP"
+.BR "-B" ", " "--dump-bin \fIFILE\fP"
 Do not decode the entries, instead dump the DMI data to a file in binary
 form. The generated file is suitable to pass to \fB--from-dump\fP
 later.
 \fIFILE\fP must not exist.
 .TP
-.BR "  " "  " "--from-dump \fIFILE\fP"
+.BR "-F" ", " "--from-dump \fIFILE\fP"
 Read the DMI data from a binary file previously generated using
 \fB--dump-bin\fP.
 .TP
-.BR "  " "  " "--no-sysfs"
+.BR "-S" ", " "--no-sysfs"
 Do not attempt to read DMI data from sysfs files. This is mainly useful for
 debugging.
 .TP
-.BR "  " "  " "--oem-string \fIN\fP"
+.BR "-O" ", " "--oem-string \fIN\fP"
 Only display the value of the \s-1OEM\s0 string number \fIN\fP. The first
 \s-1OEM\s0 string has number \fB1\fP. With special value \fBcount\fP, return the
 number of OEM strings instead.
