xref: /kvmtool/kvm.c (revision 2da26a59d314c53d1144cb90d32ebbe0fb306e21)
1b8f6afcdSPekka Enberg #include "kvm/cpu.h"
2b8f6afcdSPekka Enberg 
36c7d8514SPekka Enberg #include <linux/kvm.h>
4*2da26a59SPekka Enberg #include <stdbool.h>
5b8f6afcdSPekka Enberg #include <stdlib.h>
6b8f6afcdSPekka Enberg #include <fcntl.h>
7b8f6afcdSPekka Enberg 
89b1fb1c3SPekka Enberg struct kvm {
99b1fb1c3SPekka Enberg 	int			fd;		/* /dev/kvm */
109b1fb1c3SPekka Enberg 	int			vmfd;
119b1fb1c3SPekka Enberg };
129b1fb1c3SPekka Enberg 
13*2da26a59SPekka Enberg static inline bool kvm__supports_extension(struct kvm *self, unsigned int extension)
14*2da26a59SPekka Enberg {
15*2da26a59SPekka Enberg 	int ret;
16*2da26a59SPekka Enberg 
17*2da26a59SPekka Enberg 	ret = ioctl(self->fd, KVM_CHECK_EXTENSION, extension);
18*2da26a59SPekka Enberg 	if (ret < 0)
19*2da26a59SPekka Enberg 		return false;
20*2da26a59SPekka Enberg 
21*2da26a59SPekka Enberg 	return ret;
22*2da26a59SPekka Enberg }
23*2da26a59SPekka Enberg 
24b8f6afcdSPekka Enberg static void die(const char *s)
25b8f6afcdSPekka Enberg {
26b8f6afcdSPekka Enberg 	perror(s);
27b8f6afcdSPekka Enberg 	exit(1);
28b8f6afcdSPekka Enberg }
29b8f6afcdSPekka Enberg 
30b8f6afcdSPekka Enberg static void cpu__reset(struct cpu *self)
31b8f6afcdSPekka Enberg {
32b8f6afcdSPekka Enberg 	self->regs.eip		= 0x000fff0UL;
33b8f6afcdSPekka Enberg 	self->regs.eflags	= 0x0000002UL;
34b8f6afcdSPekka Enberg }
35b8f6afcdSPekka Enberg 
36b8f6afcdSPekka Enberg static struct cpu *cpu__new(void)
37b8f6afcdSPekka Enberg {
38b8f6afcdSPekka Enberg 	return calloc(1, sizeof(struct cpu));
39b8f6afcdSPekka Enberg }
40b8f6afcdSPekka Enberg 
41b8f6afcdSPekka Enberg int main(int argc, char *argv[])
42b8f6afcdSPekka Enberg {
43b8f6afcdSPekka Enberg 	struct cpu *cpu;
449b1fb1c3SPekka Enberg 	struct kvm kvm;
4528fa19c0SPekka Enberg 	int ret;
46b8f6afcdSPekka Enberg 
479b1fb1c3SPekka Enberg 	kvm.fd = open("/dev/kvm", O_RDWR);
489b1fb1c3SPekka Enberg 	if (kvm.fd < 0)
49b8f6afcdSPekka Enberg 		die("open");
50b8f6afcdSPekka Enberg 
519b1fb1c3SPekka Enberg 	ret = ioctl(kvm.fd, KVM_GET_API_VERSION, 0);
526c7d8514SPekka Enberg 	if (ret != KVM_API_VERSION)
536c7d8514SPekka Enberg 		die("ioctl");
546c7d8514SPekka Enberg 
559b1fb1c3SPekka Enberg 	kvm.vmfd = ioctl(kvm.fd, KVM_CREATE_VM, 0);
569b1fb1c3SPekka Enberg 	if (kvm.vmfd < 0)
5728fa19c0SPekka Enberg 		die("open");
5828fa19c0SPekka Enberg 
59*2da26a59SPekka Enberg 	if (!kvm__supports_extension(&kvm, KVM_CAP_USER_MEMORY))
60*2da26a59SPekka Enberg 		die("KVM_CAP_USER_MEMORY");
61*2da26a59SPekka Enberg 
62b8f6afcdSPekka Enberg 	cpu = cpu__new();
63b8f6afcdSPekka Enberg 
64b8f6afcdSPekka Enberg 	cpu__reset(cpu);
65b8f6afcdSPekka Enberg 
66b8f6afcdSPekka Enberg 	return 0;
67b8f6afcdSPekka Enberg }
68