Commit 9bac1dbc authored by Felix Fu's avatar Felix Fu
Browse files

efi/libstub: add arm64 nokaslr memory regions

hulk inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I8RJ1I


CVE: NA

--------------------------------

allow users to mark at most 4 regions as not available for kaslr

Signed-off-by: default avatarFelix Fu <fuzhen5@huawei.com>
parent 68684c9c
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -68,6 +68,11 @@ efi_status_t efi_parse_options(char const *cmdline)
			break;

		if (!strcmp(param, "nokaslr")) {
#if defined (CONFIG_KASLR_SKIP_MEM_RANGE) && defined (CONFIG_ARM64)
			if (val)
				mem_avoid_mem_nokaslr(val);
			else
#endif
				efi_nokaslr = true;
		} else if (!strcmp(param, "quiet")) {
			efi_loglevel = CONSOLE_LOGLEVEL_QUIET;
+1 −0
Original line number Diff line number Diff line
@@ -1002,6 +1002,7 @@ void efi_parse_option_graphics(char *option);

#if defined (CONFIG_KASLR_SKIP_MEM_RANGE) && defined (CONFIG_ARM64)
void mem_avoid_memmap(char *str);
void mem_avoid_mem_nokaslr(char *str);
#endif

efi_status_t efi_setup_gop(struct screen_info *si, efi_guid_t *proto,
+35 −0
Original line number Diff line number Diff line
@@ -14,10 +14,13 @@
#define CAL_SLOTS_PHYADDR	 1

#define MAX_MEMMAP_REGIONS 32
#define MAX_MEM_NOKASLR_REGIONS	4

enum mem_avoid_index {
	MAX_MEMMAP_REGIONS_BEGIN = 0,
	MAX_MEMMAP_REGIONS_END = MAX_MEMMAP_REGIONS_BEGIN + MAX_MEMMAP_REGIONS - 1,
	MEM_AVOID_MEM_NOKASLR_BEGIN,
	MEM_AVOID_MEM_NOKASLR_END = MEM_AVOID_MEM_NOKASLR_BEGIN + MAX_MEM_NOKASLR_REGIONS - 1,
	MEM_AVOID_MAX,
};

@@ -135,6 +138,38 @@ void mem_avoid_memmap(char *str)
		i++;
	}
}

void mem_avoid_mem_nokaslr(char *str)
{
	int i = 0;

	while (str && (i < MAX_MEM_NOKASLR_REGIONS)) {
		char *oldstr;
		u64 start, end;
		char *k = strchr(str, ',');

		if (k)
			*k++ = 0;

		oldstr = str;
		start = memparse(str, &str);
		if (str == oldstr || *str != '-') {
			efi_warn("nokaslr values error.\n");
			break;
		}

		end = memparse(str + 1, &str);
		if (start >= end) {
			efi_warn("nokaslr values error, start should be less than end.\n");
			break;
		}

		mem_avoid[MEM_AVOID_MEM_NOKASLR_BEGIN + i].start = start;
		mem_avoid[MEM_AVOID_MEM_NOKASLR_BEGIN + i].size = end - start;
		str = k;
		i++;
	}
}
#endif
/*
 * Return the number of slots covered by this entry, i.e., the number of