From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 753834A995; Wed, 10 Jan 2024 13:37:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="QI8nzHAd" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1704893828; x=1736429828; h=date:from:to:cc:subject:message-id:references: mime-version:in-reply-to; bh=3KjM4afpgsVkg16ec8qhOMcIMU+MFDkAz+XeEDCLYjk=; b=QI8nzHAd5CG4V7O4UCIE7+E9z1PRb4DCR/ix5W9XfGsUyIimj0steTf+ kYILwsrmXjLq23TCUSUUVexchAZM5CLx1up9dJ6csnUkWOtsGtlhA57P4 0wvhaMqBbUNbM4meBBQW9zun4RJbwTY/dGTqpdQkGFsmhdfNwJhrNnTk4 s/scsHrebWjuS9WV08AJGgeWNI2D/EUwjJSCgrS/TnjXbLRUFedWqUjGk boyz90F/k4Y7BEr+5thss32inlupHSP5cWds38a1x7W8KpICO8r2Par+w 8NBL2UgBD5W067spn+iDc+6jMzjigoiYtsZ3+JMZ+ppGqPDJw/AHwozlE g==; X-IronPort-AV: E=McAfee;i="6600,9927,10948"; a="5291530" X-IronPort-AV: E=Sophos;i="6.04,184,1695711600"; d="scan'208";a="5291530" Received: from fmviesa001.fm.intel.com ([10.60.135.141]) by fmvoesa103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jan 2024 05:37:06 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.04,184,1695711600"; d="scan'208";a="24271084" Received: from jganji-mobl1.gar.corp.intel.com (HELO box.shutemov.name) ([10.249.37.201]) by smtpauth.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jan 2024 05:37:00 -0800 Received: by box.shutemov.name (Postfix, from userid 1000) id 4DBCC109589; Wed, 10 Jan 2024 16:36:57 +0300 (+03) Date: Wed, 10 Jan 2024 16:36:57 +0300 From: "Kirill A. Shutemov" To: Kevin Loughlin Cc: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Andy Lutomirski , Peter Zijlstra , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , Rick Edgecombe , Kees Cook , "Masami Hiramatsu (Google)" , Ze Gao , Josh Poimboeuf , Pengfei Xu , Brijesh Singh , Michael Roth , Ashish Kalra , Tom Lendacky , Joerg Roedel , linux-kernel@vger.kernel.org, llvm@lists.linux.dev, linux-coco@lists.linux.dev, Adam Dunlap , Peter Gonda , Jacob Xu , Sidharth Telang Subject: Re: [RFC PATCH] x86/sev: x86/sev: enforce PC-relative addressing in clang Message-ID: <20240110133657.vbpzplchgaim3bya@box> References: <20240110012640.1335694-1-kevinloughlin@google.com> Precedence: bulk X-Mailing-List: llvm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240110012640.1335694-1-kevinloughlin@google.com> On Wed, Jan 10, 2024 at 01:26:39AM +0000, Kevin Loughlin wrote: > SEV/SME code can execute prior to page table fixups for kernel > relocation. However, as with global variables accessed in > __startup_64(), clang does not currently generate PC-relative accesses > for SEV/SME global variables, causing certain flavors of SEV hosts and > guests to crash. > > While an attempt was made to force PC-relative addressing for certain > global SEV/SME variables via inline assembly (see snp_cpuid_get_table() > for example), PC-relative addressing must be pervasively-enforced for > SEV/SME global variables that can be accessed prior to page table > fixups. > > To avoid the error-prone approach of manually referencing each SEV/SME > global variable via a general form of snp_cpuid_get_table(), it is > preferable to use compiler flags for position-independent code (ex: > `-fPIE`) that result in PC-relative accesses. While architecture- > specific code for Linux can be pervasively compiled as position- > independent on select architectures (ex: RISC-V), this is not currently > the case for x86-64 and would require extensive changes (see "[PATCH > RFC 00/43] x86/pie: Make kernel image's virtual address flexible" for > example). > > Fortunately, the relevant files for SEV/SME code do indeed support > position-independent clang compilation, so we can use this technique to > ensure all global variables in these files are accessed via PC-relative > addressing. > > Unlike clang, gcc does not currently allow `-fPIE` in conjunction with > `mcmodel=kernel`. Thus, to preserve existing gcc behavior, this patch > does not remove the (otherwise unnecessary) inline assembly that > already enforces PC-relative addressing for select SEV/SME globals > (mentioned above). If gcc supports these joint options in the future, > we can remove such inline assembly and also apply this patch to gcc > builds. > > Tested by successful boot of SEV-SNP guest built with clang, alongside > Adam Dunlap's necessary "[PATCH v2] x86/asm: Force native_apic_mem_read > to use mov". > Similar issues was fixed before with fixup_pointer() tricks. Have you tried looking this direction. Relevant thread starting with: https://lore.kernel.org/all/20210920192341.maue7db4lcbdn46x@box.shutemov.name -- Kiryl Shutsemau / Kirill A. Shutemov