Lines Matching refs:cpu

67 static struct lguest_pages *lguest_pages(unsigned int cpu)  in lguest_pages()  argument
69 return &(((struct lguest_pages *)(switcher_addr + PAGE_SIZE))[cpu]); in lguest_pages()
85 static void copy_in_guest_info(struct lg_cpu *cpu, struct lguest_pages *pages) in copy_in_guest_info() argument
93 if (__this_cpu_read(lg_last_cpu) != cpu || cpu->last_pages != pages) { in copy_in_guest_info()
94 __this_cpu_write(lg_last_cpu, cpu); in copy_in_guest_info()
95 cpu->last_pages = pages; in copy_in_guest_info()
96 cpu->changed = CHANGED_ALL; in copy_in_guest_info()
108 map_switcher_in_guest(cpu, pages); in copy_in_guest_info()
114 pages->state.guest_tss.sp1 = cpu->esp1; in copy_in_guest_info()
115 pages->state.guest_tss.ss1 = cpu->ss1; in copy_in_guest_info()
118 if (cpu->changed & CHANGED_IDT) in copy_in_guest_info()
119 copy_traps(cpu, pages->state.guest_idt, default_idt_entries); in copy_in_guest_info()
122 if (cpu->changed & CHANGED_GDT) in copy_in_guest_info()
123 copy_gdt(cpu, pages->state.guest_gdt); in copy_in_guest_info()
125 else if (cpu->changed & CHANGED_GDT_TLS) in copy_in_guest_info()
126 copy_gdt_tls(cpu, pages->state.guest_gdt); in copy_in_guest_info()
129 cpu->changed = 0; in copy_in_guest_info()
133 static void run_guest_once(struct lg_cpu *cpu, struct lguest_pages *pages) in run_guest_once() argument
142 copy_in_guest_info(cpu, pages); in run_guest_once()
149 cpu->regs->trapnum = 256; in run_guest_once()
174 "1"(__pa(cpu->lg->pgdirs[cpu->cpu_pgd].pgdir)), in run_guest_once()
185 unsigned long *lguest_arch_regptr(struct lg_cpu *cpu, size_t reg_off, bool any) in lguest_arch_regptr() argument
189 return &cpu->regs->ebx; in lguest_arch_regptr()
191 return &cpu->regs->ecx; in lguest_arch_regptr()
193 return &cpu->regs->edx; in lguest_arch_regptr()
195 return &cpu->regs->esi; in lguest_arch_regptr()
197 return &cpu->regs->edi; in lguest_arch_regptr()
199 return &cpu->regs->ebp; in lguest_arch_regptr()
201 return &cpu->regs->eax; in lguest_arch_regptr()
203 return &cpu->regs->eip; in lguest_arch_regptr()
205 return &cpu->regs->esp; in lguest_arch_regptr()
212 return &cpu->regs->ds; in lguest_arch_regptr()
214 return &cpu->regs->es; in lguest_arch_regptr()
216 return &cpu->regs->fs; in lguest_arch_regptr()
218 return &cpu->regs->gs; in lguest_arch_regptr()
220 return &cpu->regs->cs; in lguest_arch_regptr()
222 return &cpu->regs->eflags; in lguest_arch_regptr()
224 return &cpu->regs->ss; in lguest_arch_regptr()
247 void lguest_arch_run_guest(struct lg_cpu *cpu) in lguest_arch_run_guest() argument
254 if (cpu->ts && fpregs_active()) in lguest_arch_run_guest()
272 run_guest_once(cpu, lguest_pages(raw_smp_processor_id())); in lguest_arch_run_guest()
286 if (cpu->ts && fpregs_active()) in lguest_arch_run_guest()
295 if (cpu->regs->trapnum == 14) in lguest_arch_run_guest()
296 cpu->arch.last_pagefault = read_cr2(); in lguest_arch_run_guest()
304 else if (cpu->regs->trapnum == 7 && !fpregs_active()) in lguest_arch_run_guest()
332 static void copy_from_guest(struct lg_cpu *cpu, in copy_from_guest() argument
343 if (__guest_pa(cpu, vaddr + to_page_end, &paddr)) in copy_from_guest()
344 copy_from_guest(cpu, dst + to_page_end, in copy_from_guest()
355 __lgread(cpu, dst, guest_pa(cpu, vaddr), len); in copy_from_guest()
359 static void setup_emulate_insn(struct lg_cpu *cpu) in setup_emulate_insn() argument
361 cpu->pending.trap = 13; in setup_emulate_insn()
362 copy_from_guest(cpu, cpu->pending.insn, cpu->regs->eip, in setup_emulate_insn()
363 sizeof(cpu->pending.insn)); in setup_emulate_insn()
366 static void setup_iomem_insn(struct lg_cpu *cpu, unsigned long iomem_addr) in setup_iomem_insn() argument
368 cpu->pending.trap = 14; in setup_iomem_insn()
369 cpu->pending.addr = iomem_addr; in setup_iomem_insn()
370 copy_from_guest(cpu, cpu->pending.insn, cpu->regs->eip, in setup_iomem_insn()
371 sizeof(cpu->pending.insn)); in setup_iomem_insn()
375 void lguest_arch_handle_trap(struct lg_cpu *cpu) in lguest_arch_handle_trap() argument
379 switch (cpu->regs->trapnum) { in lguest_arch_handle_trap()
382 if (cpu->regs->errcode == 0) { in lguest_arch_handle_trap()
383 setup_emulate_insn(cpu); in lguest_arch_handle_trap()
398 if (demand_page(cpu, cpu->arch.last_pagefault, in lguest_arch_handle_trap()
399 cpu->regs->errcode, &iomem_addr)) in lguest_arch_handle_trap()
405 setup_iomem_insn(cpu, iomem_addr); in lguest_arch_handle_trap()
418 if (cpu->lg->lguest_data && in lguest_arch_handle_trap()
419 put_user(cpu->arch.last_pagefault, in lguest_arch_handle_trap()
420 &cpu->lg->lguest_data->cr2)) in lguest_arch_handle_trap()
421 kill_guest(cpu, "Writing cr2"); in lguest_arch_handle_trap()
428 if (!cpu->ts) in lguest_arch_handle_trap()
445 cpu->hcall = (struct hcall_args *)cpu->regs; in lguest_arch_handle_trap()
450 if (!deliver_trap(cpu, cpu->regs->trapnum)) in lguest_arch_handle_trap()
456 kill_guest(cpu, "unhandled trap %li at %#lx (%#lx)", in lguest_arch_handle_trap()
457 cpu->regs->trapnum, cpu->regs->eip, in lguest_arch_handle_trap()
458 cpu->regs->trapnum == 14 ? cpu->arch.last_pagefault in lguest_arch_handle_trap()
459 : cpu->regs->errcode); in lguest_arch_handle_trap()
631 int lguest_arch_do_hcall(struct lg_cpu *cpu, struct hcall_args *args) in lguest_arch_do_hcall() argument
635 load_guest_gdt_entry(cpu, args->arg1, args->arg2, args->arg3); in lguest_arch_do_hcall()
638 load_guest_idt_entry(cpu, args->arg1, args->arg2, args->arg3); in lguest_arch_do_hcall()
641 guest_load_tls(cpu, args->arg1); in lguest_arch_do_hcall()
651 int lguest_arch_init_hypercalls(struct lg_cpu *cpu) in lguest_arch_init_hypercalls() argument
659 if (!lguest_address_ok(cpu->lg, cpu->hcall->arg1, in lguest_arch_init_hypercalls()
660 sizeof(*cpu->lg->lguest_data))) in lguest_arch_init_hypercalls()
670 cpu->lg->lguest_data = cpu->lg->mem_base + cpu->hcall->arg1; in lguest_arch_init_hypercalls()
685 if (put_user(tsc_speed, &cpu->lg->lguest_data->tsc_khz)) in lguest_arch_init_hypercalls()
689 if (!check_syscall_vector(cpu->lg)) in lguest_arch_init_hypercalls()
690 kill_guest(cpu, "bad syscall vector"); in lguest_arch_init_hypercalls()
700 void lguest_arch_setup_regs(struct lg_cpu *cpu, unsigned long start) in lguest_arch_setup_regs() argument
702 struct lguest_regs *regs = cpu->regs; in lguest_arch_setup_regs()
736 setup_guest_gdt(cpu); in lguest_arch_setup_regs()