Created
March 11, 2014 10:07
-
-
Save anonymous/9482833 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
When not running in guest-debug mode (i.e. the guest controls the debug | |
registers, having to take an exit for each DR access is a waste of time. | |
If the guest gets into a state where each context switch causes DR to be | |
saved and restored, this can take away as much as 40% of the execution | |
time from the guest. | |
If the guest is running with vcpu->arch.db == vcpu->arch.eff_db, we | |
can let it write freely to the debug registers and reload them on the | |
next exit. We still need to exit on the first access, so that the | |
KVM_DEBUGREG_WONT_EXIT flag is set in switch_db_regs; after that, further | |
accesses to the debug registers will not cause a vmexit. | |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | |
--- | |
arch/x86/kvm/vmx.c | 37 ++++++++++++++++++++++++++++++++++++- | |
1 file changed, 36 insertions(+), 1 deletion(-) | |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | |
index 06e4ec877a1c..e377522408b1 100644 | |
--- a/arch/x86/kvm/vmx.c | |
+++ b/arch/x86/kvm/vmx.c | |
@@ -2843,7 +2843,7 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) | |
vmx_capability.ept, vmx_capability.vpid); | |
} | |
- min = 0; | |
+ min = VM_EXIT_SAVE_DEBUG_CONTROLS; | |
#ifdef CONFIG_X86_64 | |
min |= VM_EXIT_HOST_ADDR_SPACE_SIZE; | |
#endif | |
@@ -5113,6 +5113,22 @@ static int handle_dr(struct kvm_vcpu *vcpu) | |
} | |
} | |
+ if (vcpu->guest_debug == 0) { | |
+ u32 cpu_based_vm_exec_control; | |
+ | |
+ cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); | |
+ cpu_based_vm_exec_control &= ~CPU_BASED_MOV_DR_EXITING; | |
+ vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); | |
+ | |
+ /* | |
+ * No more DR vmexits; force a reload of the debug registers | |
+ * and reenter on this instruction. The next vmexit will | |
+ * retrieve the full state of the debug registers. | |
+ */ | |
+ vcpu->arch.switch_db_regs |= KVM_DEBUGREG_WONT_EXIT; | |
+ return 1; | |
+ } | |
+ | |
exit_qualification = vmcs_readl(EXIT_QUALIFICATION); | |
dr = exit_qualification & DEBUG_REG_ACCESS_NUM; | |
reg = DEBUG_REG_ACCESS_REG(exit_qualification); | |
@@ -5139,6 +5155,24 @@ static void vmx_set_dr6(struct kvm_vcpu *vcpu, unsigned long val) | |
{ | |
} | |
+static void vmx_sync_dirty_debug_regs(struct kvm_vcpu *vcpu) | |
+{ | |
+ u32 cpu_based_vm_exec_control; | |
+ | |
+ get_debugreg(vcpu->arch.db[0], 0); | |
+ get_debugreg(vcpu->arch.db[1], 1); | |
+ get_debugreg(vcpu->arch.db[2], 2); | |
+ get_debugreg(vcpu->arch.db[3], 3); | |
+ get_debugreg(vcpu->arch.dr6, 6); | |
+ vcpu->arch.dr7 = vmcs_readl(GUEST_DR7); | |
+ | |
+ vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_WONT_EXIT; | |
+ | |
+ cpu_based_vm_exec_control = vmcs_read32(CPU_BASED_VM_EXEC_CONTROL); | |
+ cpu_based_vm_exec_control |= CPU_BASED_MOV_DR_EXITING; | |
+ vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, cpu_based_vm_exec_control); | |
+} | |
+ | |
static void vmx_set_dr7(struct kvm_vcpu *vcpu, unsigned long val) | |
{ | |
vmcs_writel(GUEST_DR7, val); | |
@@ -8590,6 +8624,7 @@ static struct kvm_x86_ops vmx_x86_ops = { | |
.get_dr6 = vmx_get_dr6, | |
.set_dr6 = vmx_set_dr6, | |
.set_dr7 = vmx_set_dr7, | |
+ .sync_dirty_debug_regs = vmx_sync_dirty_debug_regs, | |
.cache_reg = vmx_cache_reg, | |
.get_rflags = vmx_get_rflags, | |
.set_rflags = vmx_set_rflags, | |
-- | |
1.8.3.1 | |
-- | |
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in | |
the body of a message to majordomo@vger.kernel.org | |
More majordomo info at http://vger.kernel.org/majordomo-info.html | |
Please read the FAQ at http://www.tux.org/lkml/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Unlike other intercepts, debug register intercepts will be modified | |
in hot paths if the guest OS is bad or otherwise gets tricked into | |
doing so. | |
Avoid calling recalc_intercepts 16 times for debug registers. | |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | |
--- | |
arch/x86/kvm/svm.c | 41 ++++++++++++++++++++--------------------- | |
1 file changed, 20 insertions(+), 21 deletions(-) | |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c | |
index 64d9bb9590e3..5ed67e9739f6 100644 | |
--- a/arch/x86/kvm/svm.c | |
+++ b/arch/x86/kvm/svm.c | |
@@ -303,20 +303,35 @@ static inline bool is_cr_intercept(struct vcpu_svm *svm, int bit) | |
return vmcb->control.intercept_cr & (1U << bit); | |
} | |
-static inline void set_dr_intercept(struct vcpu_svm *svm, int bit) | |
+static inline void set_dr_intercepts(struct vcpu_svm *svm) | |
{ | |
struct vmcb *vmcb = get_host_vmcb(svm); | |
- vmcb->control.intercept_dr |= (1U << bit); | |
+ vmcb->control.intercept_dr = (1 << INTERCEPT_DR0_READ) | |
+ | (1 << INTERCEPT_DR1_READ) | |
+ | (1 << INTERCEPT_DR2_READ) | |
+ | (1 << INTERCEPT_DR3_READ) | |
+ | (1 << INTERCEPT_DR4_READ) | |
+ | (1 << INTERCEPT_DR5_READ) | |
+ | (1 << INTERCEPT_DR6_READ) | |
+ | (1 << INTERCEPT_DR7_READ) | |
+ | (1 << INTERCEPT_DR0_WRITE) | |
+ | (1 << INTERCEPT_DR1_WRITE) | |
+ | (1 << INTERCEPT_DR2_WRITE) | |
+ | (1 << INTERCEPT_DR3_WRITE) | |
+ | (1 << INTERCEPT_DR4_WRITE) | |
+ | (1 << INTERCEPT_DR5_WRITE) | |
+ | (1 << INTERCEPT_DR6_WRITE) | |
+ | (1 << INTERCEPT_DR7_WRITE); | |
recalc_intercepts(svm); | |
} | |
-static inline void clr_dr_intercept(struct vcpu_svm *svm, int bit) | |
+static inline void clr_dr_intercepts(struct vcpu_svm *svm) | |
{ | |
struct vmcb *vmcb = get_host_vmcb(svm); | |
- vmcb->control.intercept_dr &= ~(1U << bit); | |
+ vmcb->control.intercept_dr = 0; | |
recalc_intercepts(svm); | |
} | |
@@ -1080,23 +1095,7 @@ static void init_vmcb(struct vcpu_svm *svm) | |
set_cr_intercept(svm, INTERCEPT_CR4_WRITE); | |
set_cr_intercept(svm, INTERCEPT_CR8_WRITE); | |
- set_dr_intercept(svm, INTERCEPT_DR0_READ); | |
- set_dr_intercept(svm, INTERCEPT_DR1_READ); | |
- set_dr_intercept(svm, INTERCEPT_DR2_READ); | |
- set_dr_intercept(svm, INTERCEPT_DR3_READ); | |
- set_dr_intercept(svm, INTERCEPT_DR4_READ); | |
- set_dr_intercept(svm, INTERCEPT_DR5_READ); | |
- set_dr_intercept(svm, INTERCEPT_DR6_READ); | |
- set_dr_intercept(svm, INTERCEPT_DR7_READ); | |
- | |
- set_dr_intercept(svm, INTERCEPT_DR0_WRITE); | |
- set_dr_intercept(svm, INTERCEPT_DR1_WRITE); | |
- set_dr_intercept(svm, INTERCEPT_DR2_WRITE); | |
- set_dr_intercept(svm, INTERCEPT_DR3_WRITE); | |
- set_dr_intercept(svm, INTERCEPT_DR4_WRITE); | |
- set_dr_intercept(svm, INTERCEPT_DR5_WRITE); | |
- set_dr_intercept(svm, INTERCEPT_DR6_WRITE); | |
- set_dr_intercept(svm, INTERCEPT_DR7_WRITE); | |
+ set_dr_intercepts(svm); | |
set_exception_intercept(svm, PF_VECTOR); | |
set_exception_intercept(svm, UD_VECTOR); | |
-- | |
1.8.3.1 | |
-- | |
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in | |
the body of a message to majordomo@vger.kernel.org | |
More majordomo info at http://vger.kernel.org/majordomo-info.html | |
Please read the FAQ at http://www.tux.org/lkml/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
When not running in guest-debug mode (i.e. the guest controls the debug | |
registers, having to take an exit for each DR access is a waste of time. | |
If the guest gets into a state where each context switch causes DR to be | |
saved and restored, this can take away as much as 40% of the execution | |
time from the guest. | |
If the guest is running with vcpu->arch.db == vcpu->arch.eff_db, we | |
can let it write freely to the debug registers and reload them on the | |
next exit. We still need to exit on the first access, so that the | |
KVM_DEBUGREG_WONT_EXIT flag is set in switch_db_regs; after that, further | |
accesses to the debug registers will not cause a vmexit. | |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | |
--- | |
arch/x86/kvm/svm.c | 27 +++++++++++++++++++++++++++ | |
1 file changed, 27 insertions(+) | |
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c | |
index 5ed67e9739f6..ac68edccc57c 100644 | |
--- a/arch/x86/kvm/svm.c | |
+++ b/arch/x86/kvm/svm.c | |
@@ -1683,6 +1683,21 @@ static void svm_set_dr6(struct kvm_vcpu *vcpu, unsigned long value) | |
mark_dirty(svm->vmcb, VMCB_DR); | |
} | |
+static void svm_sync_dirty_debug_regs(struct kvm_vcpu *vcpu) | |
+{ | |
+ struct vcpu_svm *svm = to_svm(vcpu); | |
+ | |
+ get_debugreg(vcpu->arch.db[0], 0); | |
+ get_debugreg(vcpu->arch.db[1], 1); | |
+ get_debugreg(vcpu->arch.db[2], 2); | |
+ get_debugreg(vcpu->arch.db[3], 3); | |
+ vcpu->arch.dr6 = svm_get_dr6(vcpu); | |
+ vcpu->arch.dr7 = svm->vmcb->save.dr7; | |
+ | |
+ vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_WONT_EXIT; | |
+ set_dr_intercepts(svm); | |
+} | |
+ | |
static void svm_set_dr7(struct kvm_vcpu *vcpu, unsigned long value) | |
{ | |
struct vcpu_svm *svm = to_svm(vcpu); | |
@@ -2974,6 +2989,17 @@ static int dr_interception(struct vcpu_svm *svm) | |
unsigned long val; | |
int err; | |
+ if (svm->vcpu.guest_debug == 0) { | |
+ /* | |
+ * No more DR vmexits; force a reload of the debug registers | |
+ * and reenter on this instruction. The next vmexit will | |
+ * retrieve the full state of the debug registers. | |
+ */ | |
+ clr_dr_intercepts(svm); | |
+ svm->vcpu.arch.switch_db_regs |= KVM_DEBUGREG_WONT_EXIT; | |
+ return 1; | |
+ } | |
+ | |
if (!boot_cpu_has(X86_FEATURE_DECODEASSISTS)) | |
return emulate_on_interception(svm); | |
@@ -4302,6 +4328,7 @@ static struct kvm_x86_ops svm_x86_ops = { | |
.get_dr6 = svm_get_dr6, | |
.set_dr6 = svm_set_dr6, | |
.set_dr7 = svm_set_dr7, | |
+ .sync_dirty_debug_regs = svm_sync_dirty_debug_regs, | |
.cache_reg = svm_cache_reg, | |
.get_rflags = svm_get_rflags, | |
.set_rflags = svm_set_rflags, | |
-- | |
1.8.3.1 | |
-- | |
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in | |
the body of a message to majordomo@vger.kernel.org | |
More majordomo info at http://vger.kernel.org/majordomo-info.html | |
Please read the FAQ at http://www.tux.org/lkml/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
When preparing the VMCS02, the CPU-based execution controls is computed | |
by vmx_exec_control. Turn off DR access exits there, too, if the | |
KVM_DEBUGREG_WONT_EXIT bit is set in switch_db_regs. | |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | |
--- | |
arch/x86/kvm/vmx.c | 4 ++++ | |
1 file changed, 4 insertions(+) | |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | |
index e377522408b1..73ced6efc93e 100644 | |
--- a/arch/x86/kvm/vmx.c | |
+++ b/arch/x86/kvm/vmx.c | |
@@ -4234,6 +4234,10 @@ static u32 vmx_pin_based_exec_ctrl(struct vcpu_vmx *vmx) | |
static u32 vmx_exec_control(struct vcpu_vmx *vmx) | |
{ | |
u32 exec_control = vmcs_config.cpu_based_exec_ctrl; | |
+ | |
+ if (vmx->vcpu.arch.switch_db_regs & KVM_DEBUGREG_WONT_EXIT) | |
+ exec_control &= ~CPU_BASED_MOV_DR_EXITING; | |
+ | |
if (!vm_need_tpr_shadow(vmx->vcpu.kvm)) { | |
exec_control &= ~CPU_BASED_TPR_SHADOW; | |
#ifdef CONFIG_X86_64 | |
-- | |
1.8.3.1 | |
-- | |
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in | |
the body of a message to majordomo@vger.kernel.org | |
More majordomo info at http://vger.kernel.org/majordomo-info.html | |
Please read the FAQ at http://www.tux.org/lkml/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
The next patch will add another bit that we can test with the | |
same "if". | |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | |
--- | |
arch/x86/include/asm/kvm_host.h | 6 +++++- | |
arch/x86/kvm/x86.c | 4 +++- | |
2 files changed, 8 insertions(+), 2 deletions(-) | |
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h | |
index 85be627ef5de..5ef59d3b6c63 100644 | |
--- a/arch/x86/include/asm/kvm_host.h | |
+++ b/arch/x86/include/asm/kvm_host.h | |
@@ -337,6 +337,10 @@ struct kvm_pmu { | |
u64 reprogram_pmi; | |
}; | |
+enum { | |
+ KVM_DEBUGREG_BP_ENABLED = 1, | |
+}; | |
+ | |
struct kvm_vcpu_arch { | |
/* | |
* rip and regs accesses must go through | |
@@ -463,7 +467,7 @@ struct kvm_vcpu_arch { | |
struct mtrr_state_type mtrr_state; | |
u32 pat; | |
- int switch_db_regs; | |
+ unsigned switch_db_regs; | |
unsigned long db[KVM_NR_DB_REGS]; | |
unsigned long dr6; | |
unsigned long dr7; | |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | |
index a45bcac45645..252b47e85c69 100644 | |
--- a/arch/x86/kvm/x86.c | |
+++ b/arch/x86/kvm/x86.c | |
@@ -759,7 +759,9 @@ static void kvm_update_dr7(struct kvm_vcpu *vcpu) | |
else | |
dr7 = vcpu->arch.dr7; | |
kvm_x86_ops->set_dr7(vcpu, dr7); | |
- vcpu->arch.switch_db_regs = (dr7 & DR7_BP_EN_MASK); | |
+ vcpu->arch.switch_db_regs &= ~KVM_DEBUGREG_BP_ENABLED; | |
+ if (dr7 & DR7_BP_EN_MASK) | |
+ vcpu->arch.switch_db_regs |= KVM_DEBUGREG_BP_ENABLED; | |
} | |
static int __kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val) | |
-- | |
1.8.3.1 | |
-- | |
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in | |
the body of a message to majordomo@vger.kernel.org | |
More majordomo info at http://vger.kernel.org/majordomo-info.html | |
Please read the FAQ at http://www.tux.org/lkml/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
When not running in guest-debug mode, the guest controls the debug | |
registers and having to take an exit for each DR access is a waste | |
of time. If the guest gets into a state where each context switch | |
causes DR to be saved and restored, this can take away as much as 40% | |
of the execution time from the guest. | |
After this patch, VMX- and SVM-specific code can set a flag in | |
switch_db_regs, telling vcpu_enter_guest that on the next exit the debug | |
registers might be dirty and need to be reloaded (syncing will be taken | |
care of by a new callback in kvm_x86_ops). This flag can be set on the | |
first access to a debug registers, so that multiple accesses to the | |
debug registers only cause one vmexit. | |
Note that since the guest will be able to read debug registers and | |
enable breakpoints in DR7, we need to ensure that they are synchronized | |
on entry to the guest---including DR6 that was not synced before. | |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | |
--- | |
arch/x86/include/asm/kvm_host.h | 2 ++ | |
arch/x86/kvm/x86.c | 16 ++++++++++++++++ | |
2 files changed, 18 insertions(+) | |
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h | |
index 5ef59d3b6c63..74eb361eaa8f 100644 | |
--- a/arch/x86/include/asm/kvm_host.h | |
+++ b/arch/x86/include/asm/kvm_host.h | |
@@ -339,6 +339,7 @@ struct kvm_pmu { | |
enum { | |
KVM_DEBUGREG_BP_ENABLED = 1, | |
+ KVM_DEBUGREG_WONT_EXIT = 2, | |
}; | |
struct kvm_vcpu_arch { | |
@@ -707,6 +708,7 @@ struct kvm_x86_ops { | |
void (*set_gdt)(struct kvm_vcpu *vcpu, struct desc_ptr *dt); | |
u64 (*get_dr6)(struct kvm_vcpu *vcpu); | |
void (*set_dr6)(struct kvm_vcpu *vcpu, unsigned long value); | |
+ void (*sync_dirty_debug_regs)(struct kvm_vcpu *vcpu); | |
void (*set_dr7)(struct kvm_vcpu *vcpu, unsigned long value); | |
void (*cache_reg)(struct kvm_vcpu *vcpu, enum kvm_reg reg); | |
unsigned long (*get_rflags)(struct kvm_vcpu *vcpu); | |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | |
index 252b47e85c69..c48818aa04c0 100644 | |
--- a/arch/x86/kvm/x86.c | |
+++ b/arch/x86/kvm/x86.c | |
@@ -6033,12 +6033,28 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) | |
set_debugreg(vcpu->arch.eff_db[1], 1); | |
set_debugreg(vcpu->arch.eff_db[2], 2); | |
set_debugreg(vcpu->arch.eff_db[3], 3); | |
+ set_debugreg(vcpu->arch.dr6, 6); | |
} | |
trace_kvm_entry(vcpu->vcpu_id); | |
kvm_x86_ops->run(vcpu); | |
/* | |
+ * Do this here before restoring debug registers on the host. And | |
+ * since we do this before handling the vmexit, a DR access vmexit | |
+ * can (a) read the correct value of the debug registers, (b) set | |
+ * KVM_DEBUGREG_WONT_EXIT again. | |
+ */ | |
+ if (unlikely(vcpu->arch.switch_db_regs & KVM_DEBUGREG_WONT_EXIT)) { | |
+ int i; | |
+ | |
+ WARN_ON(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP); | |
+ kvm_x86_ops->sync_dirty_debug_regs(vcpu); | |
+ for (i = 0; i < KVM_NR_DB_REGS; i++) | |
+ vcpu->arch.eff_db[i] = vcpu->arch.db[i]; | |
+ } | |
+ | |
+ /* | |
* If the guest has used debug registers, at least dr7 | |
* will be disabled while returning to the host. | |
* If we don't have active breakpoints in the host, we don't | |
-- | |
1.8.3.1 | |
-- | |
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in | |
the body of a message to majordomo@vger.kernel.org | |
More majordomo info at http://vger.kernel.org/majordomo-info.html | |
Please read the FAQ at http://www.tux.org/lkml/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Currently, this works even if the bit is not in "min", because the bit is always | |
set in MSR_IA32_VMX_ENTRY_CTLS. Mention it for the sake of documentation, and | |
to avoid surprises if we later switch to MSR_IA32_VMX_TRUE_ENTRY_CTLS. | |
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> | |
--- | |
arch/x86/kvm/vmx.c | 2 +- | |
1 file changed, 1 insertion(+), 1 deletion(-) | |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | |
index 53c324f3cc5e..06e4ec877a1c 100644 | |
--- a/arch/x86/kvm/vmx.c | |
+++ b/arch/x86/kvm/vmx.c | |
@@ -2864,7 +2864,7 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) | |
!(_vmexit_control & VM_EXIT_ACK_INTR_ON_EXIT)) | |
_pin_based_exec_control &= ~PIN_BASED_POSTED_INTR; | |
- min = 0; | |
+ min = VM_ENTRY_LOAD_DEBUG_CONTROLS; | |
opt = VM_ENTRY_LOAD_IA32_PAT; | |
if (adjust_vmx_controls(min, opt, MSR_IA32_VMX_ENTRY_CTLS, | |
&_vmentry_control) < 0) | |
-- | |
1.8.3.1 | |
-- | |
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in | |
the body of a message to majordomo@vger.kernel.org | |
More majordomo info at http://vger.kernel.org/majordomo-info.html | |
Please read the FAQ at http://www.tux.org/lkml/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Maintainer: Mikael Eriksson <mikael_eriksson@miffe.org> | |
# Original header from core/linux (aka the people that does all the hard work): | |
# $Id$ | |
# Maintainer: Tobias Powalowski <tpowa@archlinux.org> | |
# Maintainer: Thomas Baechler <thomas@archlinux.org> | |
pkgname=linux-mainline | |
#pkgbase=linux # Build stock -ARCH kernel | |
#pkgbase=linux-custom # Build kernel with a different name | |
_srcname=linux-3.14-rc6 | |
pkgver=3.14rc6 | |
pkgrel=1 | |
arch=('i686' 'x86_64') | |
url="http://www.kernel.org/" | |
license=('GPL2') | |
makedepends=('xmlto' 'docbook-xsl' 'kmod' 'inetutils' 'bc') | |
options=('!strip') | |
source=("http://www.kernel.org/pub/linux/kernel/v3.x/testing/${_srcname}.tar.xz" | |
# the main kernel config files | |
'config' 'config.x86_64' | |
# standard config files for mkinitcpio ramdisk | |
'linux.preset' | |
'change-default-console-loglevel.patch' | |
'criu-no-expert.patch' | |
'0001-syscalls.h-use-gcc-alias-instead-of-assembler-aliase.patch' | |
'kernel-38-gcc48-2.patch' | |
'override_for_missing_acs_capabilities.patch' | |
'radeon_load_vbios_from_file.patch' | |
'i915_313rc4.patch' | |
'fix_memleak.patch' | |
'index.html?l=linux-kernel&m=139419260404488&q=raw' | |
'index.html?l=linux-kernel&m=139419261204492&q=raw' | |
'index.html?l=linux-kernel&m=139419263204499&q=raw' | |
'index.html?l=linux-kernel&m=139419265404502&q=raw' | |
'index.html?l=linux-kernel&m=139419268004517&q=raw' | |
'index.html?l=linux-kernel&m=139419270004527&q=raw' | |
'index.html?l=linux-kernel&m=139419276204556&q=raw' | |
) | |
md5sums=('95166f810b5fc3075bbc24377720f285' | |
'ba4468d313adfaf22368add7f58204aa' | |
'035bb27dac306f5c028d96cad14bb249' | |
'eb14dcfd80c00852ef81ded6e826826a' | |
'98beb36f9b8cf16e58de2483ea9985e3' | |
'989dc54ff8b179b0f80333cc97c0d43f' | |
'e6fa278c092ad83780e2dd0568e24ca6' | |
'5210ebfb8281d0c1b26afde9e1a6a65a' | |
'0145355791855f01d6d94402de2d845e' | |
'8cb409c5f761385f87330308c88eeb92' | |
'c3f9d96e11904ee48de4f1ecb233392f' | |
'e2d4252d9beefd46e20fe6006455bb9b' | |
'b6ae4d1a4cbcdf087869b2ac063468a9' | |
'fc6d4acbb0f93834a59ba3bf7f59f84e' | |
'f3014d3936c77b0d8a309b8b8f737909' | |
'ea1c44069d30d2def6732d85893812d9' | |
'37e56179e9b6074f1f294e44484d880a' | |
'8f42a47be489d00d2edded587719b062' | |
'b8ebfd623c5e1caef3a1f9fa48447264') | |
_kernelname=${pkgname#linux} | |
# mainline: Stolen from _package | |
pkgdesc="The linux-mainline kernel, modules and headers" | |
[ "${pkgbase}" = "linux" ] && groups=('base') | |
depends=('coreutils' 'linux-firmware' 'kmod' 'mkinitcpio>=0.7') | |
optdepends=('crda: to set the correct wireless channels of your country') | |
provides=("kernel26${_kernelname}=${pkgver} linux-mainline-headers linux-mainline-docs") | |
conflicts=("kernel26${_kernelname}") | |
replaces=("kernel26${_kernelname}") | |
backup=("etc/mkinitcpio.d/linux-mainline.preset") | |
install=linux.install | |
# module.symbols md5sums | |
# x86_64 | |
# i686 | |
prepare() { | |
cd "${srcdir}/${_srcname}" | |
# add upstream patch | |
#patch -p1 -i "${srcdir}/patch-${pkgver}" | |
# Radeon load vbios from file | |
patch -p1 -i "${srcdir}/radeon_load_vbios_from_file.patch" | |
# Overrides for missing acs capabilities | |
patch -p1 -i "${srcdir}/override_for_missing_acs_capabilities.patch" | |
# native cflags | |
patch -p1 -i "${srcdir}/kernel-38-gcc48-2.patch" | |
# patches for debug registers | |
patch -p1 -i "${srcdir}/index.html?l=linux-kernel&m=139419260404488&q=raw" | |
patch -p1 -i "${srcdir}/index.html?l=linux-kernel&m=139419261204492&q=raw" | |
patch -p1 -i "${srcdir}/index.html?l=linux-kernel&m=139419263204499&q=raw" | |
patch -p1 -i "${srcdir}/index.html?l=linux-kernel&m=139419265404502&q=raw" | |
patch -p1 -i "${srcdir}/index.html?l=linux-kernel&m=139419268004517&q=raw" | |
patch -p1 -i "${srcdir}/index.html?l=linux-kernel&m=139419270004527&q=raw" | |
patch -p1 -i "${srcdir}/index.html?l=linux-kernel&m=139419276204556&q=raw" | |
# add latest fixes from stable queue, if needed | |
# http://git.kernel.org/?p=linux/kernel/git/stable/stable-queue.git | |
# set DEFAULT_CONSOLE_LOGLEVEL to 4 (same value as the 'quiet' kernel param) | |
# remove this when a Kconfig knob is made available by upstream | |
# (relevant patch sent upstream: https://lkml.org/lkml/2011/7/26/227) | |
patch -p1 -i "${srcdir}/change-default-console-loglevel.patch" | |
# allow Checkpoint/restore (for criu) without EXPERT=y | |
#patch -p1 -i "${srcdir}/criu-no-expert.patch" | |
# Fix symbols: Revert http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=83460ec8dcac14142e7860a01fa59c267ac4657c | |
patch -Rp1 -i "${srcdir}/0001-syscalls.h-use-gcc-alias-instead-of-assembler-aliase.patch" | |
# allow criu without expert option set | |
# patch from fedora | |
patch -Np1 -i "${srcdir}/criu-no-expert.patch" | |
# patches for vga arbiter fix in intel systems | |
patch -Np1 -i "${srcdir}/i915_313rc4.patch" | |
# revert patch that couses memleak | |
patch -Np1 -i "${srcdir}/fix_memleak.patch" | |
if [ "${CARCH}" = "x86_64" ]; then | |
cat "${srcdir}/config.x86_64" > ./.config | |
else | |
cat "${srcdir}/config" > ./.config | |
fi | |
if [ "${_kernelname}" != "" ]; then | |
sed -i "s|CONFIG_LOCALVERSION=.*|CONFIG_LOCALVERSION=\"${_kernelname}\"|g" ./.config | |
sed -i "s|CONFIG_LOCALVERSION_AUTO=.*|CONFIG_LOCALVERSION_AUTO=n|" ./.config | |
fi | |
# set extraversion to pkgrel | |
sed -ri "s|^(EXTRAVERSION =).*|\1 -${pkgrel}|" Makefile | |
# don't run depmod on 'make install'. We'll do this ourselves in packaging | |
sed -i '2iexit 0' scripts/depmod.sh | |
# get kernel version | |
#make prepare | |
# load configuration | |
# Configure the kernel. Replace the line below with one of your choice. | |
#make menuconfig # CLI menu for configuration | |
make nconfig # new CLI menu for configuration | |
#make xconfig # X-based configuration | |
#make oldconfig # using old config from previous kernel version | |
#make olddefconfig | |
# ... or manually edit .config | |
# rewrite configuration | |
yes "" | make config >/dev/null | |
} | |
build() { | |
cd "${srcdir}/${_srcname}" | |
make ${MAKEFLAGS} LOCALVERSION= bzImage modules | |
} | |
package() { | |
_package | |
_package-docs | |
_package-headers | |
} | |
_package() { | |
# mainline: Set Globaly | |
#pkgdesc="The ${pkgbase/linux/Linux} kernel and modules" | |
#[ "${pkgbase}" = "linux" ] && groups=('base') | |
#depends=('coreutils' 'linux-firmware' 'kmod' 'mkinitcpio>=0.7') | |
#optdepends=('crda: to set the correct wireless channels of your country') | |
#provides=("kernel26${_kernelname}=${pkgver}") | |
#conflicts=("kernel26${_kernelname}") | |
#replaces=("kernel26${_kernelname}") | |
#backup=("etc/mkinitcpio.d/${pkgbase}.preset") | |
#install=linux.install | |
cd "${srcdir}/${_srcname}" | |
KARCH=x86 | |
# get kernel version | |
_kernver="$(make LOCALVERSION= kernelrelease)" | |
_basekernel=${_kernver%%-*} | |
_basekernel=${_basekernel%.*} | |
mkdir -p "${pkgdir}"/{lib/modules,lib/firmware,boot} | |
make LOCALVERSION= INSTALL_MOD_PATH="${pkgdir}" modules_install | |
cp arch/$KARCH/boot/bzImage "${pkgdir}/boot/vmlinuz-${pkgname}" | |
# set correct depmod command for install | |
cp -f "${startdir}/${install}" "${startdir}/${install}.pkg" | |
true && install=${install}.pkg | |
sed \ | |
-e "s/KERNEL_NAME=.*/KERNEL_NAME=${_kernelname}/" \ | |
-e "s/KERNEL_VERSION=.*/KERNEL_VERSION=${_kernver}/" \ | |
-i "${startdir}/${install}" | |
# install mkinitcpio preset file for kernel | |
install -D -m644 "${srcdir}/linux.preset" "${pkgdir}/etc/mkinitcpio.d/linux-mainline.preset" | |
sed \ | |
-e "1s|'linux.*'|'${pkgname}'|" \ | |
-e "s|ALL_kver=.*|ALL_kver=\"/boot/vmlinuz-${pkgname}\"|" \ | |
-e "s|default_image=.*|default_image=\"/boot/initramfs-${pkgname}.img\"|" \ | |
-e "s|fallback_image=.*|fallback_image=\"/boot/initramfs-${pkgname}-fallback.img\"|" \ | |
-i "${pkgdir}/etc/mkinitcpio.d/${pkgname}.preset" | |
# remove build and source links | |
rm -f "${pkgdir}"/lib/modules/${_kernver}/{source,build} | |
# remove the firmware | |
rm -rf "${pkgdir}/lib/firmware" | |
# gzip -9 all modules to save 100MB of space | |
find "${pkgdir}" -name '*.ko' -exec gzip -9 {} \; | |
# make room for external modules | |
ln -s "../extramodules-${_basekernel}${_kernelname:--ARCH}" "${pkgdir}/lib/modules/${_kernver}/extramodules" | |
# add real version for building modules and running depmod from post_install/upgrade | |
mkdir -p "${pkgdir}/lib/modules/extramodules-${_basekernel}${_kernelname:--ARCH}" | |
echo "${_kernver}" > "${pkgdir}/lib/modules/extramodules-${_basekernel}${_kernelname:--ARCH}/version" | |
# Now we call depmod... | |
depmod -b "${pkgdir}" -F System.map "${_kernver}" | |
# move module tree /lib -> /usr/lib | |
mkdir -p "${pkgdir}/usr" | |
mv "${pkgdir}/lib" "${pkgdir}/usr/" | |
# add vmlinux | |
install -D -m644 vmlinux "${pkgdir}/usr/lib/modules/${_kernver}/build/vmlinux" | |
} | |
_package-headers() { | |
# mainline: Set globaly | |
#pkgdesc="Header files and scripts for building modules for ${pkgbase/linux/Linux} kernel" | |
#provides=("kernel26${_kernelname}-headers=${pkgver}") | |
#conflicts=("kernel26${_kernelname}-headers") | |
#replaces=("kernel26${_kernelname}-headers") | |
install -dm755 "${pkgdir}/usr/lib/modules/${_kernver}" | |
cd "${srcdir}/${_srcname}" | |
install -D -m644 Makefile \ | |
"${pkgdir}/usr/lib/modules/${_kernver}/build/Makefile" | |
install -D -m644 kernel/Makefile \ | |
"${pkgdir}/usr/lib/modules/${_kernver}/build/kernel/Makefile" | |
install -D -m644 .config \ | |
"${pkgdir}/usr/lib/modules/${_kernver}/build/.config" | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/include" | |
for i in acpi asm-generic config crypto drm generated keys linux math-emu \ | |
media net pcmcia scsi sound trace uapi video xen; do | |
cp -a include/${i} "${pkgdir}/usr/lib/modules/${_kernver}/build/include/" | |
done | |
# copy arch includes for external modules | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/arch/x86" | |
cp -a arch/x86/include "${pkgdir}/usr/lib/modules/${_kernver}/build/arch/x86/" | |
# copy files necessary for later builds, like nvidia and vmware | |
cp Module.symvers "${pkgdir}/usr/lib/modules/${_kernver}/build" | |
cp -a scripts "${pkgdir}/usr/lib/modules/${_kernver}/build" | |
# fix permissions on scripts dir | |
chmod og-w -R "${pkgdir}/usr/lib/modules/${_kernver}/build/scripts" | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/.tmp_versions" | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/arch/${KARCH}/kernel" | |
cp arch/${KARCH}/Makefile "${pkgdir}/usr/lib/modules/${_kernver}/build/arch/${KARCH}/" | |
if [ "${CARCH}" = "i686" ]; then | |
cp arch/${KARCH}/Makefile_32.cpu "${pkgdir}/usr/lib/modules/${_kernver}/build/arch/${KARCH}/" | |
fi | |
cp arch/${KARCH}/kernel/asm-offsets.s "${pkgdir}/usr/lib/modules/${_kernver}/build/arch/${KARCH}/kernel/" | |
# add headers for lirc package | |
# pci | |
for i in bt8xx cx88 saa7134; do | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/pci/${i}" | |
cp -a drivers/media/pci/${i}/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/pci/${i}" | |
done | |
# usb | |
for i in cpia2 em28xx pwc; do | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/usb/${i}" | |
cp -a drivers/media/usb/${i}/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/usb/${i}" | |
done | |
# i2c | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/i2c" | |
cp drivers/media/i2c/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/i2c/" | |
for i in cx25840; do | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/i2c/${i}" | |
cp -a drivers/media/i2c/${i}/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/i2c/${i}" | |
done | |
# add docbook makefile | |
install -D -m644 Documentation/DocBook/Makefile \ | |
"${pkgdir}/usr/lib/modules/${_kernver}/build/Documentation/DocBook/Makefile" | |
# add dm headers | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/md" | |
cp drivers/md/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/md" | |
# add inotify.h | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/include/linux" | |
cp include/linux/inotify.h "${pkgdir}/usr/lib/modules/${_kernver}/build/include/linux/" | |
# add wireless headers | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/net/mac80211/" | |
cp net/mac80211/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/net/mac80211/" | |
# add dvb headers for external modules | |
# in reference to: | |
# http://bugs.archlinux.org/task/9912 | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/dvb-core" | |
cp drivers/media/dvb-core/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/dvb-core/" | |
# and... | |
# http://bugs.archlinux.org/task/11194 | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/include/config/dvb/" | |
cp include/config/dvb/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/include/config/dvb/" | |
# add dvb headers for http://mcentral.de/hg/~mrec/em28xx-new | |
# in reference to: | |
# http://bugs.archlinux.org/task/13146 | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/dvb-frontends/" | |
cp drivers/media/dvb-frontends/lgdt330x.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/dvb-frontends/" | |
cp drivers/media/i2c/msp3400-driver.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/i2c/" | |
# add dvb headers | |
# in reference to: | |
# http://bugs.archlinux.org/task/20402 | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/usb/dvb-usb" | |
cp drivers/media/usb/dvb-usb/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/usb/dvb-usb/" | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/dvb-frontends" | |
cp drivers/media/dvb-frontends/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/dvb-frontends/" | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/tuners" | |
cp drivers/media/tuners/*.h "${pkgdir}/usr/lib/modules/${_kernver}/build/drivers/media/tuners/" | |
# add xfs and shmem for aufs building | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/fs/xfs" | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build/mm" | |
cp fs/xfs/xfs_sb.h "${pkgdir}/usr/lib/modules/${_kernver}/build/fs/xfs/xfs_sb.h" | |
# copy in Kconfig files | |
for i in $(find . -name "Kconfig*"); do | |
mkdir -p "${pkgdir}"/usr/lib/modules/${_kernver}/build/`echo ${i} | sed 's|/Kconfig.*||'` | |
cp ${i} "${pkgdir}/usr/lib/modules/${_kernver}/build/${i}" | |
done | |
chown -R root.root "${pkgdir}/usr/lib/modules/${_kernver}/build" | |
find "${pkgdir}/usr/lib/modules/${_kernver}/build" -type d -exec chmod 755 {} \; | |
# strip scripts directory | |
find "${pkgdir}/usr/lib/modules/${_kernver}/build/scripts" -type f -perm -u+w 2>/dev/null | while read binary ; do | |
case "$(file -bi "${binary}")" in | |
*application/x-sharedlib*) # Libraries (.so) | |
/usr/bin/strip ${STRIP_SHARED} "${binary}";; | |
*application/x-archive*) # Libraries (.a) | |
/usr/bin/strip ${STRIP_STATIC} "${binary}";; | |
*application/x-executable*) # Binaries | |
/usr/bin/strip ${STRIP_BINARIES} "${binary}";; | |
esac | |
done | |
# remove unneeded architectures | |
rm -rf "${pkgdir}"/usr/lib/modules/${_kernver}/build/arch/{alpha,arc,arm,arm26,arm64,avr32,blackfin,c6x,cris,frv,h8300,hexagon,ia64,m32r,m68k,m68knommu,metag,mips,microblaze,mn10300,openrisc,parisc,powerpc,ppc,s390,score,sh,sh64,sparc,sparc64,tile,unicore32,um,v850,xtensa} | |
} | |
_package-docs() { | |
# mainline: Set globaly | |
#pkgdesc="Kernel hackers manual - HTML documentation that comes with the ${pkgbase/linux/Linux} kernel" | |
#provides=("kernel26${_kernelname}-docs=${pkgver}") | |
#conflicts=("kernel26${_kernelname}-docs") | |
#replaces=("kernel26${_kernelname}-docs") | |
cd "${srcdir}/${_srcname}" | |
# mainline: cp complains if we dont remove this | |
#rm -f "${pkgdir}/usr/src/linux-${_kernver}/Documentation/DocBook/Makefile" | |
mkdir -p "${pkgdir}/usr/lib/modules/${_kernver}/build" | |
cp -al Documentation "${pkgdir}/usr/lib/modules/${_kernver}/build" | |
find "${pkgdir}" -type f -exec chmod 444 {} \; | |
find "${pkgdir}" -type d -exec chmod 755 {} \; | |
# remove a file already in linux package | |
rm -f "${pkgdir}/usr/lib/modules/${_kernver}/build/Documentation/DocBook/Makefile" | |
} | |
# mainline: Disabled | |
#pkgname=("${pkgbase}" "${pkgbase}-headers" "${pkgbase}-docs") | |
#for _p in ${pkgname[@]}; do | |
# eval "package_${_p}() { | |
# _package${_p#${pkgbase}} | |
# }" | |
#done | |
# vim:set ts=8 sts=2 sw=2 et: |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment