From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex =?utf-8?Q?Benn=C3=A9e?= Subject: Re: [PATCH v2 09/10] KVM: arm64: trap nested debug register access Date: Mon, 13 Apr 2015 08:59:21 +0100 Message-ID: <877ftglaqu.fsf@linaro.org> References: <1427814488-28467-1-git-send-email-alex.bennee@linaro.org> <1427814488-28467-10-git-send-email-alex.bennee@linaro.org> <20150410123830.GB3227@hawk.usersys.redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id C539B4C358 for ; Mon, 13 Apr 2015 03:51:25 -0400 (EDT) Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WLoEy+-PQ8df for ; Mon, 13 Apr 2015 03:51:24 -0400 (EDT) Received: from socrates.bennee.com (static.88-198-71-155.clients.your-server.de [88.198.71.155]) by mm01.cs.columbia.edu (Postfix) with ESMTPS id 903B34C356 for ; Mon, 13 Apr 2015 03:51:24 -0400 (EDT) In-reply-to: <20150410123830.GB3227@hawk.usersys.redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu To: Andrew Jones Cc: Catalin Marinas , kvm@vger.kernel.org, marc.zyngier@arm.com, jan.kiszka@siemens.com, Will Deacon , open list , dahi@linux.vnet.ibm.com, linux-arm-kernel@lists.infradead.org, zhichao.huang@linaro.org, r65777@freescale.com, pbonzini@redhat.com, bp@suse.de, Gleb Natapov , kvmarm@lists.cs.columbia.edu List-Id: kvmarm@lists.cs.columbia.edu CkFuZHJldyBKb25lcyA8ZHJqb25lc0ByZWRoYXQuY29tPiB3cml0ZXM6Cgo+IE9uIFR1ZSwgTWFy IDMxLCAyMDE1IGF0IDA0OjA4OjA3UE0gKzAxMDAsIEFsZXggQmVubsOpZSB3cm90ZToKPj4gV2hl biB3ZSBhcmUgdXNpbmcgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyBmb3IgZ3Vlc3QgZGVidWcgd2Ug bmVlZCB0byBkZWFsCj4+IHdpdGggdGhlIGd1ZXN0cyBhY2Nlc3MgdG8gdGhlbS4gVGhlcmUgaXMg YWxyZWFkeSBhIG1lY2hhbmlzbSBmb3IgZGVhbGluZwo+PiB3aXRoIHRoZXNlIGFjY2Vzc2VzIHNv IHdlIGJ1aWxkIG9uIHRvcCBvZiB0aGF0Lgo+PiAKPj4gICAtIG1kc2NyX2VsMV9iaXRzIGlzIHJl bmFtZWQgYXMgd2Ugc2F2ZSB0aGUgd2hvbGUgcmVnaXN0ZXIKPj4gICAtIGFueSBhY2Nlc3MgdG8g bWRzY3JfZWwxIGlzIG5vdyBzdG9yZWQgaW4gdGhlIG1pcnJvciBsb2NhdGlvbgo+PiAgIC0gaWYg d2UgYXJlIHVzaW5nIEhXIGFzc2lzdGVkIGRlYnVnIHdlIGRvIHRoZSBzYW1lIHdpdGggREJHW1dC XVtDVl1SCj4+IAo+PiBUaGVyZSBpcyBvbmUgcmVnaXN0ZXIgKE1EQ0NJTlRfRUwxKSB3aGljaCBn dWVzdCBkZWJ1ZyBkb2Vzbid0IGNhcmUgYWJvdXQKPj4gc28gdGhpcyBiZWhhdmVzIGFzIGJlZm9y ZS4KPj4gCj4+IFNpZ25lZC1vZmYtYnk6IEFsZXggQmVubsOpZSA8YWxleC5iZW5uZWVAbGluYXJv Lm9yZz4KPj4gCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0 LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPj4gaW5kZXggMmMzNTljOS4u M2QzMmQ0NSAxMDA2NDQKPj4gLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5o Cj4+ICsrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAo+PiBAQCAtMTIyLDEw ICsxMjIsMTMgQEAgc3RydWN0IGt2bV92Y3B1X2FyY2ggewo+PiAgCSAqIGhlcmUuCj4+ICAJICov Cj4+ICAKPj4gLQkvKiBSZWdpc3RlcnMgcHJlIGFueSBndWVzdCBkZWJ1ZyBtYW5pcHVsYXRpb25z ICovCj4+ICsJLyogUmVnaXN0ZXJzIGJlZm9yZSBhbnkgZ3Vlc3QgZGVidWcgbWFuaXB1bGF0aW9u cy4gVGhlc2UKPgo+IHN0YXJ0aW5nIGNvbW1lbnQgLyogb24gb3duIGxpbmUKPgo+PiArCSAqIHNo YWRvdyByZWdpc3RlcnMgYXJlIHVwZGF0ZWQgYnkgdGhlIGt2bV9oYW5kbGVfc3lzX3JlZwo+PiAr CSAqIHRyYXAgaGFuZGxlciBpZiB0aGUgZ3Vlc3QgYWNjZXNzZXMgb3IgdXBkYXRlcyB0aGVtCj4+ ICsJICovCj4+ICAJc3RydWN0IHsKPj4gIAkJdTMyCXBzdGF0ZV9zc19iaXQ7Cj4+IC0JCXUzMglt ZHNjcl9lbDFfYml0czsKPj4gKwkJdTMyCW1kc2NyX2VsMTsKPj4gIAo+PiAgCQlzdHJ1Y3Qga3Zt X2d1ZXN0X2RlYnVnX2FyY2ggZGVidWdfcmVnczsKPj4gIAl9IGRlYnVnX3NhdmVkX3JlZ3M7Cj4+ IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9kZWJ1Zy5jIGIvYXJjaC9hcm02NC9rdm0vZGVi dWcuYwo+PiBpbmRleCAzYjM2OGYzLi42MzhjMTExIDEwMDY0NAo+PiAtLS0gYS9hcmNoL2FybTY0 L2t2bS9kZWJ1Zy5jCj4+ICsrKyBiL2FyY2gvYXJtNjQva3ZtL2RlYnVnLmMKPj4gQEAgLTU1LDgg KzU1LDYgQEAgdm9pZCBrdm1fYXJjaF9zZXR1cF9kZWJ1ZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUp Cj4+ICAJdmNwdS0+YXJjaC5tZGNyX2VsMiB8PSAoTURDUl9FTDJfVFBNIHwgTURDUl9FTDJfVFBN Q1IpOwo+PiAgCXZjcHUtPmFyY2gubWRjcl9lbDIgfD0gKE1EQ1JfRUwyX1REUkEgfCBNRENSX0VM Ml9URE9TQSk7Cj4+ICAKPj4gLQl0cmFjZV9rdm1fYXJjaF9zZXR1cF9kZWJ1Z19yZWczMigiTURD Ul9FTDIiLCB2Y3B1LT5hcmNoLm1kY3JfZWwyKTsKPj4gLQo+Cj4gSSBndWVzcyBJJ2xsIHNlZSB0 aGlzIGNvbWUgYmFjayBpbiB0aGUgbmV4dCBwYXRjaC4gWW91IG11c3QgYmUgcGxheWluZwo+ICdu b3cgeW91IHNlZSBtZSwgbm93IHlvdSBkb24ndCcKCk9vcHMsIG1pc3NlZCB0aGF0IG9uIHRoZSBy ZWJhc2UuCgo+Cj4+ICAJLyoKPj4gIAkgKiBJZiB3ZSBhcmUgbm90IHRyZWF0aW5nIGRlYnVnIHJl Z2lzdGVycyBhcmUgZGlydHkgd2UgbmVlZAo+PiAgCSAqIHRvIHRyYXAgaWYgdGhlIGd1ZXN0IHN0 YXJ0cyBhY2Nlc3NpbmcgdGhlbS4KPj4gQEAgLTcxLDggKzY5LDEwIEBAIHZvaWQga3ZtX2FyY2hf c2V0dXBfZGVidWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+PiAgCQkvKiBTYXZlIHBzdGF0ZS9t ZHNjciAqLwo+PiAgCQl2Y3B1X2RlYnVnX3NhdmVkX3JlZyh2Y3B1LCBwc3RhdGVfc3NfYml0KSA9 Cj4+ICAJCQkqdmNwdV9jcHNyKHZjcHUpICYgREJHX1NQU1JfU1M7Cj4+IC0JCXZjcHVfZGVidWdf c2F2ZWRfcmVnKHZjcHUsIG1kc2NyX2VsMV9iaXRzKSA9Cj4+IC0JCQl2Y3B1X3N5c19yZWcodmNw dSwgTURTQ1JfRUwxKSAmIE1EU0NSX0VMMV9ERUJVR19CSVRTOwo+PiArCj4+ICsJCXZjcHVfZGVi dWdfc2F2ZWRfcmVnKHZjcHUsIG1kc2NyX2VsMSkgPQo+PiArCQkJdmNwdV9zeXNfcmVnKHZjcHUs IE1EU0NSX0VMMSk7Cj4+ICsKPj4gIAkJLyoKPj4gIAkJICogU2luZ2xlIFN0ZXAgKEFSTSBBUk0g RDIuMTIuMyBUaGUgc29mdHdhcmUgc3RlcCBzdGF0ZQo+PiAgCQkgKiBtYWNoaW5lKQo+PiBAQCAt MTYxLDkgKzE2MSw4IEBAIHZvaWQga3ZtX2FyY2hfY2xlYXJfZGVidWcoc3RydWN0IGt2bV92Y3B1 ICp2Y3B1KQo+PiAgCQkqdmNwdV9jcHNyKHZjcHUpICY9IH5EQkdfU1BTUl9TUzsKPj4gIAkJKnZj cHVfY3Bzcih2Y3B1KSB8PSB2Y3B1X2RlYnVnX3NhdmVkX3JlZyh2Y3B1LCBwc3RhdGVfc3NfYml0 KTsKPj4gIAo+PiAtCQl2Y3B1X3N5c19yZWcodmNwdSwgTURTQ1JfRUwxKSAmPSB+TURTQ1JfRUwx X0RFQlVHX0JJVFM7Cj4+IC0JCXZjcHVfc3lzX3JlZyh2Y3B1LCBNRFNDUl9FTDEpIHw9Cj4+IC0J CQl2Y3B1X2RlYnVnX3NhdmVkX3JlZyh2Y3B1LCBtZHNjcl9lbDFfYml0cyk7Cj4+ICsJCXZjcHVf c3lzX3JlZyh2Y3B1LCBNRFNDUl9FTDEpID0KPj4gKwkJCXZjcHVfZGVidWdfc2F2ZWRfcmVnKHZj cHUsIG1kc2NyX2VsMSk7Cj4+ICAKPj4gIAkJLyoKPj4gIAkJICogSWYgd2Ugd2VyZSB1c2luZyBI VyBkZWJ1ZyB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlCj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0 L2t2bS9zeXNfcmVncy5jIGIvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3MuYwo+PiBpbmRleCBiZTli MTg4Li5kNDNkN2QxIDEwMDY0NAo+PiAtLS0gYS9hcmNoL2FybTY0L2t2bS9zeXNfcmVncy5jCj4+ ICsrKyBiL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzLmMKPj4gQEAgLTIwOCwzOSArMjA4LDYxIEBA IHN0YXRpYyBib29sIHRyYXBfZGVidWdfcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCj4+ICAJ CQkgICAgY29uc3Qgc3RydWN0IHN5c19yZWdfcGFyYW1zICpwLAo+PiAgCQkJICAgIGNvbnN0IHN0 cnVjdCBzeXNfcmVnX2Rlc2MgKnIpCj4+ICB7Cj4+IC0JaWYgKHZjcHUtPmd1ZXN0X2RlYnVnICYg S1ZNX0dVRVNUREJHX1VTRV9IV19CUCkgewo+PiAtCQlzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnX2Fy Y2ggKnNhdmVkOwo+PiAtCQlfX3U2NCAqdmFsOwo+PiAtCj4+IC0JCXNhdmVkID0gJnZjcHVfZGVi dWdfc2F2ZWRfcmVnKHZjcHUsIGRlYnVnX3JlZ3MpOwo+PiAtCj4+IC0JCWlmIChyLT5yZWcgPj0g REJHQkNSMF9FTDEgJiYgci0+cmVnIDw9IERCR0JDUjE1X0VMMSkKPj4gLQkJCXZhbCA9ICZzYXZl ZC0+ZGJnX2JjcltyLT5yZWcgLSBEQkdCQ1IwX0VMMV07Cj4+IC0JCWVsc2UgaWYgKHItPnJlZyA+ PSBEQkdCVlIwX0VMMSAmJiByLT5yZWcgPD0gREJHQlZSMTVfRUwxKQo+PiAtCQkJdmFsID0gJnNh dmVkLT5kYmdfYnZyW3ItPnJlZyAtIERCR0JWUjBfRUwxXTsKPj4gLQkJZWxzZSBpZiAoci0+cmVn ID49IERCR1dDUjBfRUwxICYmIHItPnJlZyA8PSBEQkdXQ1IxNV9FTDEpCj4+IC0JCQl2YWwgPSAm c2F2ZWQtPmRiZ193Y3Jbci0+cmVnIC0gREJHV0NSMF9FTDFdOwo+PiAtCQllbHNlIGlmIChyLT5y ZWcgPj0gREJHV1ZSMF9FTDEgJiYgci0+cmVnIDw9IERCR1dWUjE1X0VMMSkKPj4gLQkJCXZhbCA9 ICZzYXZlZC0+ZGJnX3d2cltyLT5yZWcgLSBEQkdXVlIwX0VMMV07Cj4+IC0JCWVsc2Ugewo+PiAt CQkJa3ZtX2VycigiQmFkIHJlZ2lzdGVyIGluZGV4ICVkXG4iLCByLT5yZWcpOwo+PiAtCQkJcmV0 dXJuIGZhbHNlOwo+PiArCWlmICh2Y3B1LT5ndWVzdF9kZWJ1Zykgewo+PiArCj4+ICsJCS8qIE1E U0NSX0VMMSAqLwo+PiArCQlpZiAoci0+cmVnID09IE1EU0NSX0VMMSkgewo+PiArCQkJaWYgKHAt PmlzX3dyaXRlKQo+PiArCQkJCXZjcHVfZGVidWdfc2F2ZWRfcmVnKHZjcHUsIG1kc2NyX2VsMSkg PQo+PiArCQkJCQkqdmNwdV9yZWcodmNwdSwgcC0+UnQpOwo+PiArCQkJZWxzZQo+PiArCQkJCSp2 Y3B1X3JlZyh2Y3B1LCBwLT5SdCkgPQo+PiArCQkJCQl2Y3B1X2RlYnVnX3NhdmVkX3JlZyh2Y3B1 LCBtZHNjcl9lbDEpOwo+Cj4gV2l0aCB0aGlzIGxpbmVzIHdyYXBwaW5nLCB7fSdzIG1pZ2h0IGJl IG5pY2UuCgpNeSBuYXR1cmFsIGluY2xpbmF0aW9uIGlzIHRvIHdyYXAgaW4ge30ncyBidXQgSSBr bm93IHRoZSBrZXJuZWwgaXMgYSBmYW4Kb2YgdGhlIHNpbmdsZS1zdGF0ZW1lbnQgaWYgZm9ybXMu Cgo+Cj4+ICsKPj4gKwkJCXJldHVybiB0cnVlOwo+PiAgCQl9Cj4+ICAKPj4gLQkJaWYgKHAtPmlz X3dyaXRlKQo+PiAtCQkJKnZhbCA9ICp2Y3B1X3JlZyh2Y3B1LCBwLT5SdCk7Cj4+IC0JCWVsc2UK Pj4gLQkJCSp2Y3B1X3JlZyh2Y3B1LCBwLT5SdCkgPSAqdmFsOwo+PiArCQkvKiBNRENDSU5UX0VM MSAqLwo+PiArCQlpZiAoci0+cmVnID09IE1EQ0NJTlRfRUwxKQo+PiArCQkJZ290byBvbGQ7Cj4K PiAib2xkIj8gQXMgaW4gdGhlIG9sZCB3YXkgdGhpcyB3b3JrZWQ/IFNvbWVkYXkgKHNvb24pIGFs bCB0aGlzIGNvZGUgd2lsbAo+IGJlICJvbGQiLiBIb3cgYWJvdXQganVzdCAnb3V0Jz8gT3IgdXNl IHNvbWUgb3RoZXIgd2F5IHRvIGdldCB0aGUgZmxvdwo+IHN1Y2ggdGhhdCB3ZSBhdm9pZCBjb2Rl IGR1cGxpY2F0aW9uLCBidXQgZG9lc24ndCByZXF1aXJlIGEgZ290bz8KCkknbGwgc2VlIGlmIEkg Y2FuIHN0cnVjdHVyZSB0aGlzIGJldHRlci4KCj4KPj4gKwo+PiArCQkvKiBXZSBvbmx5IHNoYWRv dyBEQkcqIGlmIGd1ZXN0IGJlaW5nIGRlYnVnZ2VkICovCj4+ICsJCWlmICh2Y3B1LT5ndWVzdF9k ZWJ1ZyAmIEtWTV9HVUVTVERCR19VU0VfSFdfQlApIHsKPj4gKwkJCXN0cnVjdCBrdm1fZ3Vlc3Rf ZGVidWdfYXJjaCAqc2F2ZWQ7Cj4+ICsJCQlfX3U2NCAqdmFsOwo+PiArCj4+ICsJCQlzYXZlZCA9 ICZ2Y3B1X2RlYnVnX3NhdmVkX3JlZyh2Y3B1LCBkZWJ1Z19yZWdzKTsKPj4gKwo+PiArCQkJaWYg KHItPnJlZyA+PSBEQkdCQ1IwX0VMMSAmJiByLT5yZWcgPD0gREJHQkNSMTVfRUwxKQo+PiArCQkJ CXZhbCA9ICZzYXZlZC0+ZGJnX2JjcltyLT5yZWcgLSBEQkdCQ1IwX0VMMV07Cj4+ICsJCQllbHNl IGlmIChyLT5yZWcgPj0gREJHQlZSMF9FTDEgJiYgci0+cmVnIDw9IERCR0JWUjE1X0VMMSkKPj4g KwkJCQl2YWwgPSAmc2F2ZWQtPmRiZ19idnJbci0+cmVnIC0gREJHQlZSMF9FTDFdOwo+PiArCQkJ ZWxzZSBpZiAoci0+cmVnID49IERCR1dDUjBfRUwxICYmIHItPnJlZyA8PSBEQkdXQ1IxNV9FTDEp Cj4+ICsJCQkJdmFsID0gJnNhdmVkLT5kYmdfd2NyW3ItPnJlZyAtIERCR1dDUjBfRUwxXTsKPj4g KwkJCWVsc2UgaWYgKHItPnJlZyA+PSBEQkdXVlIwX0VMMSAmJiByLT5yZWcgPD0gREJHV1ZSMTVf RUwxKQo+PiArCQkJCXZhbCA9ICZzYXZlZC0+ZGJnX3d2cltyLT5yZWcgLSBEQkdXVlIwX0VMMV07 Cj4+ICsJCQllbHNlIHsKPj4gKwkJCQlrdm1fZXJyKCJCYWQgcmVnaXN0ZXIgaW5kZXggJWRcbiIs IHItPnJlZyk7Cj4+ICsJCQkJcmV0dXJuIGZhbHNlOwo+PiArCQkJfQo+PiAgCj4+IC0JfSBlbHNl IHsKPj4gLQkJaWYgKHAtPmlzX3dyaXRlKSB7Cj4+IC0JCQl2Y3B1X3N5c19yZWcodmNwdSwgci0+ cmVnKSA9ICp2Y3B1X3JlZyh2Y3B1LCBwLT5SdCk7Cj4+IC0JCQl2Y3B1LT5hcmNoLmRlYnVnX2Zs YWdzIHw9IEtWTV9BUk02NF9ERUJVR19ESVJUWTsKPj4gLQkJfSBlbHNlIHsKPj4gLQkJCSp2Y3B1 X3JlZyh2Y3B1LCBwLT5SdCkgPSB2Y3B1X3N5c19yZWcodmNwdSwgci0+cmVnKTsKPj4gKwkJCWlm IChwLT5pc193cml0ZSkKPj4gKwkJCQkqdmFsID0gKnZjcHVfcmVnKHZjcHUsIHAtPlJ0KTsKPj4g KwkJCWVsc2UKPj4gKwkJCQkqdmNwdV9yZWcodmNwdSwgcC0+UnQpID0gKnZhbDsKPj4gKwo+PiAr CQkJcmV0dXJuIHRydWU7Cj4+ICAJCX0KPj4gIAl9Cj4+ICAKPj4gK29sZDoKPj4gKwlpZiAocC0+ aXNfd3JpdGUpIHsKPj4gKwkJdmNwdV9zeXNfcmVnKHZjcHUsIHItPnJlZykgPSAqdmNwdV9yZWco dmNwdSwgcC0+UnQpOwo+PiArCQl2Y3B1LT5hcmNoLmRlYnVnX2ZsYWdzIHw9IEtWTV9BUk02NF9E RUJVR19ESVJUWTsKPj4gKwl9IGVsc2Ugewo+PiArCQkqdmNwdV9yZWcodmNwdSwgcC0+UnQpID0g dmNwdV9zeXNfcmVnKHZjcHUsIHItPnJlZyk7Cj4+ICsJfQo+PiArCj4+ICAJcmV0dXJuIHRydWU7 Cj4+ICB9Cj4+ICAKPj4gLS0gCj4+IDIuMy40Cj4+IAoKLS0gCkFsZXggQmVubsOpZQpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwprdm1hcm0gbWFpbGluZyBs aXN0Cmt2bWFybUBsaXN0cy5jcy5jb2x1bWJpYS5lZHUKaHR0cHM6Ly9saXN0cy5jcy5jb2x1bWJp YS5lZHUvbWFpbG1hbi9saXN0aW5mby9rdm1hcm0K From mboxrd@z Thu Jan 1 00:00:00 1970 From: alex.bennee@linaro.org (Alex =?utf-8?Q?Benn=C3=A9e?=) Date: Mon, 13 Apr 2015 08:59:21 +0100 Subject: [PATCH v2 09/10] KVM: arm64: trap nested debug register access In-Reply-To: <20150410123830.GB3227@hawk.usersys.redhat.com> References: <1427814488-28467-1-git-send-email-alex.bennee@linaro.org> <1427814488-28467-10-git-send-email-alex.bennee@linaro.org> <20150410123830.GB3227@hawk.usersys.redhat.com> Message-ID: <877ftglaqu.fsf@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Andrew Jones writes: > On Tue, Mar 31, 2015 at 04:08:07PM +0100, Alex Benn?e wrote: >> When we are using the hardware registers for guest debug we need to deal >> with the guests access to them. There is already a mechanism for dealing >> with these accesses so we build on top of that. >> >> - mdscr_el1_bits is renamed as we save the whole register >> - any access to mdscr_el1 is now stored in the mirror location >> - if we are using HW assisted debug we do the same with DBG[WB][CV]R >> >> There is one register (MDCCINT_EL1) which guest debug doesn't care about >> so this behaves as before. >> >> Signed-off-by: Alex Benn?e >> >> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h >> index 2c359c9..3d32d45 100644 >> --- a/arch/arm64/include/asm/kvm_host.h >> +++ b/arch/arm64/include/asm/kvm_host.h >> @@ -122,10 +122,13 @@ struct kvm_vcpu_arch { >> * here. >> */ >> >> - /* Registers pre any guest debug manipulations */ >> + /* Registers before any guest debug manipulations. These > > starting comment /* on own line > >> + * shadow registers are updated by the kvm_handle_sys_reg >> + * trap handler if the guest accesses or updates them >> + */ >> struct { >> u32 pstate_ss_bit; >> - u32 mdscr_el1_bits; >> + u32 mdscr_el1; >> >> struct kvm_guest_debug_arch debug_regs; >> } debug_saved_regs; >> diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c >> index 3b368f3..638c111 100644 >> --- a/arch/arm64/kvm/debug.c >> +++ b/arch/arm64/kvm/debug.c >> @@ -55,8 +55,6 @@ void kvm_arch_setup_debug(struct kvm_vcpu *vcpu) >> vcpu->arch.mdcr_el2 |= (MDCR_EL2_TPM | MDCR_EL2_TPMCR); >> vcpu->arch.mdcr_el2 |= (MDCR_EL2_TDRA | MDCR_EL2_TDOSA); >> >> - trace_kvm_arch_setup_debug_reg32("MDCR_EL2", vcpu->arch.mdcr_el2); >> - > > I guess I'll see this come back in the next patch. You must be playing > 'now you see me, now you don't' Oops, missed that on the rebase. > >> /* >> * If we are not treating debug registers are dirty we need >> * to trap if the guest starts accessing them. >> @@ -71,8 +69,10 @@ void kvm_arch_setup_debug(struct kvm_vcpu *vcpu) >> /* Save pstate/mdscr */ >> vcpu_debug_saved_reg(vcpu, pstate_ss_bit) = >> *vcpu_cpsr(vcpu) & DBG_SPSR_SS; >> - vcpu_debug_saved_reg(vcpu, mdscr_el1_bits) = >> - vcpu_sys_reg(vcpu, MDSCR_EL1) & MDSCR_EL1_DEBUG_BITS; >> + >> + vcpu_debug_saved_reg(vcpu, mdscr_el1) = >> + vcpu_sys_reg(vcpu, MDSCR_EL1); >> + >> /* >> * Single Step (ARM ARM D2.12.3 The software step state >> * machine) >> @@ -161,9 +161,8 @@ void kvm_arch_clear_debug(struct kvm_vcpu *vcpu) >> *vcpu_cpsr(vcpu) &= ~DBG_SPSR_SS; >> *vcpu_cpsr(vcpu) |= vcpu_debug_saved_reg(vcpu, pstate_ss_bit); >> >> - vcpu_sys_reg(vcpu, MDSCR_EL1) &= ~MDSCR_EL1_DEBUG_BITS; >> - vcpu_sys_reg(vcpu, MDSCR_EL1) |= >> - vcpu_debug_saved_reg(vcpu, mdscr_el1_bits); >> + vcpu_sys_reg(vcpu, MDSCR_EL1) = >> + vcpu_debug_saved_reg(vcpu, mdscr_el1); >> >> /* >> * If we were using HW debug we need to restore the >> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c >> index be9b188..d43d7d1 100644 >> --- a/arch/arm64/kvm/sys_regs.c >> +++ b/arch/arm64/kvm/sys_regs.c >> @@ -208,39 +208,61 @@ static bool trap_debug_regs(struct kvm_vcpu *vcpu, >> const struct sys_reg_params *p, >> const struct sys_reg_desc *r) >> { >> - if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) { >> - struct kvm_guest_debug_arch *saved; >> - __u64 *val; >> - >> - saved = &vcpu_debug_saved_reg(vcpu, debug_regs); >> - >> - if (r->reg >= DBGBCR0_EL1 && r->reg <= DBGBCR15_EL1) >> - val = &saved->dbg_bcr[r->reg - DBGBCR0_EL1]; >> - else if (r->reg >= DBGBVR0_EL1 && r->reg <= DBGBVR15_EL1) >> - val = &saved->dbg_bvr[r->reg - DBGBVR0_EL1]; >> - else if (r->reg >= DBGWCR0_EL1 && r->reg <= DBGWCR15_EL1) >> - val = &saved->dbg_wcr[r->reg - DBGWCR0_EL1]; >> - else if (r->reg >= DBGWVR0_EL1 && r->reg <= DBGWVR15_EL1) >> - val = &saved->dbg_wvr[r->reg - DBGWVR0_EL1]; >> - else { >> - kvm_err("Bad register index %d\n", r->reg); >> - return false; >> + if (vcpu->guest_debug) { >> + >> + /* MDSCR_EL1 */ >> + if (r->reg == MDSCR_EL1) { >> + if (p->is_write) >> + vcpu_debug_saved_reg(vcpu, mdscr_el1) = >> + *vcpu_reg(vcpu, p->Rt); >> + else >> + *vcpu_reg(vcpu, p->Rt) = >> + vcpu_debug_saved_reg(vcpu, mdscr_el1); > > With this lines wrapping, {}'s might be nice. My natural inclination is to wrap in {}'s but I know the kernel is a fan of the single-statement if forms. > >> + >> + return true; >> } >> >> - if (p->is_write) >> - *val = *vcpu_reg(vcpu, p->Rt); >> - else >> - *vcpu_reg(vcpu, p->Rt) = *val; >> + /* MDCCINT_EL1 */ >> + if (r->reg == MDCCINT_EL1) >> + goto old; > > "old"? As in the old way this worked? Someday (soon) all this code will > be "old". How about just 'out'? Or use some other way to get the flow > such that we avoid code duplication, but doesn't require a goto? I'll see if I can structure this better. > >> + >> + /* We only shadow DBG* if guest being debugged */ >> + if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) { >> + struct kvm_guest_debug_arch *saved; >> + __u64 *val; >> + >> + saved = &vcpu_debug_saved_reg(vcpu, debug_regs); >> + >> + if (r->reg >= DBGBCR0_EL1 && r->reg <= DBGBCR15_EL1) >> + val = &saved->dbg_bcr[r->reg - DBGBCR0_EL1]; >> + else if (r->reg >= DBGBVR0_EL1 && r->reg <= DBGBVR15_EL1) >> + val = &saved->dbg_bvr[r->reg - DBGBVR0_EL1]; >> + else if (r->reg >= DBGWCR0_EL1 && r->reg <= DBGWCR15_EL1) >> + val = &saved->dbg_wcr[r->reg - DBGWCR0_EL1]; >> + else if (r->reg >= DBGWVR0_EL1 && r->reg <= DBGWVR15_EL1) >> + val = &saved->dbg_wvr[r->reg - DBGWVR0_EL1]; >> + else { >> + kvm_err("Bad register index %d\n", r->reg); >> + return false; >> + } >> >> - } else { >> - if (p->is_write) { >> - vcpu_sys_reg(vcpu, r->reg) = *vcpu_reg(vcpu, p->Rt); >> - vcpu->arch.debug_flags |= KVM_ARM64_DEBUG_DIRTY; >> - } else { >> - *vcpu_reg(vcpu, p->Rt) = vcpu_sys_reg(vcpu, r->reg); >> + if (p->is_write) >> + *val = *vcpu_reg(vcpu, p->Rt); >> + else >> + *vcpu_reg(vcpu, p->Rt) = *val; >> + >> + return true; >> } >> } >> >> +old: >> + if (p->is_write) { >> + vcpu_sys_reg(vcpu, r->reg) = *vcpu_reg(vcpu, p->Rt); >> + vcpu->arch.debug_flags |= KVM_ARM64_DEBUG_DIRTY; >> + } else { >> + *vcpu_reg(vcpu, p->Rt) = vcpu_sys_reg(vcpu, r->reg); >> + } >> + >> return true; >> } >> >> -- >> 2.3.4 >> -- Alex Benn?e From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753203AbbDMH7P (ORCPT ); Mon, 13 Apr 2015 03:59:15 -0400 Received: from static.88-198-71-155.clients.your-server.de ([88.198.71.155]:48582 "EHLO socrates.bennee.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751402AbbDMH7N (ORCPT ); Mon, 13 Apr 2015 03:59:13 -0400 References: <1427814488-28467-1-git-send-email-alex.bennee@linaro.org> <1427814488-28467-10-git-send-email-alex.bennee@linaro.org> <20150410123830.GB3227@hawk.usersys.redhat.com> From: Alex =?utf-8?Q?Benn=C3=A9e?= To: Andrew Jones Cc: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, christoffer.dall@linaro.org, marc.zyngier@arm.com, peter.maydell@linaro.org, agraf@suse.de, pbonzini@redhat.com, zhichao.huang@linaro.org, jan.kiszka@siemens.com, dahi@linux.vnet.ibm.com, r65777@freescale.com, bp@suse.de, Gleb Natapov , Catalin Marinas , Will Deacon , open list Subject: Re: [PATCH v2 09/10] KVM: arm64: trap nested debug register access In-reply-to: <20150410123830.GB3227@hawk.usersys.redhat.com> Date: Mon, 13 Apr 2015 08:59:21 +0100 Message-ID: <877ftglaqu.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: alex.bennee@linaro.org X-SA-Exim-Scanned: No (on socrates.bennee.com); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Andrew Jones writes: > On Tue, Mar 31, 2015 at 04:08:07PM +0100, Alex Bennée wrote: >> When we are using the hardware registers for guest debug we need to deal >> with the guests access to them. There is already a mechanism for dealing >> with these accesses so we build on top of that. >> >> - mdscr_el1_bits is renamed as we save the whole register >> - any access to mdscr_el1 is now stored in the mirror location >> - if we are using HW assisted debug we do the same with DBG[WB][CV]R >> >> There is one register (MDCCINT_EL1) which guest debug doesn't care about >> so this behaves as before. >> >> Signed-off-by: Alex Bennée >> >> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h >> index 2c359c9..3d32d45 100644 >> --- a/arch/arm64/include/asm/kvm_host.h >> +++ b/arch/arm64/include/asm/kvm_host.h >> @@ -122,10 +122,13 @@ struct kvm_vcpu_arch { >> * here. >> */ >> >> - /* Registers pre any guest debug manipulations */ >> + /* Registers before any guest debug manipulations. These > > starting comment /* on own line > >> + * shadow registers are updated by the kvm_handle_sys_reg >> + * trap handler if the guest accesses or updates them >> + */ >> struct { >> u32 pstate_ss_bit; >> - u32 mdscr_el1_bits; >> + u32 mdscr_el1; >> >> struct kvm_guest_debug_arch debug_regs; >> } debug_saved_regs; >> diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c >> index 3b368f3..638c111 100644 >> --- a/arch/arm64/kvm/debug.c >> +++ b/arch/arm64/kvm/debug.c >> @@ -55,8 +55,6 @@ void kvm_arch_setup_debug(struct kvm_vcpu *vcpu) >> vcpu->arch.mdcr_el2 |= (MDCR_EL2_TPM | MDCR_EL2_TPMCR); >> vcpu->arch.mdcr_el2 |= (MDCR_EL2_TDRA | MDCR_EL2_TDOSA); >> >> - trace_kvm_arch_setup_debug_reg32("MDCR_EL2", vcpu->arch.mdcr_el2); >> - > > I guess I'll see this come back in the next patch. You must be playing > 'now you see me, now you don't' Oops, missed that on the rebase. > >> /* >> * If we are not treating debug registers are dirty we need >> * to trap if the guest starts accessing them. >> @@ -71,8 +69,10 @@ void kvm_arch_setup_debug(struct kvm_vcpu *vcpu) >> /* Save pstate/mdscr */ >> vcpu_debug_saved_reg(vcpu, pstate_ss_bit) = >> *vcpu_cpsr(vcpu) & DBG_SPSR_SS; >> - vcpu_debug_saved_reg(vcpu, mdscr_el1_bits) = >> - vcpu_sys_reg(vcpu, MDSCR_EL1) & MDSCR_EL1_DEBUG_BITS; >> + >> + vcpu_debug_saved_reg(vcpu, mdscr_el1) = >> + vcpu_sys_reg(vcpu, MDSCR_EL1); >> + >> /* >> * Single Step (ARM ARM D2.12.3 The software step state >> * machine) >> @@ -161,9 +161,8 @@ void kvm_arch_clear_debug(struct kvm_vcpu *vcpu) >> *vcpu_cpsr(vcpu) &= ~DBG_SPSR_SS; >> *vcpu_cpsr(vcpu) |= vcpu_debug_saved_reg(vcpu, pstate_ss_bit); >> >> - vcpu_sys_reg(vcpu, MDSCR_EL1) &= ~MDSCR_EL1_DEBUG_BITS; >> - vcpu_sys_reg(vcpu, MDSCR_EL1) |= >> - vcpu_debug_saved_reg(vcpu, mdscr_el1_bits); >> + vcpu_sys_reg(vcpu, MDSCR_EL1) = >> + vcpu_debug_saved_reg(vcpu, mdscr_el1); >> >> /* >> * If we were using HW debug we need to restore the >> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c >> index be9b188..d43d7d1 100644 >> --- a/arch/arm64/kvm/sys_regs.c >> +++ b/arch/arm64/kvm/sys_regs.c >> @@ -208,39 +208,61 @@ static bool trap_debug_regs(struct kvm_vcpu *vcpu, >> const struct sys_reg_params *p, >> const struct sys_reg_desc *r) >> { >> - if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) { >> - struct kvm_guest_debug_arch *saved; >> - __u64 *val; >> - >> - saved = &vcpu_debug_saved_reg(vcpu, debug_regs); >> - >> - if (r->reg >= DBGBCR0_EL1 && r->reg <= DBGBCR15_EL1) >> - val = &saved->dbg_bcr[r->reg - DBGBCR0_EL1]; >> - else if (r->reg >= DBGBVR0_EL1 && r->reg <= DBGBVR15_EL1) >> - val = &saved->dbg_bvr[r->reg - DBGBVR0_EL1]; >> - else if (r->reg >= DBGWCR0_EL1 && r->reg <= DBGWCR15_EL1) >> - val = &saved->dbg_wcr[r->reg - DBGWCR0_EL1]; >> - else if (r->reg >= DBGWVR0_EL1 && r->reg <= DBGWVR15_EL1) >> - val = &saved->dbg_wvr[r->reg - DBGWVR0_EL1]; >> - else { >> - kvm_err("Bad register index %d\n", r->reg); >> - return false; >> + if (vcpu->guest_debug) { >> + >> + /* MDSCR_EL1 */ >> + if (r->reg == MDSCR_EL1) { >> + if (p->is_write) >> + vcpu_debug_saved_reg(vcpu, mdscr_el1) = >> + *vcpu_reg(vcpu, p->Rt); >> + else >> + *vcpu_reg(vcpu, p->Rt) = >> + vcpu_debug_saved_reg(vcpu, mdscr_el1); > > With this lines wrapping, {}'s might be nice. My natural inclination is to wrap in {}'s but I know the kernel is a fan of the single-statement if forms. > >> + >> + return true; >> } >> >> - if (p->is_write) >> - *val = *vcpu_reg(vcpu, p->Rt); >> - else >> - *vcpu_reg(vcpu, p->Rt) = *val; >> + /* MDCCINT_EL1 */ >> + if (r->reg == MDCCINT_EL1) >> + goto old; > > "old"? As in the old way this worked? Someday (soon) all this code will > be "old". How about just 'out'? Or use some other way to get the flow > such that we avoid code duplication, but doesn't require a goto? I'll see if I can structure this better. > >> + >> + /* We only shadow DBG* if guest being debugged */ >> + if (vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) { >> + struct kvm_guest_debug_arch *saved; >> + __u64 *val; >> + >> + saved = &vcpu_debug_saved_reg(vcpu, debug_regs); >> + >> + if (r->reg >= DBGBCR0_EL1 && r->reg <= DBGBCR15_EL1) >> + val = &saved->dbg_bcr[r->reg - DBGBCR0_EL1]; >> + else if (r->reg >= DBGBVR0_EL1 && r->reg <= DBGBVR15_EL1) >> + val = &saved->dbg_bvr[r->reg - DBGBVR0_EL1]; >> + else if (r->reg >= DBGWCR0_EL1 && r->reg <= DBGWCR15_EL1) >> + val = &saved->dbg_wcr[r->reg - DBGWCR0_EL1]; >> + else if (r->reg >= DBGWVR0_EL1 && r->reg <= DBGWVR15_EL1) >> + val = &saved->dbg_wvr[r->reg - DBGWVR0_EL1]; >> + else { >> + kvm_err("Bad register index %d\n", r->reg); >> + return false; >> + } >> >> - } else { >> - if (p->is_write) { >> - vcpu_sys_reg(vcpu, r->reg) = *vcpu_reg(vcpu, p->Rt); >> - vcpu->arch.debug_flags |= KVM_ARM64_DEBUG_DIRTY; >> - } else { >> - *vcpu_reg(vcpu, p->Rt) = vcpu_sys_reg(vcpu, r->reg); >> + if (p->is_write) >> + *val = *vcpu_reg(vcpu, p->Rt); >> + else >> + *vcpu_reg(vcpu, p->Rt) = *val; >> + >> + return true; >> } >> } >> >> +old: >> + if (p->is_write) { >> + vcpu_sys_reg(vcpu, r->reg) = *vcpu_reg(vcpu, p->Rt); >> + vcpu->arch.debug_flags |= KVM_ARM64_DEBUG_DIRTY; >> + } else { >> + *vcpu_reg(vcpu, p->Rt) = vcpu_sys_reg(vcpu, r->reg); >> + } >> + >> return true; >> } >> >> -- >> 2.3.4 >> -- Alex Bennée