Lines Matching refs:cpu

51 static void push_guest_stack(struct lg_cpu *cpu, unsigned long *gstack, u32 val)  in push_guest_stack()  argument
55 lgwrite(cpu, *gstack, u32, val); in push_guest_stack()
68 static void push_guest_interrupt_stack(struct lg_cpu *cpu, bool has_err) in push_guest_interrupt_stack() argument
79 if ((cpu->regs->ss&0x3) != GUEST_PL) { in push_guest_interrupt_stack()
84 virtstack = cpu->esp1; in push_guest_interrupt_stack()
85 ss = cpu->ss1; in push_guest_interrupt_stack()
87 origstack = gstack = guest_pa(cpu, virtstack); in push_guest_interrupt_stack()
94 push_guest_stack(cpu, &gstack, cpu->regs->ss); in push_guest_interrupt_stack()
95 push_guest_stack(cpu, &gstack, cpu->regs->esp); in push_guest_interrupt_stack()
98 virtstack = cpu->regs->esp; in push_guest_interrupt_stack()
99 ss = cpu->regs->ss; in push_guest_interrupt_stack()
101 origstack = gstack = guest_pa(cpu, virtstack); in push_guest_interrupt_stack()
110 eflags = cpu->regs->eflags; in push_guest_interrupt_stack()
111 if (get_user(irq_enable, &cpu->lg->lguest_data->irq_enabled) == 0 in push_guest_interrupt_stack()
120 push_guest_stack(cpu, &gstack, eflags); in push_guest_interrupt_stack()
121 push_guest_stack(cpu, &gstack, cpu->regs->cs); in push_guest_interrupt_stack()
122 push_guest_stack(cpu, &gstack, cpu->regs->eip); in push_guest_interrupt_stack()
126 push_guest_stack(cpu, &gstack, cpu->regs->errcode); in push_guest_interrupt_stack()
129 cpu->regs->ss = ss; in push_guest_interrupt_stack()
130 cpu->regs->esp = virtstack + (gstack - origstack); in push_guest_interrupt_stack()
141 static void guest_run_interrupt(struct lg_cpu *cpu, u32 lo, u32 hi) in guest_run_interrupt() argument
144 if ((cpu->regs->ss&0x3) != GUEST_PL) in guest_run_interrupt()
145 cpu->regs->ss = cpu->esp1; in guest_run_interrupt()
150 cpu->regs->cs = (__KERNEL_CS|GUEST_PL); in guest_run_interrupt()
151 cpu->regs->eip = idt_address(lo, hi); in guest_run_interrupt()
160 cpu->regs->eflags &= in guest_run_interrupt()
168 if (put_user(0, &cpu->lg->lguest_data->irq_enabled)) in guest_run_interrupt()
169 kill_guest(cpu, "Disabling interrupts"); in guest_run_interrupt()
173 static void restore_eflags(struct lg_cpu *cpu) in restore_eflags() argument
176 unsigned long stack_pa = guest_pa(cpu, cpu->regs->esp); in restore_eflags()
185 cpu->regs->eflags = lgread(cpu, stack_pa + 8, u32); in restore_eflags()
186 cpu->regs->eflags &= in restore_eflags()
197 unsigned int interrupt_pending(struct lg_cpu *cpu, bool *more) in interrupt_pending() argument
203 if (!cpu->lg->lguest_data) in interrupt_pending()
210 if (copy_from_user(&blk, cpu->lg->lguest_data->blocked_interrupts, in interrupt_pending()
213 bitmap_andnot(blk, cpu->irqs_pending, blk, LGUEST_IRQS); in interrupt_pending()
226 void try_deliver_interrupt(struct lg_cpu *cpu, unsigned int irq, bool more) in try_deliver_interrupt() argument
233 if (cpu->halted) { in try_deliver_interrupt()
235 if (put_user(X86_EFLAGS_IF, &cpu->lg->lguest_data->irq_enabled)) in try_deliver_interrupt()
236 kill_guest(cpu, "Re-enabling interrupts"); in try_deliver_interrupt()
237 cpu->halted = 0; in try_deliver_interrupt()
241 if (get_user(irq_enabled, &cpu->lg->lguest_data->irq_enabled)) in try_deliver_interrupt()
246 &cpu->lg->lguest_data->irq_pending); in try_deliver_interrupt()
256 idt = &cpu->arch.idt[FIRST_EXTERNAL_VECTOR+irq]; in try_deliver_interrupt()
260 clear_bit(irq, cpu->irqs_pending); in try_deliver_interrupt()
277 if (cpu->regs->eip == cpu->lg->noirq_iret) { in try_deliver_interrupt()
278 restore_eflags(cpu); in try_deliver_interrupt()
285 push_guest_interrupt_stack(cpu, false); in try_deliver_interrupt()
288 guest_run_interrupt(cpu, idt->a, idt->b); in try_deliver_interrupt()
298 write_timestamp(cpu); in try_deliver_interrupt()
305 put_user(0, &cpu->lg->lguest_data->irq_pending); in try_deliver_interrupt()
309 void set_interrupt(struct lg_cpu *cpu, unsigned int irq) in set_interrupt() argument
315 set_bit(irq, cpu->irqs_pending); in set_interrupt()
321 if (!wake_up_process(cpu->tsk)) in set_interrupt()
322 kick_process(cpu->tsk); in set_interrupt()
384 bool deliver_trap(struct lg_cpu *cpu, unsigned int num) in deliver_trap() argument
390 if (num >= ARRAY_SIZE(cpu->arch.idt)) in deliver_trap()
397 if (!idt_present(cpu->arch.idt[num].a, cpu->arch.idt[num].b)) in deliver_trap()
399 push_guest_interrupt_stack(cpu, has_err(num)); in deliver_trap()
400 guest_run_interrupt(cpu, cpu->arch.idt[num].a, in deliver_trap()
401 cpu->arch.idt[num].b); in deliver_trap()
465 void pin_stack_pages(struct lg_cpu *cpu) in pin_stack_pages() argument
473 for (i = 0; i < cpu->lg->stack_pages; i++) in pin_stack_pages()
480 pin_page(cpu, cpu->esp1 - 1 - i * PAGE_SIZE); in pin_stack_pages()
493 void guest_set_stack(struct lg_cpu *cpu, u32 seg, u32 esp, unsigned int pages) in guest_set_stack() argument
499 kill_guest(cpu, "bad stack segment %i", seg); in guest_set_stack()
502 kill_guest(cpu, "bad stack pages %u", pages); in guest_set_stack()
504 cpu->ss1 = seg; in guest_set_stack()
505 cpu->esp1 = esp; in guest_set_stack()
506 cpu->lg->stack_pages = pages; in guest_set_stack()
508 pin_stack_pages(cpu); in guest_set_stack()
520 static void set_trap(struct lg_cpu *cpu, struct desc_struct *trap, in set_trap() argument
533 kill_guest(cpu, "bad IDT type %i", type); in set_trap()
554 void load_guest_idt_entry(struct lg_cpu *cpu, unsigned int num, u32 lo, u32 hi) in load_guest_idt_entry() argument
567 cpu->changed |= CHANGED_IDT; in load_guest_idt_entry()
570 if (num >= ARRAY_SIZE(cpu->arch.idt)) in load_guest_idt_entry()
571 kill_guest(cpu, "Setting idt entry %u", num); in load_guest_idt_entry()
573 set_trap(cpu, &cpu->arch.idt[num], num, lo, hi); in load_guest_idt_entry()
622 void copy_traps(const struct lg_cpu *cpu, struct desc_struct *idt, in copy_traps() argument
631 for (i = 0; i < ARRAY_SIZE(cpu->arch.idt); i++) { in copy_traps()
632 const struct desc_struct *gidt = &cpu->arch.idt[i]; in copy_traps()
668 void guest_set_clockevent(struct lg_cpu *cpu, unsigned long delta) in guest_set_clockevent() argument
674 hrtimer_cancel(&cpu->hrt); in guest_set_clockevent()
684 hrtimer_start(&cpu->hrt, expires, HRTIMER_MODE_ABS); in guest_set_clockevent()
690 struct lg_cpu *cpu = container_of(timer, struct lg_cpu, hrt); in clockdev_fn() local
693 set_interrupt(cpu, 0); in clockdev_fn()
698 void init_clockdev(struct lg_cpu *cpu) in init_clockdev() argument
700 hrtimer_init(&cpu->hrt, CLOCK_REALTIME, HRTIMER_MODE_ABS); in init_clockdev()
701 cpu->hrt.function = clockdev_fn; in init_clockdev()