Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  sev_verify_cbit.S   Sprache: Sparc

 
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * sev_verify_cbit.S - Code for verification of the C-bit position reported
 *     by the Hypervisor when running with SEV enabled.
 *
 * Copyright (c) 2020  Joerg Roedel (jroedel@suse.de)
 *
 * sev_verify_cbit() is called before switching to a new long-mode page-table
 * at boot.
 *
 * Verify that the C-bit position is correct by writing a random value to
 * an encrypted memory location while on the current page-table. Then it
 * switches to the new page-table to verify the memory content is still the
 * same. After that it switches back to the current page-table and when the
 * check succeeded it returns. If the check failed the code invalidates the
 * stack pointer and goes into a hlt loop. The stack-pointer is invalidated to
 * make sure no interrupt or exception can get the CPU out of the hlt loop.
 *
 * New page-table pointer is expected in %rdi (first parameter)
 *
 */

SYM_FUNC_START(sev_verify_cbit)
#ifdef CONFIG_AMD_MEM_ENCRYPT
 /* First check if a C-bit was detected */
 movq sme_me_mask(%rip), %rsi
 testq %rsi, %rsi
 jz 3f

 /* sme_me_mask != 0 could mean SME or SEV - Check also for SEV */
 movq sev_status(%rip), %rsi
 testq %rsi, %rsi
 jz 3f

 /* Save CR4 in %rsi */
 movq %cr4, %rsi

 /* Disable Global Pages */
 movq %rsi, %rdx
 andq $(~X86_CR4_PGE), %rdx
 movq %rdx, %cr4

 /*
 * Verified that running under SEV - now get a random value using
 * RDRAND. This instruction is mandatory when running as an SEV guest.
 *
 * Don't bail out of the loop if RDRAND returns errors. It is better to
 * prevent forward progress than to work with a non-random value here.
 */

1: rdrand %rdx
 jnc 1b

 /* Store value to memory and keep it in %rdx */
 movq %rdx, sev_check_data(%rip)

 /* Backup current %cr3 value to restore it later */
 movq %cr3, %rcx

 /* Switch to new %cr3 - This might unmap the stack */
 movq %rdi, %cr3

 /*
 * Compare value in %rdx with memory location. If C-bit is incorrect
 * this would read the encrypted data and make the check fail.
 */

 cmpq %rdx, sev_check_data(%rip)

 /* Restore old %cr3 */
 movq %rcx, %cr3

 /* Restore previous CR4 */
 movq %rsi, %cr4

 /* Check CMPQ result */
 je 3f

 /*
 * The check failed, prevent any forward progress to prevent ROP
 * attacks, invalidate the stack and go into a hlt loop.
 */

 xorl %esp, %esp
 subq $0x1000, %rsp
2: hlt
 jmp 2b
3:
#endif
 /* Return page-table pointer */
 movq %rdi, %rax
 RET
SYM_FUNC_END(sev_verify_cbit)

Messung V0.5
C=93 H=91 G=91

¤ Dauer der Verarbeitung: 0.1 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge