diff options
Diffstat (limited to 'tools/testing/selftests/kvm/lib/kvm_util.c')
| -rw-r--r-- | tools/testing/selftests/kvm/lib/kvm_util.c | 62 | 
1 files changed, 56 insertions, 6 deletions
diff --git a/tools/testing/selftests/kvm/lib/kvm_util.c b/tools/testing/selftests/kvm/lib/kvm_util.c index e066d584c656..9bafe44cb978 100644 --- a/tools/testing/selftests/kvm/lib/kvm_util.c +++ b/tools/testing/selftests/kvm/lib/kvm_util.c @@ -51,13 +51,13 @@ int open_kvm_dev_path_or_exit(void)  	return _open_kvm_dev_path_or_exit(O_RDONLY);  } -static bool get_module_param_bool(const char *module_name, const char *param) +static ssize_t get_module_param(const char *module_name, const char *param, +				void *buffer, size_t buffer_size)  {  	const int path_size = 128;  	char path[path_size]; -	char value; -	ssize_t r; -	int fd; +	ssize_t bytes_read; +	int fd, r;  	r = snprintf(path, path_size, "/sys/module/%s/parameters/%s",  		     module_name, param); @@ -66,11 +66,46 @@ static bool get_module_param_bool(const char *module_name, const char *param)  	fd = open_path_or_exit(path, O_RDONLY); -	r = read(fd, &value, 1); -	TEST_ASSERT(r == 1, "read(%s) failed", path); +	bytes_read = read(fd, buffer, buffer_size); +	TEST_ASSERT(bytes_read > 0, "read(%s) returned %ld, wanted %ld bytes", +		    path, bytes_read, buffer_size);  	r = close(fd);  	TEST_ASSERT(!r, "close(%s) failed", path); +	return bytes_read; +} + +static int get_module_param_integer(const char *module_name, const char *param) +{ +	/* +	 * 16 bytes to hold a 64-bit value (1 byte per char), 1 byte for the +	 * NUL char, and 1 byte because the kernel sucks and inserts a newline +	 * at the end. +	 */ +	char value[16 + 1 + 1]; +	ssize_t r; + +	memset(value, '\0', sizeof(value)); + +	r = get_module_param(module_name, param, value, sizeof(value)); +	TEST_ASSERT(value[r - 1] == '\n', +		    "Expected trailing newline, got char '%c'", value[r - 1]); + +	/* +	 * Squash the newline, otherwise atoi_paranoid() will complain about +	 * trailing non-NUL characters in the string. +	 */ +	value[r - 1] = '\0'; +	return atoi_paranoid(value); +} + +static bool get_module_param_bool(const char *module_name, const char *param) +{ +	char value; +	ssize_t r; + +	r = get_module_param(module_name, param, &value, sizeof(value)); +	TEST_ASSERT_EQ(r, 1);  	if (value == 'Y')  		return true; @@ -95,6 +130,21 @@ bool get_kvm_amd_param_bool(const char *param)  	return get_module_param_bool("kvm_amd", param);  } +int get_kvm_param_integer(const char *param) +{ +	return get_module_param_integer("kvm", param); +} + +int get_kvm_intel_param_integer(const char *param) +{ +	return get_module_param_integer("kvm_intel", param); +} + +int get_kvm_amd_param_integer(const char *param) +{ +	return get_module_param_integer("kvm_amd", param); +} +  /*   * Capability   *  | 
