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()
72 static void set_guest_interrupt(struct lg_cpu *cpu, u32 lo, u32 hi, in set_guest_interrupt() argument
84 if ((cpu->regs->ss&0x3) != GUEST_PL) { in set_guest_interrupt()
89 virtstack = cpu->esp1; in set_guest_interrupt()
90 ss = cpu->ss1; in set_guest_interrupt()
92 origstack = gstack = guest_pa(cpu, virtstack); in set_guest_interrupt()
99 push_guest_stack(cpu, &gstack, cpu->regs->ss); in set_guest_interrupt()
100 push_guest_stack(cpu, &gstack, cpu->regs->esp); in set_guest_interrupt()
103 virtstack = cpu->regs->esp; in set_guest_interrupt()
104 ss = cpu->regs->ss; in set_guest_interrupt()
106 origstack = gstack = guest_pa(cpu, virtstack); in set_guest_interrupt()
115 eflags = cpu->regs->eflags; in set_guest_interrupt()
116 if (get_user(irq_enable, &cpu->lg->lguest_data->irq_enabled) == 0 in set_guest_interrupt()
125 push_guest_stack(cpu, &gstack, eflags); in set_guest_interrupt()
126 push_guest_stack(cpu, &gstack, cpu->regs->cs); in set_guest_interrupt()
127 push_guest_stack(cpu, &gstack, cpu->regs->eip); in set_guest_interrupt()
131 push_guest_stack(cpu, &gstack, cpu->regs->errcode); in set_guest_interrupt()
137 cpu->regs->ss = ss; in set_guest_interrupt()
138 cpu->regs->esp = virtstack + (gstack - origstack); in set_guest_interrupt()
139 cpu->regs->cs = (__KERNEL_CS|GUEST_PL); in set_guest_interrupt()
140 cpu->regs->eip = idt_address(lo, hi); in set_guest_interrupt()
147 if (put_user(0, &cpu->lg->lguest_data->irq_enabled)) in set_guest_interrupt()
148 kill_guest(cpu, "Disabling interrupts"); in set_guest_interrupt()
158 unsigned int interrupt_pending(struct lg_cpu *cpu, bool *more) in interrupt_pending() argument
164 if (!cpu->lg->lguest_data) in interrupt_pending()
171 if (copy_from_user(&blk, cpu->lg->lguest_data->blocked_interrupts, in interrupt_pending()
174 bitmap_andnot(blk, cpu->irqs_pending, blk, LGUEST_IRQS); in interrupt_pending()
187 void try_deliver_interrupt(struct lg_cpu *cpu, unsigned int irq, bool more) in try_deliver_interrupt() argument
197 if (cpu->regs->eip >= cpu->lg->noirq_start && in try_deliver_interrupt()
198 (cpu->regs->eip < cpu->lg->noirq_end)) in try_deliver_interrupt()
202 if (cpu->halted) { in try_deliver_interrupt()
204 if (put_user(X86_EFLAGS_IF, &cpu->lg->lguest_data->irq_enabled)) in try_deliver_interrupt()
205 kill_guest(cpu, "Re-enabling interrupts"); in try_deliver_interrupt()
206 cpu->halted = 0; in try_deliver_interrupt()
210 if (get_user(irq_enabled, &cpu->lg->lguest_data->irq_enabled)) in try_deliver_interrupt()
215 &cpu->lg->lguest_data->irq_pending); in try_deliver_interrupt()
225 idt = &cpu->arch.idt[FIRST_EXTERNAL_VECTOR+irq]; in try_deliver_interrupt()
229 clear_bit(irq, cpu->irqs_pending); in try_deliver_interrupt()
235 set_guest_interrupt(cpu, idt->a, idt->b, false); in try_deliver_interrupt()
245 write_timestamp(cpu); in try_deliver_interrupt()
252 put_user(0, &cpu->lg->lguest_data->irq_pending); in try_deliver_interrupt()
256 void set_interrupt(struct lg_cpu *cpu, unsigned int irq) in set_interrupt() argument
262 set_bit(irq, cpu->irqs_pending); in set_interrupt()
268 if (!wake_up_process(cpu->tsk)) in set_interrupt()
269 kick_process(cpu->tsk); in set_interrupt()
331 bool deliver_trap(struct lg_cpu *cpu, unsigned int num) in deliver_trap() argument
337 if (num >= ARRAY_SIZE(cpu->arch.idt)) in deliver_trap()
344 if (!idt_present(cpu->arch.idt[num].a, cpu->arch.idt[num].b)) in deliver_trap()
346 set_guest_interrupt(cpu, cpu->arch.idt[num].a, in deliver_trap()
347 cpu->arch.idt[num].b, has_err(num)); in deliver_trap()
410 void pin_stack_pages(struct lg_cpu *cpu) in pin_stack_pages() argument
418 for (i = 0; i < cpu->lg->stack_pages; i++) in pin_stack_pages()
425 pin_page(cpu, cpu->esp1 - 1 - i * PAGE_SIZE); in pin_stack_pages()
438 void guest_set_stack(struct lg_cpu *cpu, u32 seg, u32 esp, unsigned int pages) in guest_set_stack() argument
444 kill_guest(cpu, "bad stack segment %i", seg); in guest_set_stack()
447 kill_guest(cpu, "bad stack pages %u", pages); in guest_set_stack()
449 cpu->ss1 = seg; in guest_set_stack()
450 cpu->esp1 = esp; in guest_set_stack()
451 cpu->lg->stack_pages = pages; in guest_set_stack()
453 pin_stack_pages(cpu); in guest_set_stack()
465 static void set_trap(struct lg_cpu *cpu, struct desc_struct *trap, in set_trap() argument
478 kill_guest(cpu, "bad IDT type %i", type); in set_trap()
499 void load_guest_idt_entry(struct lg_cpu *cpu, unsigned int num, u32 lo, u32 hi) in load_guest_idt_entry() argument
512 cpu->changed |= CHANGED_IDT; in load_guest_idt_entry()
515 if (num >= ARRAY_SIZE(cpu->arch.idt)) in load_guest_idt_entry()
516 kill_guest(cpu, "Setting idt entry %u", num); in load_guest_idt_entry()
518 set_trap(cpu, &cpu->arch.idt[num], num, lo, hi); in load_guest_idt_entry()
567 void copy_traps(const struct lg_cpu *cpu, struct desc_struct *idt, in copy_traps() argument
576 for (i = 0; i < ARRAY_SIZE(cpu->arch.idt); i++) { in copy_traps()
577 const struct desc_struct *gidt = &cpu->arch.idt[i]; in copy_traps()
613 void guest_set_clockevent(struct lg_cpu *cpu, unsigned long delta) in guest_set_clockevent() argument
619 hrtimer_cancel(&cpu->hrt); in guest_set_clockevent()
629 hrtimer_start(&cpu->hrt, expires, HRTIMER_MODE_ABS); in guest_set_clockevent()
635 struct lg_cpu *cpu = container_of(timer, struct lg_cpu, hrt); in clockdev_fn() local
638 set_interrupt(cpu, 0); in clockdev_fn()
643 void init_clockdev(struct lg_cpu *cpu) in init_clockdev() argument
645 hrtimer_init(&cpu->hrt, CLOCK_REALTIME, HRTIMER_MODE_ABS); in init_clockdev()
646 cpu->hrt.function = clockdev_fn; in init_clockdev()