Lines Matching refs:cpu
66 static struct lguest_pages *lguest_pages(unsigned int cpu) in lguest_pages() argument
68 return &(((struct lguest_pages *)(switcher_addr + PAGE_SIZE))[cpu]); in lguest_pages()
84 static void copy_in_guest_info(struct lg_cpu *cpu, struct lguest_pages *pages) in copy_in_guest_info() argument
92 if (__this_cpu_read(lg_last_cpu) != cpu || cpu->last_pages != pages) { in copy_in_guest_info()
93 __this_cpu_write(lg_last_cpu, cpu); in copy_in_guest_info()
94 cpu->last_pages = pages; in copy_in_guest_info()
95 cpu->changed = CHANGED_ALL; in copy_in_guest_info()
107 map_switcher_in_guest(cpu, pages); in copy_in_guest_info()
113 pages->state.guest_tss.sp1 = cpu->esp1; in copy_in_guest_info()
114 pages->state.guest_tss.ss1 = cpu->ss1; in copy_in_guest_info()
117 if (cpu->changed & CHANGED_IDT) in copy_in_guest_info()
118 copy_traps(cpu, pages->state.guest_idt, default_idt_entries); in copy_in_guest_info()
121 if (cpu->changed & CHANGED_GDT) in copy_in_guest_info()
122 copy_gdt(cpu, pages->state.guest_gdt); in copy_in_guest_info()
124 else if (cpu->changed & CHANGED_GDT_TLS) in copy_in_guest_info()
125 copy_gdt_tls(cpu, pages->state.guest_gdt); in copy_in_guest_info()
128 cpu->changed = 0; in copy_in_guest_info()
132 static void run_guest_once(struct lg_cpu *cpu, struct lguest_pages *pages) in run_guest_once() argument
141 copy_in_guest_info(cpu, pages); in run_guest_once()
148 cpu->regs->trapnum = 256; in run_guest_once()
172 : "0"(pages), "1"(__pa(cpu->lg->pgdirs[cpu->cpu_pgd].pgdir)) in run_guest_once()
198 void lguest_arch_run_guest(struct lg_cpu *cpu) in lguest_arch_run_guest() argument
205 if (cpu->ts && user_has_fpu()) in lguest_arch_run_guest()
223 run_guest_once(cpu, lguest_pages(raw_smp_processor_id())); in lguest_arch_run_guest()
237 if (cpu->ts && user_has_fpu()) in lguest_arch_run_guest()
246 if (cpu->regs->trapnum == 14) in lguest_arch_run_guest()
247 cpu->arch.last_pagefault = read_cr2(); in lguest_arch_run_guest()
255 else if (cpu->regs->trapnum == 7 && !user_has_fpu()) in lguest_arch_run_guest()
272 static int emulate_insn(struct lg_cpu *cpu) in emulate_insn() argument
280 unsigned long physaddr = guest_pa(cpu, cpu->regs->eip); in emulate_insn()
287 if ((cpu->regs->cs & 3) != GUEST_PL) in emulate_insn()
291 insn = lgread(cpu, physaddr, u8); in emulate_insn()
301 cpu->regs->eip++; in emulate_insn()
312 insn = lgread(cpu, physaddr + insnlen, u8); in emulate_insn()
348 cpu->regs->eax |= 0xFFFF; in emulate_insn()
350 cpu->regs->eax = 0xFFFFFFFF; in emulate_insn()
352 cpu->regs->eax |= 0xFF; in emulate_insn()
355 cpu->regs->eip += insnlen; in emulate_insn()
361 void lguest_arch_handle_trap(struct lg_cpu *cpu) in lguest_arch_handle_trap() argument
363 switch (cpu->regs->trapnum) { in lguest_arch_handle_trap()
370 if (cpu->regs->errcode == 0) { in lguest_arch_handle_trap()
371 if (emulate_insn(cpu)) in lguest_arch_handle_trap()
386 if (demand_page(cpu, cpu->arch.last_pagefault, in lguest_arch_handle_trap()
387 cpu->regs->errcode)) in lguest_arch_handle_trap()
399 if (cpu->lg->lguest_data && in lguest_arch_handle_trap()
400 put_user(cpu->arch.last_pagefault, in lguest_arch_handle_trap()
401 &cpu->lg->lguest_data->cr2)) in lguest_arch_handle_trap()
402 kill_guest(cpu, "Writing cr2"); in lguest_arch_handle_trap()
409 if (!cpu->ts) in lguest_arch_handle_trap()
426 cpu->hcall = (struct hcall_args *)cpu->regs; in lguest_arch_handle_trap()
431 if (!deliver_trap(cpu, cpu->regs->trapnum)) in lguest_arch_handle_trap()
437 kill_guest(cpu, "unhandled trap %li at %#lx (%#lx)", in lguest_arch_handle_trap()
438 cpu->regs->trapnum, cpu->regs->eip, in lguest_arch_handle_trap()
439 cpu->regs->trapnum == 14 ? cpu->arch.last_pagefault in lguest_arch_handle_trap()
440 : cpu->regs->errcode); in lguest_arch_handle_trap()
612 int lguest_arch_do_hcall(struct lg_cpu *cpu, struct hcall_args *args) in lguest_arch_do_hcall() argument
616 load_guest_gdt_entry(cpu, args->arg1, args->arg2, args->arg3); in lguest_arch_do_hcall()
619 load_guest_idt_entry(cpu, args->arg1, args->arg2, args->arg3); in lguest_arch_do_hcall()
622 guest_load_tls(cpu, args->arg1); in lguest_arch_do_hcall()
632 int lguest_arch_init_hypercalls(struct lg_cpu *cpu) in lguest_arch_init_hypercalls() argument
640 if (!lguest_address_ok(cpu->lg, cpu->hcall->arg1, in lguest_arch_init_hypercalls()
641 sizeof(*cpu->lg->lguest_data))) in lguest_arch_init_hypercalls()
651 cpu->lg->lguest_data = cpu->lg->mem_base + cpu->hcall->arg1; in lguest_arch_init_hypercalls()
666 if (put_user(tsc_speed, &cpu->lg->lguest_data->tsc_khz)) in lguest_arch_init_hypercalls()
670 if (!check_syscall_vector(cpu->lg)) in lguest_arch_init_hypercalls()
671 kill_guest(cpu, "bad syscall vector"); in lguest_arch_init_hypercalls()
681 void lguest_arch_setup_regs(struct lg_cpu *cpu, unsigned long start) in lguest_arch_setup_regs() argument
683 struct lguest_regs *regs = cpu->regs; in lguest_arch_setup_regs()
717 setup_guest_gdt(cpu); in lguest_arch_setup_regs()