From nobody Sun Apr 12 15:15:36 2026 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass header.i=@eviden.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=eviden.com); dmarc=pass(p=reject dis=none) header.from=eviden.com ARC-Seal: i=2; a=rsa-sha256; t=1713801267; cv=pass; d=zohomail.com; s=zohoarc; b=K+AvHKC0V0zxzyWEhu2Nnqv2z29EFuEAgzFFZHH87bQ2FtapYImeruVTruFAUeH1YtFjVZIMcbHuNJ48xvGkqwxIwrwCwOvKTL6P5hv1YiFLlygjb67Asafzea6Z7vBDjHG4P0gB1F9lYVg3TmViWq4nCydQ2DNzTFpuU/qiM9Q= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1713801267; h=Content-ID:Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=A//6ZkMyDQVH+O5DOpFjHEE8sA2/YPKnd/qwbDTuIZ4=; b=cTZUoEQ8Eru3lYkEARw61kn3Gz9puyMXXePJ1a0pZ/04Etd5X9h6eQKxMFEW4ZCc4UKxfZ9614R/VolY66wR8b23eAox6LugahQsKdEy7uI3D0b411htXMQD0r4yA8XNEnU78aHHmAHI2n9nBeIirl9W0iEyuyv1yl4vkGTdqx0= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass header.i=@eviden.com; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=eviden.com); dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1713801267585981.158486229937; Mon, 22 Apr 2024 08:54:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ryvyg-0007Gc-4U; Mon, 22 Apr 2024 11:53:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ryvyc-0007Eo-KR for qemu-devel@nongnu.org; Mon, 22 Apr 2024 11:53:07 -0400 Received: from smarthost4.eviden.com ([80.78.11.85]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ryvyZ-0007c1-14 for qemu-devel@nongnu.org; Mon, 22 Apr 2024 11:53:05 -0400 Received: from mail-am0eur02lp2233.outbound.protection.outlook.com (HELO EUR02-AM0-obe.outbound.protection.outlook.com) ([104.47.11.233]) by smarthost4.eviden.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2024 17:52:57 +0200 Received: from AM8PR07MB7602.eurprd07.prod.outlook.com (2603:10a6:20b:24b::7) by DU0PR07MB9626.eurprd07.prod.outlook.com (2603:10a6:10:31e::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.44; Mon, 22 Apr 2024 15:52:54 +0000 Received: from AM8PR07MB7602.eurprd07.prod.outlook.com ([fe80::fbd7:ca71:b636:6f9d]) by AM8PR07MB7602.eurprd07.prod.outlook.com ([fe80::fbd7:ca71:b636:6f9d%5]) with mapi id 15.20.7472.044; Mon, 22 Apr 2024 15:52:54 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=eviden.com; i=@eviden.com; q=dns/txt; s=mail; t=1713801183; x=1745337183; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-id:content-transfer-encoding: mime-version; bh=A//6ZkMyDQVH+O5DOpFjHEE8sA2/YPKnd/qwbDTuIZ4=; b=mjlOAiZRzeemq/D7wicXmj1Vi6KIWI9SRULYvXy6dhcClUWbCyd1uXRs Xb+eKEiMcUw/G4BpbL0ltlLprxH0AwHCwxUvmjY5E5zcInu4euKIdAZVA 0VBd7ACxsgpdHQ/4rUzEwLyxQ2fKYWlWRiFmVfNUAWIWFmjc1WKE18M4m vy+xFwDcxqXJBTTwNrFPjtHpUAx0qxMZMq8iC5IvwqcmVVPc8eVLDivnP /tOLQ/1wI43G7RNKctUL3/nODZEKW1o7oPMpx/rHHcczT32vsjrOZtYrA IZRJkKh6loRJqP5bCY7nXXPFrNp9ahlNOSL2MTXuJcbUUcJnb4w1ZuXab w==; X-IronPort-AV: E=Sophos;i="6.07,220,1708383600"; d="scan'208";a="11027673" X-MGA-submission: =?us-ascii?q?MDE2w0TDNpiD8qfN4OSreQ0o9Xf9QP4shRuEVX?= =?us-ascii?q?hdcX4Fw2ZFgB2lpunDlB3Ij+w+jYsM7/LpwVl+vtoHMSIvwDfu26Gf5i?= =?us-ascii?q?MLUYMSKzwV7JIqVIC/AwLcwdAmpr1BmM/fmzC9Rq5/psCTkhCY0xHwQw?= =?us-ascii?q?vKOM6in8BGhaMG1DL4mgFarg=3D=3D?= ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ogqn2IWFzIdVt27toFb8pGSjqflmcjztDm4JKpX0NrKVQl1lPqwmxt9cgES1xl05Y18fxxtOtVn3H6uLck0dHDgB6HyywjzBPMqWuTX9QcK6cOJJg6jySF7greKbiS+bFIDIffkxyB+AE3uY3ol6aXomTAfey2eMDETFoOTIzjf/UOxdw5f2Difd5lPKP7Vg6qYyf/kL//5HStcJYP2WkpjBOvmv1jWV8p/HS/y6uxkXSLjNTRAGKKXorvX1+/p6qO4URMKnwYyycdKTgrpzdNx+h/VHziB8n0NvNIO6EsHj3ke/ZGPl7Sj4IvkFfpdahHJA9joaGtIazL3LOWZW2g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=A//6ZkMyDQVH+O5DOpFjHEE8sA2/YPKnd/qwbDTuIZ4=; b=M7fSYPNAo9I+shPTIX/mZS7IrZINK1qjF3wsKed/f3wylIi8eOw7Gv4lRXqZPvG1vAjtofmMtKrjw5/RwwDK8vC33+k8hQmhk9+0NnlqlXUhZHUVTA8zPkdXJaoFlkeMKNdhBWhv5AqNOQ4oswMUEbnknf0OTVvXvkbn/p7KM6Rfta2+iu6wPF2w8l3cNeWsObNLUxqkPhQa6Wzwb0YUcTze/wW7xl5Ez6E5n070CqiaIpwgm1g7jS9Lkyki4FI56OnL7UIPfD5f6mJaQw6hrePZghpEmAL4cQlCIV0pYZFESiCA+5J8epPbWx7uO45/a5hdr+y+/ilO6U1VpRKJ1g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=eviden.com; dmarc=pass action=none header.from=eviden.com; dkim=pass header.d=eviden.com; arc=none From: CLEMENT MATHIEU--DRIF To: "qemu-devel@nongnu.org" CC: "jasowang@redhat.com" , CLEMENT MATHIEU--DRIF Subject: [PATCH intel_iommu 4/7] intel_iommu: add support for first-stage translation Thread-Topic: [PATCH intel_iommu 4/7] intel_iommu: add support for first-stage translation Thread-Index: AQHalM0il2RzFQqe1USu5Fe1IhjH8A== Date: Mon, 22 Apr 2024 15:52:53 +0000 Message-ID: <20240422155236.129179-5-clement.mathieu--drif@eviden.com> References: <20240422155236.129179-1-clement.mathieu--drif@eviden.com> In-Reply-To: <20240422155236.129179-1-clement.mathieu--drif@eviden.com> Accept-Language: en-GB, fr-FR, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=eviden.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: AM8PR07MB7602:EE_|DU0PR07MB9626:EE_ x-ms-office365-filtering-correlation-id: 7cd75ea8-5305-411a-4d10-08dc62e44618 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: =?utf-8?B?NzNqZUJOSWsrN2c0MisrdzJHK3F4QUYrWkMrdEgvWkI4UTJTekxROWR2YVh4?= =?utf-8?B?blh2T3lZREtNK1NrOTFjeUo5V21WNTFYQmM4dUIrZHFUS0VQT3dqTjZnN0RV?= =?utf-8?B?RVRyRWtsaDRwS0F2RG53Z2V3Und2M3RpMzZzSGxuZWhzK1B4RVZPaDJBVlFG?= =?utf-8?B?eklVb3J3OXdGNXFYWERMVktZVVRUdWc2VGs1Q1ZLMmlzOHo5VGNlcTJYQ3lk?= =?utf-8?B?bUtydXRieVlZb2tVWFRIL3ZZTnNPdXhyYWE3Z0FHbFFmVkZQRUFNdHhuVkFH?= =?utf-8?B?YW9Kc2V1bmZ0NzhCTTNIR3JjNG5heHlJeDZaL0VOcHVqT2xndVphclliNC9p?= =?utf-8?B?UWFTMTZsRHNQWkEvbDRHdDlZVmZvU3BTWjFReFZ3VndpZ0NZQ3lTblZpQUlz?= =?utf-8?B?NDdJV3RidkNNZFYrc1ZUWkltbkFwOTVFWk9Rc09nSENXOWlYQkRDc0pyYXBi?= =?utf-8?B?eGtSL1FWSzJqTmp0cmN0ZjQ5SWxLemMwdjZtbDdENDJFR2RVZTNmTmE2Vk0r?= =?utf-8?B?SmdwMFJHTy9NV3lZOUcraXozeXlTMG5zWjVBVTViZ3Y2WldFNzlYRUVhZE8r?= =?utf-8?B?aWZhV3lmNWlFT3labys2TTZ4RTdnaENYeFo0YkN3LzU5ekx6MkFLaW9PMTNU?= =?utf-8?B?Rlp0UUVQNFJOZEFyNytxYndyK2V4NmN0bUhCcGY5SlZZQ0plSG1kci9OTGdJ?= =?utf-8?B?K3B1TmhJZG8yck1LSk8xa2JLQXZQa1FOTG4xdS9ZZXB1VWF4MDRVZmRUcEJj?= =?utf-8?B?OFNxNk54U3VmSUhidCt0UHVlRXVscnpqMVBkOHRBOW5wNFg4eXB5TVVHRHhu?= =?utf-8?B?T285OWhMVFY1RmlMclRrU09yakVxNmhzNnhWS3ZVUVdwd05icFNodHdGZTFh?= =?utf-8?B?WmR1TFplTy9QeHUrWUxzb2pQSFJQajkvNm5ZY0FUczJTZC93OGpwRGJycm1k?= =?utf-8?B?d25zOVNKNkQra0NTUUtJMVdEY0dlcGdLTDh2d1BiSFgrY21XSjdBalNSRG9B?= =?utf-8?B?dEo4VHdLRXR5dGU3NGNqbzljTE1oeUEvd01iLzhBczNsbkJRRzRnTVNqUHJw?= =?utf-8?B?OUhteDRqcVFpdCtnMURsRHpTaGRNb3lUSmR4TW14ZVE3ZVZUTEgwRk9UdkpS?= =?utf-8?B?RVhpZTJCYlFMdVBPU1EvMzBydWNTMWN2UjhRdGJXaFR2R05sNWhTdlJaS3JU?= =?utf-8?B?K3BKQkJ2TUhwbE9lRXg4QWRTZGdVTWlWQnRFNHRtVGxLaVBoTzJGRW5RRHQy?= =?utf-8?B?b3RWaWxraWh0YUNmYk9icVEzZXJlMkRKSHpzTGo2aVk4Vkc1ZU9Jc0pkMWRN?= =?utf-8?B?Mm1VdzF1YUNtRHprWEVQaG9uY2xUMlhLc3lVMEtiSGlJRXV6N0d4U0VuRk1w?= =?utf-8?B?MDNNSU5LbVZlUHRoN21mYW5ZZ2xaaEIxd29UMzhZemlvMUJqeHB3cGlaS0R2?= =?utf-8?B?cDhPaDNGQ0RNOVlSNDRSaHo0R3RVTm9UMXZ6WW8xb2NVSHJMTlBhYkhwZ3ow?= =?utf-8?B?MkdNZVgyQzIzWXB6L2IxUlBrc0tOUGEvYncrS0JJdW9XRUp6MGJnVzBqbmp5?= =?utf-8?B?ZjdjQVArTnJVTnpJdnBhYTFuUXRGcjF5NVFaTzc4Q2sxd05YY0duVmUwd0tR?= =?utf-8?B?YUxTTDJ1d0w2RUhnRitJMmFHamZQaWk0YlFlSTdQWVpEazN2blNuZkJ1VS9t?= =?utf-8?B?L3N1cG4reVNOeFh0ZUtsbldjZzN6RmpTWWxVNCs1blRKaTJPM2pySGdQYnpt?= =?utf-8?Q?0brLrbf6rVmMxiNH0WuIDWcuYRqbwRl2bH4ReLu?= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AM8PR07MB7602.eurprd07.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230031)(1800799015)(366007)(376005)(38070700009); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?MlhPUXBvS0cxcTlpZ3F6OHRKd00yTWYxblBzRXhyZWx5Mm0xcjFhVnZXNU1r?= =?utf-8?B?VFdteEoyRlkxWisvS085UGl3UnYzWnlGak1sYVBhSFBLUE1Jb25OVEdBV09N?= =?utf-8?B?UDgrckt3ZWhkbE9rdXZ5c216TUZBWndwR0NEY1h1eGFiTGlBcWRFWWdCOUll?= =?utf-8?B?QWN0aWc0WXlwaXVnazlaeUthKzM1VGE0WWdWczc0NndiK2JGbVp5OWdKdnVB?= =?utf-8?B?ZTdWUFVqUXVERjJGc25rVjM2Qm9PYlBuanlRRUk4U0ppcnJYdkZqb0czVzBi?= =?utf-8?B?dnRkaWY3QmJPUHBpZGh1czJ6bWdadm1BRUkvSHpDMzdRUlFSSkNicCtzcG52?= =?utf-8?B?RkJMN2E4aHlFeGJyM0Z1TC9la0FYUTNJZC82Rzk2bnRKeXdUaTRUTzNqdEVP?= =?utf-8?B?b0VBSnFhRzhMUXF6bVAwM1F3aUw4MjU3K08vcnJ4TTFPcFFjNktsVnl2aFZz?= =?utf-8?B?YnFyUmJsM2NRVGpaRWZYeWNPYWVTbDI1M1NMYkdEelVONTRHNDBWMGdLTXJs?= =?utf-8?B?cmJDRFpwVkQ3dGp0UWR4bXhlUzRoYlJCNGpHYnFpeTdwWmFxeHhrYnJXWCtV?= =?utf-8?B?V2t1M0Q5TUFnZ0NKKy96d2VXWGk3czNOT21mbHEyZ0JNZmdDM2s2clY4Sng5?= =?utf-8?B?YnRQQSsxVGhVRjZJT2xXNGx6TU9uWE5rN1VsekVPTE1VS1dzM3plMlRTR21n?= =?utf-8?B?ZGVJTFhBbUhNcExiSDRkaVlqSnhBUWx3Vm5mVUE4VEp1YWQyb2k5S2lzQ2dT?= =?utf-8?B?REZrblFQWGJZMkFlWXJmbnBkTnJIWXFNb3NFZnlrb1FtLzAyWCs3dExITEdm?= =?utf-8?B?NUJZZzhWaVJUSmo1YUd5WXVsT1hpdlgyRGIzZkRaOVp1VGdqcEJYRythenlI?= =?utf-8?B?M3RMT2lSaExoZW0weVpLSTQyOVFBN1p3R0RQd1FUdm5TM05tZjE0VW14NDIy?= =?utf-8?B?ZkdYNFFUTnN5cldZVWpiTUh1MnhRa2RZTU5kb1ZUNENBTTNSVG03TWo5aGps?= =?utf-8?B?MU9RaFRTQk1BT01kK2VFQjB6SFJST1paSHlaSkpDT3BLNkQ4ZDM3QThtVEdC?= =?utf-8?B?TFVNdzdUaks4UVdzbWJHSlZSM1dYdlRIc21jVEtwZGlwc0Z2YmErV3VQY3o5?= =?utf-8?B?aElqditCVVZNeVl0clhxeFIzMUEzTzkxNU5vbEc3WDVtYWxyaHlTVUZCcUs4?= =?utf-8?B?ejF4WEdvVHRtTUhqQmZBT0N2ZEtuVXJlZGxVaURuQ0FWK2cyRGxVZ1pPM2sy?= =?utf-8?B?KzZDRmxrYnRuNUpPaCs4NFhnVUVXa24zNDNyeEV2MkZuaFNaZ2hmMmVGUk5E?= =?utf-8?B?MzJ0RjAzNkh4cnlwY0xHOE1POUdwdUc4bURDUTZlZzFWak1xbnovWTNFRXBJ?= =?utf-8?B?d0xuTmRWL3IycUdidEYwRDBDWUtVSkdxeWxiNnpxY2F1VmZVMDY3QTEvMDlI?= =?utf-8?B?TDIxUFdaRXRYMFp2WS9yV1pzVmJabUU1UmYxb0xmV2ordTdYdEptSDBDbG5N?= =?utf-8?B?S1FhMEFqaTdERXI5US9xTnBpVG1qekhEQWtyU2syTDRleC8xUHo4Y3VkRnZV?= =?utf-8?B?bDNMQ0tZb0htQVh2a2hiQWlkc0MzdFMyeDVwS3NQMkhMZG9TalFxMHdzcklX?= =?utf-8?B?NzJSc2FjNVdGNW16S2pBOTgzVHlpZWdkZ24wblB0NlpxT09EQ29rRDlFZnpz?= =?utf-8?B?a3hyNnBSOUl5T0llby9zZ1FSZkU0eFk2ai8yamVOSlVkaUEwU1IzbWt6cWZU?= =?utf-8?B?cEtQZDRpdXV0N0JtY05iNElpOVNOemdLakMxTjdibkU5dzRIWldKZ1I2em5k?= =?utf-8?B?L1RSTW5ZbEVIV1dqQm84V1p5Rkh3bmpDeHN2SzlrNzFXN01VUFlEUFR5MSsz?= =?utf-8?B?RnVNdDlDRmtmTDc2dXZidGc4WVpWODFwU3F5TmpLc21wRzFWRjFxc240T3Fj?= =?utf-8?B?ZzBYVlZVQ3VtbC9YRmxZNmdCZVpURXVGN3VoT0RPcC9aOTNhUVhXRDk4b29n?= =?utf-8?B?L3NxMnZ6a1VsV21KK3dSL3pqV3VEajdGVkNSSUNQajVhMWh1Vlk1WTJ1OFdq?= =?utf-8?B?NzdwTGp3WnE4c09YeS9JQTEySGVoNzJoSThFaDVoc1ZzV3h6TjV1dHBCUy9G?= =?utf-8?B?bGxVZE11NWwxSkhLbEZMOEJ2SkVaNGtoYi9uSHZqVGN5YkRGWGdVQk13ZDBv?= =?utf-8?Q?QNXU90moq4/6CGn/1Cynmm4=3D?= Content-Type: text/plain; charset="utf-8" Content-ID: <717C8F90C9DBAB4DAE6921D2483745CC@eurprd07.prod.outlook.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: eviden.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: AM8PR07MB7602.eurprd07.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7cd75ea8-5305-411a-4d10-08dc62e44618 X-MS-Exchange-CrossTenant-originalarrivaltime: 22 Apr 2024 15:52:53.3583 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 7d1c7785-2d8a-437d-b842-1ed5d8fbe00a X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: TSFiVvwbIrYVfzSeAJRYfPdEdOU9YmACt0vlr1t8CtqCsM6Szrt5+BUSC7R6JrObkhJSXJjBXUCnUiScYOyIB4ZksV9Grjq4uLJ+UR+7OH7GKkZ/M7/nQ59fBRTPF79r X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR07MB9626 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=80.78.11.85; envelope-from=clement.mathieu--drif@eviden.com; helo=smarthost4.eviden.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer2=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @eviden.com) X-ZM-MESSAGEID: 1713801269319100003 This translation mode will only be made available in scalable mode Signed-off-by: Cl=C3=A9ment Mathieu--Drif --- hw/i386/intel_iommu.c | 364 ++++++++++++++++++++++++++++----- hw/i386/intel_iommu_internal.h | 51 ++++- 2 files changed, 362 insertions(+), 53 deletions(-) diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c index ba545590b1..3b9f120dec 100644 --- a/hw/i386/intel_iommu.c +++ b/hw/i386/intel_iommu.c @@ -713,6 +713,21 @@ static uint64_t vtd_get_pte(dma_addr_t base_addr, uint= 32_t index) return pte; } =20 +static MemTxResult vtd_set_flag_in_pte(dma_addr_t base_addr, uint32_t inde= x, + uint64_t pte, uint64_t flag) +{ + assert(index < VTD_PT_ENTRY_NR); + if (pte & flag) { + return MEMTX_OK; + } + pte |=3D flag; + pte =3D cpu_to_le64(pte); + return dma_memory_write(&address_space_memory, + base_addr + index * sizeof(pte), + &pte, sizeof(pte), + MEMTXATTRS_UNSPECIFIED); +} + /* Given an iova and the level of paging structure, return the offset * of current level. */ @@ -730,11 +745,17 @@ static inline bool vtd_is_level_supported(IntelIOMMUS= tate *s, uint32_t level) } =20 /* Return true if check passed, otherwise false */ -static inline bool vtd_pe_type_check(X86IOMMUState *x86_iommu, +static inline bool vtd_pe_type_check(IntelIOMMUState *s, VTDPASIDEntry *pe) { + X86IOMMUState *x86_iommu =3D X86_IOMMU_DEVICE(s); + switch (VTD_PE_GET_TYPE(pe)) { case VTD_SM_PASID_ENTRY_FLT: + if (!(s->ecap & VTD_ECAP_FLTS)) { + return false; + } + break; case VTD_SM_PASID_ENTRY_SLT: case VTD_SM_PASID_ENTRY_NESTED: break; @@ -784,6 +805,11 @@ static inline bool vtd_pe_present(VTDPASIDEntry *pe) return pe->val[0] & VTD_PASID_ENTRY_P; } =20 +static inline bool vtd_fl_pte_present(uint64_t pte) +{ + return pte & VTD_FL_PTE_P; +} + static int vtd_get_pe_in_pasid_leaf_table(IntelIOMMUState *s, uint32_t pasid, dma_addr_t addr, @@ -791,7 +817,6 @@ static int vtd_get_pe_in_pasid_leaf_table(IntelIOMMUSta= te *s, { uint32_t index; dma_addr_t entry_size; - X86IOMMUState *x86_iommu =3D X86_IOMMU_DEVICE(s); =20 index =3D VTD_PASID_TABLE_INDEX(pasid); entry_size =3D VTD_PASID_ENTRY_SIZE; @@ -805,7 +830,7 @@ static int vtd_get_pe_in_pasid_leaf_table(IntelIOMMUSta= te *s, } =20 /* Do translation type check */ - if (!vtd_pe_type_check(x86_iommu, pe)) { + if (!vtd_pe_type_check(s, pe)) { return -VTD_FR_PASID_TABLE_INV; } =20 @@ -1027,6 +1052,34 @@ static inline bool vtd_iova_sl_range_check(IntelIOMM= UState *s, return !(iova & ~(vtd_iova_limit(s, ce, aw, pasid) - 1)); } =20 +/* Return true if IOVA is canonical, otherwise false. */ +static bool vtd_iova_fl_check_canonical(IntelIOMMUState *s, + uint64_t iova, VTDContextEntry *ce, + uint8_t aw, uint32_t pasid) +{ + uint64_t iova_limit =3D vtd_iova_limit(s, ce, aw, pasid); + uint64_t upper_bits_mask =3D ~(iova_limit - 1); + uint64_t upper_bits =3D iova & upper_bits_mask; + bool msb =3D ((iova & (iova_limit >> 1)) !=3D 0); + return !( + (!msb && (upper_bits !=3D 0)) || + (msb && (upper_bits !=3D upper_bits_mask)) + ); +} + +/* Return the page table base address corresponding to the translation typ= e. */ +static dma_addr_t vtd_pe_get_pgtbl_base(VTDPASIDEntry *pe) +{ + uint16_t pgtt =3D VTD_PE_GET_TYPE(pe); + if (pgtt =3D=3D VTD_SM_PASID_ENTRY_FLT) { + return pe->val[2] & VTD_SM_PASID_ENTRY_PTPTR; + } else if (pgtt =3D=3D VTD_SM_PASID_ENTRY_SLT) { + return pe->val[0] & VTD_SM_PASID_ENTRY_PTPTR; + } + + return 0; /* Not supported */ +} + static dma_addr_t vtd_get_iova_pgtbl_base(IntelIOMMUState *s, VTDContextEntry *ce, uint32_t pasid) @@ -1035,7 +1088,7 @@ static dma_addr_t vtd_get_iova_pgtbl_base(IntelIOMMUS= tate *s, =20 if (s->root_scalable) { vtd_ce_get_rid2pasid_entry(s, ce, &pe, pasid); - return pe.val[0] & VTD_SM_PASID_ENTRY_SLPTPTR; + return vtd_pe_get_pgtbl_base(&pe); } =20 return vtd_ce_get_slpt_base(ce); @@ -1053,6 +1106,10 @@ static dma_addr_t vtd_get_iova_pgtbl_base(IntelIOMMU= State *s, static uint64_t vtd_spte_rsvd[VTD_SPTE_RSVD_LEN]; static uint64_t vtd_spte_rsvd_large[VTD_SPTE_RSVD_LEN]; =20 +#define VTD_FPTE_RSVD_LEN 5 +static uint64_t vtd_fpte_rsvd[VTD_FPTE_RSVD_LEN]; +static uint64_t vtd_fpte_rsvd_large[VTD_FPTE_RSVD_LEN]; + static bool vtd_slpte_nonzero_rsvd(uint64_t slpte, uint32_t level) { uint64_t rsvd_mask; @@ -1079,21 +1136,140 @@ static bool vtd_slpte_nonzero_rsvd(uint64_t slpte,= uint32_t level) return slpte & rsvd_mask; } =20 -/* Given the @iova, get relevant @slptep. @slpte_level will be the last le= vel - * of the translation, can be used for deciding the size of large page. - */ -static int vtd_iova_to_slpte(IntelIOMMUState *s, VTDContextEntry *ce, - uint64_t iova, bool is_write, - uint64_t *slptep, uint32_t *slpte_level, - bool *reads, bool *writes, uint8_t aw_bits, - uint32_t pasid) +static bool vtd_flpte_nonzero_rsvd(uint64_t flpte, uint32_t level) +{ + uint64_t rsvd_mask; + assert(level < VTD_FPTE_RSVD_LEN); + assert(level); + + if ((level =3D=3D VTD_FL_PD_LEVEL || level =3D=3D VTD_FL_PDP_LEVEL) && + (flpte & VTD_PT_PAGE_SIZE_MASK)) { + /* large page */ + rsvd_mask =3D vtd_fpte_rsvd_large[level]; + } else { + rsvd_mask =3D vtd_fpte_rsvd[level]; + } + + return flpte & rsvd_mask; +} + +static int vtd_iova_to_pte_check_read_error(IntelIOMMUState *s, + VTDContextEntry *ce, uint64_t = iova, + uint64_t pte, uint32_t pasid, + uint32_t level, uint16_t pgtt) +{ + if (pte =3D=3D (uint64_t)-1) { + error_report_once("%s: detected read error on DMAR pte " + "(iova=3D0x%" PRIx64 ", pasid=3D0x%" PRIx32 ")= ", + __func__, iova, pasid); + if (level =3D=3D vtd_get_iova_level(s, ce, pasid)) { + /* Invalid programming of context-entry */ + if (s->root_scalable) { + return pgtt =3D=3D VTD_SM_PASID_ENTRY_FLT ? + -VTD_FR_FIRST_FSPE_ACCESS : + -VTD_FR_FIRST_SSPE_ACCESS; + } else { + return -VTD_FR_CONTEXT_ENTRY_INV; + } + } else { + if (s->root_scalable) { + return pgtt =3D=3D VTD_SM_PASID_ENTRY_FLT ? + -VTD_FR_FSPE_ACCESS : + -VTD_FR_SSPE_ACCESS; + } else { + return -VTD_FR_PAGING_ENTRY_INV; + } + } + } + + return 0; +} + +static inline bool vtd_addr_in_interrup_range(hwaddr addr, uint64_t size) +{ + return !((addr > VTD_INTERRUPT_ADDR_LAST) || + (addr + size - 1 < VTD_INTERRUPT_ADDR_FIRST)); +} + +static int vtd_iova_to_pte_fl(IntelIOMMUState *s, VTDContextEntry *ce, + uint64_t iova, bool is_write, uint64_t *ptep, + uint32_t *pte_level, bool *reads, bool *writ= es, + uint8_t aw_bits, uint32_t pasid, dma_addr_t = addr) +{ + uint32_t offset; + uint64_t pte; + uint64_t access_right_check =3D is_write ? VTD_FL_W : 0; + int ret; + + if (!vtd_iova_fl_check_canonical(s, iova, ce, aw_bits, pasid)) { + error_report_once("%s: detected non canonical IOVA (iova=3D0x%" PR= Ix64 "," + "pasid=3D0x%" PRIx32 ")", __func__, iova, pasid); + return -VTD_FR_FS_NON_CANONICAL; + } + + while (true) { + offset =3D vtd_iova_level_offset(iova, *pte_level); + pte =3D vtd_get_pte(addr, offset); + + ret =3D vtd_iova_to_pte_check_read_error(s, ce, iova, pte, + pasid, *pte_level, + VTD_SM_PASID_ENTRY_FLT); + if (ret !=3D 0) { + return ret; + } + + if (!vtd_fl_pte_present(pte)) { + return -VTD_FR_FSPE_NOT_PRESENT; + } + + *reads =3D true; + *writes =3D (*writes) && (pte & VTD_FL_W); + + if (vtd_set_flag_in_pte(addr, offset, pte, VTD_FL_PTE_A) !=3D MEMT= X_OK) { + return -VTD_FR_FS_BIT_UPDATE_FAILED; + } + + if ((pte & access_right_check) !=3D access_right_check) { + error_report_once("%s: detected pte permission error " + "(iova=3D0x%" PRIx64 ", level=3D0x%" PRIx32 = ", " + "pte=3D0x%" PRIx64 ", write=3D%d, pasid=3D0x= %" + PRIx32 ")", __func__, iova, *pte_level, + pte, is_write, pasid); + return is_write ? -VTD_FR_SM_WRITE : -VTD_FR_SM_READ; + } + if (vtd_flpte_nonzero_rsvd(pte, *pte_level)) { + error_report_once("%s: detected flpte reserved non-zero " + "iova=3D0x%" PRIx64 ", level=3D0x%" PRIx32 + "pte=3D0x%" PRIx64 ", pasid=3D0x%" PRIX32 ")= ", + __func__, iova, *pte_level, pte, pasid); + return -VTD_FR_PAGING_ENTRY_RSVD; + } + + if (vtd_is_last_pte(pte, *pte_level)) { + *ptep =3D pte; + break; + } + addr =3D vtd_get_pte_addr(pte, aw_bits); + (*pte_level)--; + } + + if (is_write && + (vtd_set_flag_in_pte(addr, offset, pte, VTD_FL_PTE_D) !=3D MEMTX_O= K)) { + return -VTD_FR_FS_BIT_UPDATE_FAILED; + } + + return 0; +} + +static int vtd_iova_to_pte_sl(IntelIOMMUState *s, VTDContextEntry *ce, + uint64_t iova, bool is_write, uint64_t *slpt= ep, + uint32_t *pte_level, bool *reads, bool *writ= es, + uint8_t aw_bits, uint32_t pasid, dma_addr_t = addr) { - dma_addr_t addr =3D vtd_get_iova_pgtbl_base(s, ce, pasid); - uint32_t level =3D vtd_get_iova_level(s, ce, pasid); uint32_t offset; uint64_t slpte; - uint64_t access_right_check; - uint64_t xlat, size; + uint64_t access_right_check =3D is_write ? VTD_SL_W : VTD_SL_R; + int ret; =20 if (!vtd_iova_sl_range_check(s, iova, ce, aw_bits, pasid)) { error_report_once("%s: detected IOVA overflow (iova=3D0x%" PRIx64 = "," @@ -1101,72 +1277,128 @@ static int vtd_iova_to_slpte(IntelIOMMUState *s, V= TDContextEntry *ce, return -VTD_FR_ADDR_BEYOND_MGAW; } =20 - /* FIXME: what is the Atomics request here? */ - access_right_check =3D is_write ? VTD_SL_W : VTD_SL_R; - while (true) { - offset =3D vtd_iova_level_offset(iova, level); + offset =3D vtd_iova_level_offset(iova, *pte_level); slpte =3D vtd_get_pte(addr, offset); =20 - if (slpte =3D=3D (uint64_t)-1) { - error_report_once("%s: detected read error on DMAR slpte " - "(iova=3D0x%" PRIx64 ", pasid=3D0x%" PRIx32 = ")", - __func__, iova, pasid); - if (level =3D=3D vtd_get_iova_level(s, ce, pasid)) { - /* Invalid programming of context-entry */ - return -VTD_FR_CONTEXT_ENTRY_INV; - } else { - return -VTD_FR_PAGING_ENTRY_INV; - } + ret =3D vtd_iova_to_pte_check_read_error(s, ce, iova, slpte, + pasid, *pte_level, + VTD_SM_PASID_ENTRY_SLT); + if (ret !=3D 0) { + return ret; } *reads =3D (*reads) && (slpte & VTD_SL_R); *writes =3D (*writes) && (slpte & VTD_SL_W); - if (!(slpte & access_right_check)) { + if ((slpte & access_right_check) !=3D access_right_check) { error_report_once("%s: detected slpte permission error " "(iova=3D0x%" PRIx64 ", level=3D0x%" PRIx32 = ", " "slpte=3D0x%" PRIx64 ", write=3D%d, pasid=3D= 0x%" - PRIx32 ")", __func__, iova, level, + PRIx32 ")", __func__, iova, *pte_level, slpte, is_write, pasid); - return is_write ? -VTD_FR_WRITE : -VTD_FR_READ; + if (s->root_scalable) { + return is_write ? -VTD_FR_SM_WRITE : -VTD_FR_SM_READ; + } else { + return is_write ? -VTD_FR_WRITE : -VTD_FR_READ; + } } - if (vtd_slpte_nonzero_rsvd(slpte, level)) { + if (vtd_slpte_nonzero_rsvd(slpte, *pte_level)) { error_report_once("%s: detected splte reserve non-zero " "iova=3D0x%" PRIx64 ", level=3D0x%" PRIx32 "slpte=3D0x%" PRIx64 ", pasid=3D0x%" PRIX32 = ")", - __func__, iova, level, slpte, pasid); + __func__, iova, *pte_level, slpte, pasid); return -VTD_FR_PAGING_ENTRY_RSVD; } =20 - if (vtd_is_last_pte(slpte, level)) { + if (vtd_is_last_pte(slpte, *pte_level)) { *slptep =3D slpte; - *slpte_level =3D level; break; } addr =3D vtd_get_pte_addr(slpte, aw_bits); - level--; + (*pte_level)--; + } + + return 0; +} + +/* + * Given the @iova, get relevant @ptep. @pte_level will be the last level + * of the translation, can be used for deciding the size of large page. + */ +static int vtd_iova_to_pte(IntelIOMMUState *s, VTDContextEntry *ce, + uint64_t iova, bool is_write, + uint64_t *ptep, uint32_t *pte_level, + bool *reads, bool *writes, uint8_t aw_bits, + uint32_t pasid) +{ + dma_addr_t addr; + uint16_t pgtt; + uint64_t xlat, size; + VTDPASIDEntry pe; + int ret; + + /* FIXME: what is the Atomics request in access rights? */ + + if (s->root_scalable) { + vtd_ce_get_rid2pasid_entry(s, ce, &pe, pasid); + pgtt =3D VTD_PE_GET_TYPE(&pe); + *pte_level =3D VTD_PE_GET_LEVEL(&pe); + addr =3D vtd_pe_get_pgtbl_base(&pe); + switch (pgtt) { + case VTD_SM_PASID_ENTRY_FLT: + if (s->ecap & VTD_ECAP_FLTS) { + ret =3D vtd_iova_to_pte_fl(s, ce, iova, is_write, ptep, pt= e_level, + reads, writes, aw_bits, pasid, ad= dr); + } else { + error_report_once("First-stage translation not supported := %d", + pgtt); + return -VTD_FR_INVALID_PGTT; + } + break; + case VTD_SM_PASID_ENTRY_SLT: + if (s->ecap & VTD_ECAP_SLTS) { + ret =3D vtd_iova_to_pte_sl(s, ce, iova, is_write, ptep, pt= e_level, + reads, writes, aw_bits, pasid, ad= dr); + } else { + error_report_once("Second-stage translation not supported = : %d", + pgtt); + return -VTD_FR_INVALID_PGTT; + } + break; + default: + error_report_once("Unsupported PGTT : %d", pgtt); + ret =3D -VTD_FR_INVALID_PGTT; + break; + } + } else { + *pte_level =3D vtd_ce_get_level(ce); + addr =3D vtd_ce_get_slpt_base(ce); + ret =3D vtd_iova_to_pte_sl(s, ce, iova, is_write, ptep, pte_level, + reads, writes, aw_bits, pasid, addr); } =20 - xlat =3D vtd_get_pte_addr(*slptep, aw_bits); - size =3D ~vtd_pt_level_page_mask(level) + 1; + if (ret !=3D 0) { + return ret; + } + + xlat =3D vtd_get_pte_addr(*ptep, aw_bits); + size =3D ~vtd_pt_level_page_mask(*pte_level) + 1; =20 /* * From VT-d spec 3.14: Untranslated requests and translation * requests that result in an address in the interrupt range will be * blocked with condition code LGN.4 or SGN.8. */ - if ((xlat > VTD_INTERRUPT_ADDR_LAST || - xlat + size - 1 < VTD_INTERRUPT_ADDR_FIRST)) { + if (!vtd_addr_in_interrup_range(xlat, size)) { return 0; } else { error_report_once("%s: xlat address is in interrupt range " "(iova=3D0x%" PRIx64 ", level=3D0x%" PRIx32 ", " - "slpte=3D0x%" PRIx64 ", write=3D%d, " + "pte=3D0x%" PRIx64 ", write=3D%d, " "xlat=3D0x%" PRIx64 ", size=3D0x%" PRIx64 ", " "pasid=3D0x%" PRIx32 ")", - __func__, iova, level, slpte, is_write, + __func__, iova, *pte_level, *ptep, is_write, xlat, size, pasid); - return s->scalable_mode ? -VTD_FR_SM_INTERRUPT_ADDR : - -VTD_FR_INTERRUPT_ADDR; + return -VTD_INTERRUPT_RANGE_ERROR(s); } } =20 @@ -1772,6 +2004,16 @@ static const bool vtd_qualified_faults[] =3D { [VTD_FR_CONTEXT_ENTRY_TT] =3D true, [VTD_FR_PASID_TABLE_INV] =3D false, [VTD_FR_SM_INTERRUPT_ADDR] =3D true, + [VTD_FR_INVALID_PGTT] =3D true, + [VTD_FR_FSPE_ACCESS] =3D true, + [VTD_FR_FSPE_NOT_PRESENT] =3D true, + [VTD_FR_FIRST_FSPE_ACCESS] =3D true, + [VTD_FR_SSPE_ACCESS] =3D true, + [VTD_FR_FIRST_SSPE_ACCESS] =3D true, + [VTD_FR_FS_NON_CANONICAL] =3D true, + [VTD_FR_SM_WRITE] =3D true, + [VTD_FR_SM_READ] =3D true, + [VTD_FR_FS_BIT_UPDATE_FAILED] =3D true, [VTD_FR_MAX] =3D false, }; =20 @@ -1870,7 +2112,8 @@ static bool vtd_do_iommu_translate(VTDAddressSpace *v= td_as, PCIBus *bus, uint8_t bus_num =3D pci_bus_num(bus); VTDContextCacheEntry *cc_entry; uint64_t pte, page_mask; - uint32_t level, pasid =3D vtd_as->pasid; + uint32_t level =3D UINT32_MAX; + uint32_t pasid =3D vtd_as->pasid; uint16_t source_id =3D PCI_BUILD_BDF(bus_num, devfn); int ret_fr; bool is_fpd_set =3D false; @@ -1981,7 +2224,7 @@ static bool vtd_do_iommu_translate(VTDAddressSpace *v= td_as, PCIBus *bus, } } =20 - ret_fr =3D vtd_iova_to_slpte(s, &ce, addr, is_write, &pte, &level, + ret_fr =3D vtd_iova_to_pte(s, &ce, addr, is_write, &pte, &level, &reads, &writes, s->aw_bits, pasid); if (ret_fr) { vtd_report_fault(s, -ret_fr, is_fpd_set, source_id, @@ -1990,6 +2233,7 @@ static bool vtd_do_iommu_translate(VTDAddressSpace *v= td_as, PCIBus *bus, } =20 page_mask =3D vtd_pt_level_page_mask(level); + /* Exe is always set to 0 in the spec */ access_flags =3D IOMMU_ACCESS_FLAG(reads, writes); vtd_update_iotlb(s, source_id, vtd_get_domain_id(s, &ce, pasid), addr, pte, access_flags, level, pasid); @@ -2005,7 +2249,12 @@ error: vtd_iommu_unlock(s); entry->iova =3D 0; entry->translated_addr =3D 0; - entry->addr_mask =3D 0; + /* + * Set the mask for ATS (the range must be present even when the + * translation fails : PCIe rev 5 10.2.3.5) + */ + entry->addr_mask =3D (level !=3D UINT32_MAX) ? + (~vtd_pt_level_page_mask(level)) : (~VTD_PAGE_MASK= _4K); entry->perm =3D IOMMU_NONE; return false; } @@ -3187,6 +3436,8 @@ static IOMMUTLBEntry vtd_iommu_translate(IOMMUMemoryR= egion *iommu, hwaddr addr, }; bool success; =20 + /* IOMMUAccessFlags : IOMMU_EXEC and IOMMU_PRIV not supported */ + if (likely(s->dmar_enabled)) { success =3D vtd_do_iommu_translate(vtd_as, vtd_as->bus, vtd_as->de= vfn, addr, flag & IOMMU_WO, &iotlb); @@ -3989,6 +4240,21 @@ static void vtd_init(IntelIOMMUState *s) vtd_spte_rsvd_large[3] =3D VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits, x86_iommu->dt_sup= ported); =20 + /* + * Rsvd field masks for fpte + */ + vtd_fpte_rsvd[0] =3D ~0ULL; + vtd_fpte_rsvd[1] =3D VTD_FPTE_PAGE_L1_RSVD_MASK(s->aw_bits); + vtd_fpte_rsvd[2] =3D VTD_FPTE_PAGE_L2_RSVD_MASK(s->aw_bits); + vtd_fpte_rsvd[3] =3D VTD_FPTE_PAGE_L3_RSVD_MASK(s->aw_bits); + vtd_fpte_rsvd[4] =3D VTD_FPTE_PAGE_L4_RSVD_MASK(s->aw_bits); + + vtd_fpte_rsvd_large[0] =3D ~0ULL; + vtd_fpte_rsvd_large[1] =3D ~0ULL; + vtd_fpte_rsvd_large[2] =3D VTD_FPTE_PAGE_L2_FS2MP_RSVD_MASK(s->aw_bits= ); + vtd_fpte_rsvd_large[3] =3D VTD_FPTE_PAGE_L3_FS1GP_RSVD_MASK(s->aw_bits= ); + vtd_fpte_rsvd_large[4] =3D ~0ULL; + if (s->scalable_mode || s->snoop_control) { vtd_spte_rsvd[1] &=3D ~VTD_SPTE_SNP; vtd_spte_rsvd_large[2] &=3D ~VTD_SPTE_SNP; diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h index 8d27b1c15b..ed61979934 100644 --- a/hw/i386/intel_iommu_internal.h +++ b/hw/i386/intel_iommu_internal.h @@ -195,6 +195,7 @@ #define VTD_ECAP_PASID (1ULL << 40) #define VTD_ECAP_SMTS (1ULL << 43) #define VTD_ECAP_SLTS (1ULL << 46) +#define VTD_ECAP_FLTS (1ULL << 47) =20 /* CAP_REG */ /* (offset >> 4) << 24 */ @@ -215,6 +216,7 @@ #define VTD_CAP_CM (1ULL << 7) #define VTD_PASID_ID_SHIFT 20 #define VTD_PASID_ID_MASK ((1ULL << VTD_PASID_ID_SHIFT) - 1) +#define VTD_CAP_FS1GP (1ULL << 56) =20 /* Supported Adjusted Guest Address Widths */ #define VTD_CAP_SAGAW_SHIFT 8 @@ -270,6 +272,10 @@ #define VTD_FRCD_PP(val) (((val) & 0x1ULL) << 31) #define VTD_FRCD_IR_IDX(val) (((val) & 0xffffULL) << 48) =20 +#define VTD_INTERRUPT_RANGE_ERROR(s) ((s)->scalable_mode ? \ + VTD_FR_SM_INTERRUPT_ADDR : \ + VTD_FR_INTERRUPT_ADDR) + /* DMA Remapping Fault Conditions */ typedef enum VTDFaultReason { VTD_FR_RESERVED =3D 0, /* Reserved for Advanced Fault logging */ @@ -312,9 +318,21 @@ typedef enum VTDFaultReason { VTD_FR_IR_SID_ERR =3D 0x26, /* Invalid Source-ID */ =20 VTD_FR_PASID_TABLE_INV =3D 0x58, /*Invalid PASID table entry */ + VTD_FR_INVALID_PGTT =3D 0x5b, /* SPT.4.2 Invalid PGTT */ + + VTD_FR_FSPE_ACCESS =3D 0x70, /* SFS.1 */ + VTD_FR_FSPE_NOT_PRESENT =3D 0x71, /* SFS.2 : Present (P) field is 0.*/ + VTD_FR_FIRST_FSPE_ACCESS =3D 0x73, /* SFS.4 */ + VTD_FR_SSPE_ACCESS =3D 0x78, /* SSS.1 */ + VTD_FR_FIRST_SSPE_ACCESS =3D 0x7b, /* SSS.4 */ + VTD_FR_FS_NON_CANONICAL =3D 0x80, /* SNG.1 : Address for FS not canoni= cal.*/ + + VTD_FR_SM_WRITE =3D 0x85, /* SGN.6 */ + VTD_FR_SM_READ =3D 0x86, /* SGN.7 */ =20 /* Output address in the interrupt address range for scalable mode */ - VTD_FR_SM_INTERRUPT_ADDR =3D 0x87, + VTD_FR_SM_INTERRUPT_ADDR =3D 0x87, /* SGN.8 */ + VTD_FR_FS_BIT_UPDATE_FAILED =3D 0x91, /* SFS.10 */ VTD_FR_MAX, /* Guard */ } VTDFaultReason; =20 @@ -431,6 +449,23 @@ typedef union VTDInvDesc VTDInvDesc; (0x3ffff800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM | VTD_SL_TM))= : \ (0x3ffff800ULL | ~(VTD_HAW_MASK(aw) | VTD_SL_IGN_COM)) =20 +#define VTD_FS_UPPER_IGNORED 0xfff0000000000000ULL +#define VTD_FPTE_PAGE_L1_RSVD_MASK(aw) (~(VTD_HAW_MASK(aw)) & \ + (~VTD_FS_UPPER_IGNORED)) +#define VTD_FPTE_PAGE_L2_RSVD_MASK(aw) (~(VTD_HAW_MASK(aw)) & \ + (~VTD_FS_UPPER_IGNORED)) +#define VTD_FPTE_PAGE_L3_RSVD_MASK(aw) (~(VTD_HAW_MASK(aw)) & \ + (~VTD_FS_UPPER_IGNORED)) +#define VTD_FPTE_PAGE_L3_FS1GP_RSVD_MASK(aw) ((0x3fffe000ULL | \ + ~(VTD_HAW_MASK(aw))) \ + & (~VTD_FS_UPPER_IGNORED)) +#define VTD_FPTE_PAGE_L2_FS2MP_RSVD_MASK(aw) ((0x1fe000ULL | \ + ~(VTD_HAW_MASK(aw))) \ + & (~VTD_FS_UPPER_IGNORED)) +#define VTD_FPTE_PAGE_L4_RSVD_MASK(aw) ((0x80ULL | \ + ~(VTD_HAW_MASK(aw))) \ + & (~VTD_FS_UPPER_IGNORED)) + /* Information about page-selective IOTLB invalidate */ struct VTDIOTLBPageInvInfo { uint16_t domain_id; @@ -514,9 +549,6 @@ typedef struct VTDRootEntry VTDRootEntry; #define VTD_SM_PASID_ENTRY_AW 7ULL /* Adjusted guest-address-widt= h */ #define VTD_SM_PASID_ENTRY_DID(val) ((val) & VTD_DOMAIN_ID_MASK) =20 -/* Second Level Page Translation Pointer*/ -#define VTD_SM_PASID_ENTRY_SLPTPTR (~0xfffULL) - /* Paging Structure common */ #define VTD_SM_PASID_ENTRY_PTPTR (~0xfffULL) #define VTD_PT_PAGE_SIZE_MASK (1ULL << 7) @@ -532,6 +564,14 @@ typedef struct VTDRootEntry VTDRootEntry; #define VTD_SL_PD_LEVEL 2 #define VTD_SL_PT_LEVEL 1 =20 +/* First Level Paging Structure */ +#define VTD_FL_PDP_LEVEL 3 +#define VTD_FL_PD_LEVEL 2 +#define VTD_FL_PTE_P 0x1 +#define VTD_FL_PTE_A 0x20 +#define VTD_FL_PTE_D 0x40 +#define VTD_FL_PTE_EA 0x400 + /* Masks for Second Level Paging Entry */ #define VTD_SL_RW_MASK 3ULL #define VTD_SL_R 1ULL @@ -539,4 +579,7 @@ typedef struct VTDRootEntry VTDRootEntry; #define VTD_SL_IGN_COM 0xbff0000000000000ULL #define VTD_SL_TM (1ULL << 62) =20 +/* Masks for First Level Paging Entry */ +#define VTD_FL_W (1ULL << 1) + #endif --=20 2.44.0