virtualmachine 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/README.md +21 -2
- data/ext/virtualmachine/virtualmachine.c +227 -35
- data/lib/virtualmachine.rb +1 -1
- data/sample/sample1.rb +39 -2
- data/virtualmachine.gemspec +1 -1
- metadata +2 -3
- data/ext/virtualmachine/Makefile +0 -237
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# VirtualMachine
|
2
2
|
|
3
|
-
|
3
|
+
virtualmachine allows to run your assembly code on a VMM instantly, using Ruby.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -18,7 +18,26 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
Here's a sample code.
|
22
|
+
This will create a VM named 'vm0' with 128MB memory, executes an assembly code witch passed to load_asm().
|
23
|
+
|
24
|
+
require 'virtualmachine'
|
25
|
+
vm0 = VirtualMachine.new('vm0', 128)
|
26
|
+
vm0.load_asm(<<EOS)
|
27
|
+
mov dx, 3F8h
|
28
|
+
mov al, 2Ah
|
29
|
+
loop:
|
30
|
+
out dx, al
|
31
|
+
jmp loop
|
32
|
+
EOS
|
33
|
+
vm0.run
|
34
|
+
|
35
|
+
## Limitations/TODO
|
36
|
+
- Currently, virtualmachine only supports FreeBSD-10 or later, because it built on BHyVe. Need to support Linux KVM.
|
37
|
+
- Page table, GDT, control registers are pre-initialized, hardcoded. Need to find better way to do it.
|
38
|
+
- No way to read/write guest registers and guest memory area. Need more APIs.
|
39
|
+
- Due to it's hardcoded, you can't choice 16bit/32bit mode. It always runs in 64bit mode.
|
40
|
+
- Because BHyVe doesn't have a BIOS, you have no way to call it.
|
22
41
|
|
23
42
|
## Contributing
|
24
43
|
|
@@ -106,25 +106,86 @@ VALUE vmctx_free(VALUE self)
|
|
106
106
|
return Qnil;
|
107
107
|
}
|
108
108
|
|
109
|
+
int _vm_create(const char *name)
|
110
|
+
{
|
111
|
+
int error = vm_create(name);
|
112
|
+
if (error)
|
113
|
+
rb_raise(rb_eException, "vm_create failed");
|
114
|
+
return error;
|
115
|
+
}
|
116
|
+
|
117
|
+
struct vmctx *_vm_open(const char *name)
|
118
|
+
{
|
119
|
+
struct vmctx *ctx = vm_open(name);
|
120
|
+
if (!ctx)
|
121
|
+
rb_raise(rb_eException, "vm_open failed");
|
122
|
+
return ctx;
|
123
|
+
}
|
124
|
+
|
125
|
+
int _vm_setup_memory(struct vmctx *ctx, size_t len, enum vm_mmap_style s)
|
126
|
+
{
|
127
|
+
int error = vm_setup_memory(ctx, len, s);
|
128
|
+
if (error)
|
129
|
+
rb_raise(rb_eException, "vm_setup_memory failed error=%d",
|
130
|
+
error);
|
131
|
+
return error;
|
132
|
+
}
|
133
|
+
|
134
|
+
void *_vm_map_gpa(struct vmctx *ctx, vm_paddr_t gaddr, size_t len)
|
135
|
+
{
|
136
|
+
void *paddr = vm_map_gpa(ctx, gaddr, len);
|
137
|
+
if (!paddr)
|
138
|
+
rb_raise(rb_eException, "vm_map_gpa failed");
|
139
|
+
return paddr;
|
140
|
+
}
|
141
|
+
|
142
|
+
int _vm_set_desc(struct vmctx *ctx, int vcpu, int reg,
|
143
|
+
uint64_t base, uint32_t limit, uint32_t access)
|
144
|
+
{
|
145
|
+
int error = vm_set_desc(ctx, vcpu, reg, base, limit, access);
|
146
|
+
if (error)
|
147
|
+
rb_raise(rb_eException, "vm_set_desc failed error=%d",
|
148
|
+
error);
|
149
|
+
return error;
|
150
|
+
}
|
151
|
+
|
152
|
+
int _vm_set_register(struct vmctx *ctx, int vcpu, int reg, uint64_t val)
|
153
|
+
{
|
154
|
+
int error = vm_set_register(ctx, vcpu, reg, val);
|
155
|
+
if (error)
|
156
|
+
rb_raise(rb_eException, "vm_set_register failed error=%d",
|
157
|
+
error);
|
158
|
+
return error;
|
159
|
+
}
|
160
|
+
|
161
|
+
int _vm_get_register(struct vmctx *ctx, int vcpu, int reg, uint64_t *retval)
|
162
|
+
{
|
163
|
+
int error = vm_get_register(ctx, vcpu, reg, retval);
|
164
|
+
if (error)
|
165
|
+
rb_raise(rb_eException, "vm_get_register failed error=%d",
|
166
|
+
error);
|
167
|
+
return error;
|
168
|
+
}
|
169
|
+
|
109
170
|
VALUE virtualmachine_initialize(VALUE self, VALUE vmname, VALUE memsize)
|
110
171
|
{
|
111
172
|
VALUE vctx;
|
112
173
|
struct vmctx *ctx;
|
113
174
|
uint64_t *gdt, *pt4, *pt3, *pt2;
|
114
|
-
int i;
|
175
|
+
int i, err;
|
115
176
|
|
116
|
-
|
117
|
-
ctx =
|
177
|
+
_vm_create(StringValuePtr(vmname));
|
178
|
+
ctx = _vm_open(StringValuePtr(vmname));
|
118
179
|
vctx = Data_Wrap_Struct(rb_cVMCtx, NULL, vmctx_free, ctx);
|
119
180
|
rb_iv_set(self, "@ctx", vctx);
|
120
181
|
rb_iv_set(self, "@vmname", vmname);
|
121
182
|
rb_iv_set(self, "@memsize", memsize);
|
122
|
-
|
183
|
+
_vm_setup_memory(ctx, FIX2INT(memsize) * MB, VM_MMAP_ALL);
|
123
184
|
|
124
|
-
pt4 =
|
125
|
-
pt3 =
|
126
|
-
pt2 =
|
127
|
-
gdt =
|
185
|
+
pt4 = _vm_map_gpa(ctx, ADDR_PT4, sizeof(uint64_t) * 512);
|
186
|
+
pt3 = _vm_map_gpa(ctx, ADDR_PT3, sizeof(uint64_t) * 512);
|
187
|
+
pt2 = _vm_map_gpa(ctx, ADDR_PT2, sizeof(uint64_t) * 512);
|
188
|
+
gdt = _vm_map_gpa(ctx, ADDR_GDT, sizeof(uint64_t) * 3);
|
128
189
|
|
129
190
|
bzero(pt4, PAGE_SIZE);
|
130
191
|
bzero(pt3, PAGE_SIZE);
|
@@ -143,31 +204,31 @@ VALUE virtualmachine_initialize(VALUE self, VALUE vmname, VALUE memsize)
|
|
143
204
|
gdt[GUEST_CODE_SEL] = 0x0020980000000000;
|
144
205
|
gdt[GUEST_DATA_SEL] = 0x0000900000000000;
|
145
206
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
207
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_CS, 0, 0, 0x0000209B);
|
208
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_DS, 0, 0, 0x00000093);
|
209
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_ES, 0, 0, 0x00000093);
|
210
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_FS, 0, 0, 0x00000093);
|
211
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_GS, 0, 0, 0x00000093);
|
212
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_SS, 0, 0, 0x00000093);
|
213
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_TR, 0, 0, 0x0000008b);
|
214
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_LDTR, 0, 0, DESC_UNUSABLE);
|
215
|
+
_vm_set_desc(ctx, 0, VM_REG_GUEST_GDTR, ADDR_GDT, GUEST_GDTR_LIMIT, 0);
|
216
|
+
|
217
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_CS, GSEL(GUEST_CODE_SEL, SEL_KPL));
|
218
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_DS, GSEL(GUEST_DATA_SEL, SEL_KPL));
|
219
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_ES, GSEL(GUEST_DATA_SEL, SEL_KPL));
|
220
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_FS, GSEL(GUEST_DATA_SEL, SEL_KPL));
|
221
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_GS, GSEL(GUEST_DATA_SEL, SEL_KPL));
|
222
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_SS, GSEL(GUEST_DATA_SEL, SEL_KPL));
|
223
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_TR, 0);
|
224
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_LDTR, 0);
|
225
|
+
|
226
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_CR0, CR0_PG | CR0_PE | CR0_NE);
|
227
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_CR3, ADDR_PT4);
|
228
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_CR4, CR4_PAE | CR4_VMXE);
|
229
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_EFER, EFER_LMA | EFER_LME);
|
230
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_RFLAGS, 0x2);
|
231
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_RSP, ADDR_STACK);
|
171
232
|
|
172
233
|
return self;
|
173
234
|
}
|
@@ -179,16 +240,147 @@ VALUE virtualmachine_load_binary(VALUE self, VALUE program)
|
|
179
240
|
unsigned char *entry;
|
180
241
|
|
181
242
|
Data_Get_Struct(vctx, struct vmctx, ctx);
|
182
|
-
|
243
|
+
if (!ctx)
|
244
|
+
rb_bug("ctx is null");
|
245
|
+
entry = _vm_map_gpa(ctx, ADDR_ENTRY, RSTRING_LEN(program));
|
183
246
|
memcpy(entry, StringValuePtr(program), RSTRING_LEN(program));
|
184
|
-
|
247
|
+
_vm_set_register(ctx, 0, VM_REG_GUEST_RIP, ADDR_ENTRY);
|
185
248
|
return Qnil;
|
186
249
|
}
|
187
250
|
|
251
|
+
VALUE virtualmachine_destroy(VALUE self)
|
252
|
+
{
|
253
|
+
VALUE vctx = rb_iv_get(self, "@ctx");
|
254
|
+
struct vmctx *ctx;
|
255
|
+
Data_Get_Struct(vctx, struct vmctx, ctx);
|
256
|
+
if (!ctx)
|
257
|
+
rb_bug("ctx is null");
|
258
|
+
vm_destroy(ctx);
|
259
|
+
return Qnil;
|
260
|
+
}
|
261
|
+
|
262
|
+
#define GETREG(func, reg) \
|
263
|
+
static VALUE func(VALUE self) \
|
264
|
+
{ \
|
265
|
+
VALUE vctx = rb_iv_get(self, "@ctx"); \
|
266
|
+
struct vmctx *ctx; \
|
267
|
+
uint64_t value; \
|
268
|
+
Data_Get_Struct(vctx, struct vmctx, ctx); \
|
269
|
+
_vm_get_register(ctx, 0, reg, &value); \
|
270
|
+
return ULL2NUM(value); \
|
271
|
+
}
|
272
|
+
|
273
|
+
#define SETREG(func, reg) \
|
274
|
+
static VALUE func(VALUE self, VALUE value) \
|
275
|
+
{ \
|
276
|
+
VALUE vctx = rb_iv_get(self, "@ctx"); \
|
277
|
+
struct vmctx *ctx; \
|
278
|
+
Data_Get_Struct(vctx, struct vmctx, ctx); \
|
279
|
+
_vm_set_register(ctx, 0, reg, NUM2ULL(value)); \
|
280
|
+
return Qnil; \
|
281
|
+
}
|
282
|
+
|
283
|
+
GETREG(virtualmachine_get_rax, VM_REG_GUEST_RAX);
|
284
|
+
GETREG(virtualmachine_get_rbx, VM_REG_GUEST_RBX);
|
285
|
+
GETREG(virtualmachine_get_rcx, VM_REG_GUEST_RCX);
|
286
|
+
GETREG(virtualmachine_get_rdx, VM_REG_GUEST_RDX);
|
287
|
+
GETREG(virtualmachine_get_rsi, VM_REG_GUEST_RSI);
|
288
|
+
GETREG(virtualmachine_get_rdi, VM_REG_GUEST_RDI);
|
289
|
+
GETREG(virtualmachine_get_rbp, VM_REG_GUEST_RBP);
|
290
|
+
GETREG(virtualmachine_get_r8, VM_REG_GUEST_R8);
|
291
|
+
GETREG(virtualmachine_get_r9, VM_REG_GUEST_R9);
|
292
|
+
GETREG(virtualmachine_get_r10, VM_REG_GUEST_R10);
|
293
|
+
GETREG(virtualmachine_get_r11, VM_REG_GUEST_R11);
|
294
|
+
GETREG(virtualmachine_get_r12, VM_REG_GUEST_R12);
|
295
|
+
GETREG(virtualmachine_get_r13, VM_REG_GUEST_R13);
|
296
|
+
GETREG(virtualmachine_get_r14, VM_REG_GUEST_R14);
|
297
|
+
GETREG(virtualmachine_get_r15, VM_REG_GUEST_R15);
|
298
|
+
GETREG(virtualmachine_get_cr0, VM_REG_GUEST_CR0);
|
299
|
+
GETREG(virtualmachine_get_cr3, VM_REG_GUEST_CR3);
|
300
|
+
GETREG(virtualmachine_get_cr4, VM_REG_GUEST_CR4);
|
301
|
+
GETREG(virtualmachine_get_dr7, VM_REG_GUEST_DR7);
|
302
|
+
GETREG(virtualmachine_get_rsp, VM_REG_GUEST_RSP);
|
303
|
+
GETREG(virtualmachine_get_rip, VM_REG_GUEST_RIP);
|
304
|
+
GETREG(virtualmachine_get_rflags, VM_REG_GUEST_RFLAGS);
|
305
|
+
GETREG(virtualmachine_get_efer, VM_REG_GUEST_EFER);
|
306
|
+
|
307
|
+
SETREG(virtualmachine_set_rax, VM_REG_GUEST_RAX);
|
308
|
+
SETREG(virtualmachine_set_rbx, VM_REG_GUEST_RBX);
|
309
|
+
SETREG(virtualmachine_set_rcx, VM_REG_GUEST_RCX);
|
310
|
+
SETREG(virtualmachine_set_rdx, VM_REG_GUEST_RDX);
|
311
|
+
SETREG(virtualmachine_set_rsi, VM_REG_GUEST_RSI);
|
312
|
+
SETREG(virtualmachine_set_rdi, VM_REG_GUEST_RDI);
|
313
|
+
SETREG(virtualmachine_set_rbp, VM_REG_GUEST_RBP);
|
314
|
+
SETREG(virtualmachine_set_r8, VM_REG_GUEST_R8);
|
315
|
+
SETREG(virtualmachine_set_r9, VM_REG_GUEST_R9);
|
316
|
+
SETREG(virtualmachine_set_r10, VM_REG_GUEST_R10);
|
317
|
+
SETREG(virtualmachine_set_r11, VM_REG_GUEST_R11);
|
318
|
+
SETREG(virtualmachine_set_r12, VM_REG_GUEST_R12);
|
319
|
+
SETREG(virtualmachine_set_r13, VM_REG_GUEST_R13);
|
320
|
+
SETREG(virtualmachine_set_r14, VM_REG_GUEST_R14);
|
321
|
+
SETREG(virtualmachine_set_r15, VM_REG_GUEST_R15);
|
322
|
+
SETREG(virtualmachine_set_cr0, VM_REG_GUEST_CR0);
|
323
|
+
SETREG(virtualmachine_set_cr3, VM_REG_GUEST_CR3);
|
324
|
+
SETREG(virtualmachine_set_cr4, VM_REG_GUEST_CR4);
|
325
|
+
SETREG(virtualmachine_set_dr7, VM_REG_GUEST_DR7);
|
326
|
+
SETREG(virtualmachine_set_rsp, VM_REG_GUEST_RSP);
|
327
|
+
SETREG(virtualmachine_set_rip, VM_REG_GUEST_RIP);
|
328
|
+
SETREG(virtualmachine_set_rflags, VM_REG_GUEST_RFLAGS);
|
329
|
+
SETREG(virtualmachine_set_efer, VM_REG_GUEST_EFER);
|
330
|
+
|
188
331
|
void Init_virtualmachine(void)
|
189
332
|
{
|
190
333
|
rb_cVirtualMachine = rb_define_class("VirtualMachine", rb_cObject);
|
191
334
|
rb_cVMCtx = rb_define_class("VMCtx", rb_cObject);
|
192
335
|
rb_define_method(rb_cVirtualMachine, "initialize", virtualmachine_initialize, 2);
|
193
336
|
rb_define_method(rb_cVirtualMachine, "load_binary", virtualmachine_load_binary, 1);
|
337
|
+
rb_define_method(rb_cVirtualMachine, "rax", virtualmachine_get_rax, 0);
|
338
|
+
rb_define_method(rb_cVirtualMachine, "rbx", virtualmachine_get_rbx, 0);
|
339
|
+
rb_define_method(rb_cVirtualMachine, "rcx", virtualmachine_get_rcx, 0);
|
340
|
+
rb_define_method(rb_cVirtualMachine, "rdx", virtualmachine_get_rdx, 0);
|
341
|
+
rb_define_method(rb_cVirtualMachine, "rsi", virtualmachine_get_rsi, 0);
|
342
|
+
rb_define_method(rb_cVirtualMachine, "rdi", virtualmachine_get_rdi, 0);
|
343
|
+
rb_define_method(rb_cVirtualMachine, "rbp", virtualmachine_get_rbp, 0);
|
344
|
+
rb_define_method(rb_cVirtualMachine, "r8", virtualmachine_get_r8, 0);
|
345
|
+
rb_define_method(rb_cVirtualMachine, "r9", virtualmachine_get_r9, 0);
|
346
|
+
rb_define_method(rb_cVirtualMachine, "r10", virtualmachine_get_r10, 0);
|
347
|
+
rb_define_method(rb_cVirtualMachine, "r11", virtualmachine_get_r11, 0);
|
348
|
+
rb_define_method(rb_cVirtualMachine, "r12", virtualmachine_get_r12, 0);
|
349
|
+
rb_define_method(rb_cVirtualMachine, "r13", virtualmachine_get_r13, 0);
|
350
|
+
rb_define_method(rb_cVirtualMachine, "r14", virtualmachine_get_r14, 0);
|
351
|
+
rb_define_method(rb_cVirtualMachine, "r15", virtualmachine_get_r15, 0);
|
352
|
+
rb_define_method(rb_cVirtualMachine, "cr0", virtualmachine_get_cr0, 0);
|
353
|
+
rb_define_method(rb_cVirtualMachine, "cr3", virtualmachine_get_cr3, 0);
|
354
|
+
rb_define_method(rb_cVirtualMachine, "cr4", virtualmachine_get_cr4, 0);
|
355
|
+
rb_define_method(rb_cVirtualMachine, "dr7", virtualmachine_get_dr7, 0);
|
356
|
+
rb_define_method(rb_cVirtualMachine, "rsp", virtualmachine_get_rsp, 0);
|
357
|
+
rb_define_method(rb_cVirtualMachine, "rip", virtualmachine_get_rip, 0);
|
358
|
+
rb_define_method(rb_cVirtualMachine, "rflags", virtualmachine_get_rflags, 0);
|
359
|
+
rb_define_method(rb_cVirtualMachine, "efer", virtualmachine_get_efer, 0);
|
360
|
+
|
361
|
+
rb_define_method(rb_cVirtualMachine, "rax=", virtualmachine_set_rax, 1);
|
362
|
+
rb_define_method(rb_cVirtualMachine, "rbx=", virtualmachine_set_rbx, 1);
|
363
|
+
rb_define_method(rb_cVirtualMachine, "rcx=", virtualmachine_set_rcx, 1);
|
364
|
+
rb_define_method(rb_cVirtualMachine, "rdx=", virtualmachine_set_rdx, 1);
|
365
|
+
rb_define_method(rb_cVirtualMachine, "rsi=", virtualmachine_set_rsi, 1);
|
366
|
+
rb_define_method(rb_cVirtualMachine, "rdi=", virtualmachine_set_rdi, 1);
|
367
|
+
rb_define_method(rb_cVirtualMachine, "rbp=", virtualmachine_set_rbp, 1);
|
368
|
+
rb_define_method(rb_cVirtualMachine, "r8=", virtualmachine_set_r8, 1);
|
369
|
+
rb_define_method(rb_cVirtualMachine, "r9=", virtualmachine_set_r9, 1);
|
370
|
+
rb_define_method(rb_cVirtualMachine, "r10=", virtualmachine_set_r10, 1);
|
371
|
+
rb_define_method(rb_cVirtualMachine, "r11=", virtualmachine_set_r11, 1);
|
372
|
+
rb_define_method(rb_cVirtualMachine, "r12=", virtualmachine_set_r12, 1);
|
373
|
+
rb_define_method(rb_cVirtualMachine, "r13=", virtualmachine_set_r13, 1);
|
374
|
+
rb_define_method(rb_cVirtualMachine, "r14=", virtualmachine_set_r14, 1);
|
375
|
+
rb_define_method(rb_cVirtualMachine, "r15=", virtualmachine_set_r15, 1);
|
376
|
+
rb_define_method(rb_cVirtualMachine, "cr0=", virtualmachine_set_cr0, 1);
|
377
|
+
rb_define_method(rb_cVirtualMachine, "cr3=", virtualmachine_set_cr3, 1);
|
378
|
+
rb_define_method(rb_cVirtualMachine, "cr4=", virtualmachine_set_cr4, 1);
|
379
|
+
rb_define_method(rb_cVirtualMachine, "dr7=", virtualmachine_set_dr7, 1);
|
380
|
+
rb_define_method(rb_cVirtualMachine, "rsp=", virtualmachine_set_rsp, 1);
|
381
|
+
rb_define_method(rb_cVirtualMachine, "rip=", virtualmachine_set_rip, 1);
|
382
|
+
rb_define_method(rb_cVirtualMachine, "rflags=", virtualmachine_set_rflags, 1);
|
383
|
+
rb_define_method(rb_cVirtualMachine, "efer=", virtualmachine_set_efer, 1);
|
384
|
+
|
385
|
+
rb_define_method(rb_cVirtualMachine, "destroy", virtualmachine_destroy, 0);
|
194
386
|
}
|
data/lib/virtualmachine.rb
CHANGED
data/sample/sample1.rb
CHANGED
@@ -1,11 +1,48 @@
|
|
1
1
|
require 'virtualmachine'
|
2
2
|
|
3
|
+
if ARGV.size < 2
|
4
|
+
puts "sample1.rb [char] [repeat]"
|
5
|
+
exit 1
|
6
|
+
end
|
7
|
+
|
8
|
+
puts "[args]"
|
9
|
+
puts "char:#{ARGV[0]}"
|
10
|
+
puts "repeat:#{ARGV[1]}"
|
11
|
+
puts
|
12
|
+
|
3
13
|
vm0 = VirtualMachine.new('vm0', 128)
|
14
|
+
vm0.rax = ARGV[0].bytes.to_a[0]
|
15
|
+
vm0.rcx = ARGV[1].to_i
|
4
16
|
vm0.load_asm(<<EOS)
|
5
17
|
mov dx, 3F8h
|
6
|
-
mov al, 2Ah
|
7
18
|
loop:
|
8
19
|
out dx, al
|
9
|
-
|
20
|
+
dec cx
|
21
|
+
cmp cx, 0
|
22
|
+
jne loop
|
23
|
+
mov al, 0ah
|
24
|
+
out dx, al
|
25
|
+
|
26
|
+
mov dx, 10h
|
27
|
+
mov al, 0h
|
28
|
+
out dx, al
|
10
29
|
EOS
|
30
|
+
|
31
|
+
puts "[registers]"
|
32
|
+
puts "rax:#{vm0.rax}"
|
33
|
+
puts "rbx:#{vm0.rbx}"
|
34
|
+
puts "rcx:#{vm0.rcx}"
|
35
|
+
puts "rdx:#{vm0.rdx}"
|
36
|
+
puts "rip:#{vm0.rip}"
|
37
|
+
puts
|
38
|
+
|
39
|
+
puts "[run vm]"
|
11
40
|
vm0.run
|
41
|
+
|
42
|
+
puts
|
43
|
+
puts "[registers]"
|
44
|
+
puts "rax:#{vm0.rax}"
|
45
|
+
puts "rbx:#{vm0.rbx}"
|
46
|
+
puts "rcx:#{vm0.rcx}"
|
47
|
+
puts "rdx:#{vm0.rdx}"
|
48
|
+
puts "rip:#{vm0.rip}"
|
data/virtualmachine.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "virtualmachine"
|
7
|
-
spec.version = "0.0.
|
7
|
+
spec.version = "0.0.3"
|
8
8
|
spec.authors = ["Takuya ASADA"]
|
9
9
|
spec.email = ["syuu@dokukino.com"]
|
10
10
|
spec.extensions = ["ext/virtualmachine/extconf.rb"]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: virtualmachine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-12-
|
12
|
+
date: 2013-12-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -72,7 +72,6 @@ files:
|
|
72
72
|
- LICENSE.txt
|
73
73
|
- README.md
|
74
74
|
- Rakefile
|
75
|
-
- ext/virtualmachine/Makefile
|
76
75
|
- ext/virtualmachine/extconf.rb
|
77
76
|
- ext/virtualmachine/virtualmachine.c
|
78
77
|
- lib/virtualmachine.rb
|
data/ext/virtualmachine/Makefile
DELETED
@@ -1,237 +0,0 @@
|
|
1
|
-
|
2
|
-
SHELL = /bin/sh
|
3
|
-
|
4
|
-
# V=0 quiet, V=1 verbose. other values don't work.
|
5
|
-
V = 0
|
6
|
-
Q1 = $(V:1=)
|
7
|
-
Q = $(Q1:0=@)
|
8
|
-
ECHO1 = $(V:1=@:)
|
9
|
-
ECHO = $(ECHO1:0=@echo)
|
10
|
-
|
11
|
-
#### Start of system configuration section. ####
|
12
|
-
|
13
|
-
srcdir = .
|
14
|
-
topdir = /usr/local/include/ruby-2.0//amd64-freebsd10/ruby/
|
15
|
-
hdrdir = /usr/local/include/ruby-2.0/
|
16
|
-
arch_hdrdir = /usr/local/include/ruby-2.0//amd64-freebsd10
|
17
|
-
PATH_SEPARATOR = :
|
18
|
-
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
|
19
|
-
prefix = /usr/local
|
20
|
-
rubysitearchprefix = $(rubylibprefix)/$(sitearch)
|
21
|
-
rubyarchprefix = $(rubylibprefix)/$(arch)
|
22
|
-
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
|
23
|
-
exec_prefix = $(prefix)
|
24
|
-
vendorarchhdrdir = $(vendorhdrdir)/$(sitearch)
|
25
|
-
sitearchhdrdir = $(sitehdrdir)/$(sitearch)
|
26
|
-
rubyarchhdrdir = $(rubyhdrdir)/$(arch)
|
27
|
-
vendorhdrdir = $(rubyhdrdir)/vendor_ruby
|
28
|
-
sitehdrdir = $(rubyhdrdir)/site_ruby
|
29
|
-
rubyhdrdir = $(DESTDIR)/usr/local/include/ruby-2.0/
|
30
|
-
vendorarchdir = $(vendorlibdir)/$(sitearch)
|
31
|
-
vendorlibdir = $(vendordir)/$(ruby_version)
|
32
|
-
vendordir = $(DESTDIR)/usr/local/lib/ruby/vendor_ruby
|
33
|
-
sitearchdir = $(sitelibdir)/$(sitearch)
|
34
|
-
sitelibdir = $(sitedir)/$(ruby_version)
|
35
|
-
sitedir = $(DESTDIR)/usr/local/lib/ruby/site_ruby
|
36
|
-
rubyarchdir = $(rubylibdir)/$(arch)
|
37
|
-
rubylibdir = $(rubylibprefix)/$(ruby_version)
|
38
|
-
sitearchincludedir = $(includedir)/$(sitearch)
|
39
|
-
archincludedir = $(includedir)/$(arch)
|
40
|
-
sitearchlibdir = $(libdir)/$(sitearch)
|
41
|
-
archlibdir = $(libdir)/$(arch)
|
42
|
-
ridir = $(datarootdir)/$(RI_BASE_NAME)
|
43
|
-
mandir = $(DESTDIR)/usr/local/man
|
44
|
-
localedir = $(datarootdir)/locale
|
45
|
-
libdir = $(exec_prefix)/lib
|
46
|
-
psdir = $(docdir)
|
47
|
-
pdfdir = $(docdir)
|
48
|
-
dvidir = $(docdir)
|
49
|
-
htmldir = $(docdir)
|
50
|
-
infodir = $(DESTDIR)/usr/local/info
|
51
|
-
docdir = $(DESTDIR)/usr/local/share/doc/ruby20
|
52
|
-
oldincludedir = /usr/include
|
53
|
-
includedir = $(prefix)/include
|
54
|
-
localstatedir = $(prefix)/var
|
55
|
-
sharedstatedir = $(prefix)/com
|
56
|
-
sysconfdir = $(prefix)/etc
|
57
|
-
datadir = $(datarootdir)
|
58
|
-
datarootdir = $(prefix)/share
|
59
|
-
libexecdir = $(exec_prefix)/libexec
|
60
|
-
sbindir = $(exec_prefix)/sbin
|
61
|
-
bindir = $(exec_prefix)/bin
|
62
|
-
archdir = $(rubyarchdir)
|
63
|
-
|
64
|
-
|
65
|
-
CC = cc
|
66
|
-
CXX = c++
|
67
|
-
LIBRUBY = $(LIBRUBY_SO)
|
68
|
-
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
69
|
-
LIBRUBYARG_SHARED = -Wl,-R -Wl,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)
|
70
|
-
LIBRUBYARG_STATIC = -Wl,-R -Wl,$(libdir) -L$(libdir) -l$(RUBY_SO_NAME)-static
|
71
|
-
empty =
|
72
|
-
OUTFLAG = -o $(empty)
|
73
|
-
COUTFLAG = -o $(empty)
|
74
|
-
|
75
|
-
RUBY_EXTCONF_H =
|
76
|
-
cflags = $(optflags) $(debugflags) $(warnflags)
|
77
|
-
optflags = -O3 -fno-fast-math -fno-omit-frame-pointer
|
78
|
-
debugflags =
|
79
|
-
warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration
|
80
|
-
CCDLFLAGS = -fPIC
|
81
|
-
CFLAGS = $(CCDLFLAGS) -O3 -fno-fast-math -fno-omit-frame-pointer -I/usr/local/include -O2 -pipe -fno-strict-aliasing -fPIC $(ARCH_FLAG)
|
82
|
-
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
|
83
|
-
DEFS =
|
84
|
-
CPPFLAGS = -DHAVE_VMMAPI_H -I/usr/include $(DEFS) $(cppflags)
|
85
|
-
CXXFLAGS = $(CCDLFLAGS) -O3 -fno-fast-math -fno-omit-frame-pointer -O2 -pipe -fno-strict-aliasing $(ARCH_FLAG)
|
86
|
-
ldflags = -L. -Wl,-rpath=/usr/local/lib -pthread -fstack-protector -rdynamic
|
87
|
-
dldflags =
|
88
|
-
ARCH_FLAG =
|
89
|
-
DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
|
90
|
-
LDSHARED = $(CC) -shared
|
91
|
-
LDSHAREDXX = $(CXX) -shared
|
92
|
-
AR = ar
|
93
|
-
EXEEXT =
|
94
|
-
|
95
|
-
RUBY_INSTALL_NAME = ruby20
|
96
|
-
RUBY_SO_NAME = ruby20
|
97
|
-
RUBYW_INSTALL_NAME =
|
98
|
-
RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version)
|
99
|
-
RUBYW_BASE_NAME = rubyw
|
100
|
-
RUBY_BASE_NAME = ruby
|
101
|
-
|
102
|
-
arch = amd64-freebsd10
|
103
|
-
sitearch = $(arch)
|
104
|
-
ruby_version = 2.0
|
105
|
-
ruby = $(bindir)/ruby20
|
106
|
-
RUBY = $(ruby)
|
107
|
-
ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h
|
108
|
-
|
109
|
-
RM = rm -f
|
110
|
-
RM_RF = $(RUBY) -run -e rm -- -rf
|
111
|
-
RMDIRS = rmdir -p
|
112
|
-
MAKEDIRS = /bin/mkdir -p
|
113
|
-
INSTALL = /usr/bin/install -c -o root -g wheel
|
114
|
-
INSTALL_PROG = $(INSTALL) -m 0755
|
115
|
-
INSTALL_DATA = install -o root -g wheel -m 444
|
116
|
-
COPY = cp
|
117
|
-
TOUCH = exit >
|
118
|
-
|
119
|
-
#### End of system configuration section. ####
|
120
|
-
|
121
|
-
preload =
|
122
|
-
|
123
|
-
libpath = . $(libdir) /usr/lib
|
124
|
-
LIBPATH = -L. -L$(libdir) -Wl,-R$(libdir) -L/usr/lib -Wl,-R/usr/lib
|
125
|
-
DEFFILE =
|
126
|
-
|
127
|
-
CLEANFILES = mkmf.log
|
128
|
-
DISTCLEANFILES =
|
129
|
-
DISTCLEANDIRS =
|
130
|
-
|
131
|
-
extout =
|
132
|
-
extout_prefix =
|
133
|
-
target_prefix =
|
134
|
-
LOCAL_LIBS =
|
135
|
-
LIBS = $(LIBRUBYARG_SHARED) -lvmmapi -lutil -lexecinfo -lpthread -lcrypt -lm -L/usr/local/lib -Wl,-rpath=/usr/local/lib -pthread -lc
|
136
|
-
ORIG_SRCS = bhyve.c
|
137
|
-
SRCS = $(ORIG_SRCS)
|
138
|
-
OBJS = bhyve.o
|
139
|
-
HDRS =
|
140
|
-
TARGET = bhyve
|
141
|
-
TARGET_NAME = bhyve
|
142
|
-
TARGET_ENTRY = Init_$(TARGET_NAME)
|
143
|
-
DLLIB = $(TARGET).so
|
144
|
-
EXTSTATIC =
|
145
|
-
STATIC_LIB =
|
146
|
-
|
147
|
-
BINDIR = $(DESTDIR)$(bindir)
|
148
|
-
RUBYCOMMONDIR = $(DESTDIR)$(sitedir)$(target_prefix)
|
149
|
-
RUBYLIBDIR = $(DESTDIR)$(sitelibdir)$(target_prefix)
|
150
|
-
RUBYARCHDIR = $(DESTDIR)$(sitearchdir)$(target_prefix)
|
151
|
-
HDRDIR = $(DESTDIR)$(rubyhdrdir)/ruby$(target_prefix)
|
152
|
-
ARCHHDRDIR = $(DESTDIR)$(rubyhdrdir)/$(arch)/ruby$(target_prefix)
|
153
|
-
|
154
|
-
TARGET_SO = $(DLLIB)
|
155
|
-
CLEANLIBS = $(TARGET).so
|
156
|
-
CLEANOBJS = *.o *.bak
|
157
|
-
|
158
|
-
all: $(DLLIB)
|
159
|
-
static: $(STATIC_LIB)
|
160
|
-
.PHONY: all install static install-so install-rb
|
161
|
-
.PHONY: clean clean-so clean-static clean-rb
|
162
|
-
|
163
|
-
clean-static::
|
164
|
-
clean-rb-default::
|
165
|
-
clean-rb::
|
166
|
-
clean-so::
|
167
|
-
clean: clean-so clean-static clean-rb-default clean-rb
|
168
|
-
-$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time
|
169
|
-
|
170
|
-
distclean-rb-default::
|
171
|
-
distclean-rb::
|
172
|
-
distclean-so::
|
173
|
-
distclean-static::
|
174
|
-
distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb
|
175
|
-
-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
|
176
|
-
-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
|
177
|
-
-$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true
|
178
|
-
|
179
|
-
realclean: distclean
|
180
|
-
install: install-so install-rb
|
181
|
-
|
182
|
-
install-so: $(DLLIB) ./.RUBYARCHDIR.time
|
183
|
-
$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
|
184
|
-
clean-static::
|
185
|
-
-$(Q)$(RM) $(STATIC_LIB)
|
186
|
-
install-rb: pre-install-rb install-rb-default
|
187
|
-
install-rb-default: pre-install-rb-default
|
188
|
-
pre-install-rb: Makefile
|
189
|
-
pre-install-rb-default: Makefile
|
190
|
-
pre-install-rb-default:
|
191
|
-
$(ECHO) installing default bhyve libraries
|
192
|
-
./.RUBYARCHDIR.time:
|
193
|
-
$(Q) $(MAKEDIRS) $(RUBYARCHDIR)
|
194
|
-
$(Q) $(TOUCH) $@
|
195
|
-
|
196
|
-
site-install: site-install-so site-install-rb
|
197
|
-
site-install-so: install-so
|
198
|
-
site-install-rb: install-rb
|
199
|
-
|
200
|
-
.SUFFIXES: .c .m .cc .mm .cxx .cpp .C .o
|
201
|
-
|
202
|
-
.cc.o:
|
203
|
-
$(ECHO) compiling $(<)
|
204
|
-
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
205
|
-
|
206
|
-
.mm.o:
|
207
|
-
$(ECHO) compiling $(<)
|
208
|
-
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
209
|
-
|
210
|
-
.cxx.o:
|
211
|
-
$(ECHO) compiling $(<)
|
212
|
-
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
213
|
-
|
214
|
-
.cpp.o:
|
215
|
-
$(ECHO) compiling $(<)
|
216
|
-
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
217
|
-
|
218
|
-
.C.o:
|
219
|
-
$(ECHO) compiling $(<)
|
220
|
-
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
221
|
-
|
222
|
-
.c.o:
|
223
|
-
$(ECHO) compiling $(<)
|
224
|
-
$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
|
225
|
-
|
226
|
-
.m.o:
|
227
|
-
$(ECHO) compiling $(<)
|
228
|
-
$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
|
229
|
-
|
230
|
-
$(DLLIB): $(OBJS) Makefile
|
231
|
-
$(ECHO) linking shared-object $(DLLIB)
|
232
|
-
-$(Q)$(RM) $(@)
|
233
|
-
$(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
$(OBJS): $(HDRS) $(ruby_headers)
|