Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/drivers/simple/xen-simpleback/simpleback.c b/drivers/simple/xen-simpleback/simpleback.c
- index 86d36d6..93acc07 100644
- --- a/drivers/simple/xen-simpleback/simpleback.c
- +++ b/drivers/simple/xen-simpleback/simpleback.c
- @@ -49,21 +49,49 @@ static void simpleif_notify_work(struct xen_simpleif *simpleif)
- //if (notify)
- }
- */
- -
- -static __always_inline volatile unsigned long read_cc(void)
- +static __always_inline volatile unsigned long read_cc_before(void)
- {
- unsigned long cc;
- #ifdef CONFIG_ARM64
- isb();
- - //asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
- - asm volatile("mrs %0, CNTPCT_EL0" : "=r" (cc) ::);
- + asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
- isb();
- -#else
- +#elif defined(CONFIG_ARM)
- asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
- +#elif defined(CONFIG_X86_64)
- + asm volatile ("CPUID\n\t"::: "%rax", "%rbx", "%rcx", "%rdx");
- + asm volatile ( "RDTSC\n\t"
- + "shl $0x20, %%rdx\n\t"
- + "or %%rax, %%rdx\n\t"
- + "mov %%rdx, %0\n\t"
- + : "=r" (cc)
- + :: "%rax", "%rbx", "%rcx", "%rdx");
- #endif
- return cc;
- }
- +static __always_inline volatile unsigned long read_cc_after(void)
- +{
- + unsigned long cc;
- +#ifdef CONFIG_ARM64
- + isb();
- + asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
- + isb();
- +#elif defined(CONFIG_ARM)
- + asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
- +#elif defined(CONFIG_X86_64)
- + asm volatile (
- + "mov %%cr0, %%rax\n\t"
- + "mov %%rax, %%cr0\n\t"
- + "RDTSC\n\t"
- + "shl $0x20, %%rdx\n\t"
- + "or %%rax, %%rdx\n\t"
- + "mov %%rdx, %0\n\t"
- + : "=r" (cc)
- + :: "%rax", "%rdx");
- +#endif
- + return cc;
- +}
- irqreturn_t xen_simpleif_be_int(int irq, void *dev_id)
- {
- @@ -83,7 +111,8 @@ irqreturn_t xen_simpleif_be_int(int irq, void *dev_id)
- cc = read_cc();
- */
- - notify_remote_via_irq(simpleif->irq);
- + if (simpleif->irq != 0)
- + notify_remote_via_irq(simpleif->irq);
- // HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
- return IRQ_HANDLED;
- }
- diff --git a/drivers/simple/xen-simplefront.c b/drivers/simple/xen-simplefront.c
- index 2a3f811..bc7b46f 100644
- --- a/drivers/simple/xen-simplefront.c
- +++ b/drivers/simple/xen-simplefront.c
- @@ -26,19 +26,51 @@
- #define SIMPLE_RING_SIZE __CONST_RING_SIZE(simpleif, PAGE_SIZE)
- -static __always_inline volatile unsigned long read_cc(void)
- +static __always_inline volatile unsigned long read_cc_before(void)
- {
- - unsigned long cc;
- + unsigned long cc;
- #ifdef CONFIG_ARM64
- - isb();
- - asm volatile("mrs %0, CNTPCT_EL0" : "=r" (cc) ::);
- - isb();
- -#elif CONFIG_ARM
- - asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
- + isb();
- + asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
- + isb();
- +#elif defined(CONFIG_ARM)
- + asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
- +#elif defined(CONFIG_X86_64)
- + asm volatile ("CPUID\n\t"::: "%rax", "%rbx", "%rcx", "%rdx");
- + asm volatile ( "RDTSC\n\t"
- + "shl $0x20, %%rdx\n\t"
- + "or %%rax, %%rdx\n\t"
- + "mov %%rdx, %0\n\t"
- + : "=r" (cc)
- + :: "%rax", "%rbx", "%rcx", "%rdx");
- #endif
- - return cc;
- + return cc;
- }
- +static __always_inline volatile unsigned long read_cc_after(void)
- +{
- + unsigned long cc;
- +#ifdef CONFIG_ARM64
- + isb();
- + asm volatile("mrs %0, PMCCNTR_EL0" : "=r" (cc) ::);
- + isb();
- +#elif defined(CONFIG_ARM)
- + asm volatile("mrc p15, 0, %[reg], c9, c13, 0": [reg] "=r" (cc));
- +#elif defined(CONFIG_X86_64)
- + asm volatile (
- + "mov %%cr0, %%rax\n\t"
- + "mov %%rax, %%cr0\n\t"
- + "RDTSC\n\t"
- + "shl $0x20, %%rdx\n\t"
- + "or %%rax, %%rdx\n\t"
- + "mov %%rdx, %0\n\t"
- + : "=r" (cc)
- + :: "%rax", "%rdx");
- +#endif
- + return cc;
- +}
- +
- +
- unsigned long cc_before;
- unsigned long cc_after;
- @@ -53,12 +85,12 @@ struct simplefront_info
- static irqreturn_t simpleif_interrupt(int irq, void *dev_id)
- {
- - cc_after = read_cc();
- + cc_after = read_cc_after();
- // printk("jintack simple frontend get response from backend\n");
- trace_printk("before:\t%lu\tafter:\t%lu\tdiff:\t%lu\n", cc_before, cc_after, cc_after - cc_before);
- cc_before = 0;
- -/*
- -
- + /* This is for sending data */
- + /*
- struct blkfront_info *info = (struct blkfront_info *)dev_id;
- RING_IDX i, rp;
- int more_to_do;
- @@ -83,7 +115,7 @@ static irqreturn_t simpleif_interrupt(int irq, void *dev_id)
- if (more_to_do)
- printk("jintack more_to_do??\n");
- -*/
- + */
- return IRQ_HANDLED;
- }
- @@ -230,7 +262,7 @@ int simpleif_request_dummy(void)
- if (cc_before)
- trace_printk("cc_before overwrite detected, %ld\n", cc_before);
- cc_before = 100; /* make cache hot */
- - cc_before = read_cc();
- + cc_before = read_cc_before();
- notify_remote_via_irq(info->irq);
- HYPERVISOR_sched_op(SCHEDOP_block, NULL);
- return 0;
Advertisement
Add Comment
Please, Sign In to add comment