PR_RISCV_SET_ICACHE_FLUSH_CTX(2const)

BEZEICHNUNG
PR_RISCV_SET_ICACHE_FLUSH_CTX - (De)aktiviert Icache-Rausschreibanweisungen im Anwendungsraum

BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)

ÜBERSICHT
#include <linux/prctl.h>  /* Definition der PR_*-Konstanten */
#include <sys/prctl.h>

int prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, unsigned long ktx,
          unsigned long Bereich);

BESCHREIBUNG
Der Kontext und der Bereich kann mit ktx bzw. Bereich angegeben werden.

Wird Bereich auf PR_RISCV_SCOPE_PER_PROCESS gesetzt, dann ist es allen Threads in dem Prozess erlaubt, Icache-Rausschreibanweisungen auszugeben. Immer wenn ein Thread im Prozess migriert wird, ist garantiert, dass der entsprechende Icache des Harts mit dem Anweisungsspeicher konsistent ist. Außerhalb der Migration erzwingt dies keine Garantie. Falls ein Thread eine Anweisung verändert, die ein anderer Thread auszuführen versucht, muss der andere Thread weiterhin eine Icache-Rausschreibanweisung ausgeben, bevor er die Ausführung der möglicherweise veränderten Anweisung versucht. Dies muss durch das Programm im Anwendungsraum ausgeführt werden.

Im Thread-bezogenen Kontext (d.h. Bereich ist beispielsweise auf PR_RISCV_SCOPE_PER_THREAD gesetzt), ist es nur dem Thread, der diese Funktion aufruft, erlaubt, Icache-Rausschreibanweisungen auszugeben. Wird der Thread migriert, wird garantiert, dass der entsprechende Icache des Harts konsistent mit Anweisungsspeicher ist.

Auf Kerneln, auf denen kein SMP konfiguriert ist, ist dieser prctl PR_RISCV_SET_ICACHE_FLUSH_CTX eine Leeroperation, da Migrationen über Harts nicht auftreten werden.

Für ktx können die folgenden Werte angegeben werden:

PR_RISCV_CTX_SW_FENCEI_ON (seit Linux 6.10)
    Fence.i im Anwendungsraum erlauben.

PR_RISCV_CTX_SW_FENCEI_OFF (seit Linux 6.10)
    Fence.i im Anwendungsraum verbieten. Alle Threads in einem Prozess werden davon betroffen, wenn Bereich auf PR_RISCV_SCOPE_PER_PROCESS gesetzt ist. Daher müssen Sie Vorsicht walten lassen. Verwenden Sie den Schalter nur, wenn Sie garantieren können, dass kein Thread im Prozess ab diesem Zeitpunkt fence.i ausgeben wird.

Für Bereich können die folgenden Werte angegeben werden:

PR_RISCV_SCOPE_PER_PROCESS (seit Linux 6.10)
    Stellt sicher, dass der Icache jedes Threads in diesem Prozess zum Anweisungsspeicher bei der Migration kohärent ist.

PR_RISCV_SCOPE_PER_THREAD (seit Linux 6.10)
    Stellt sicher, dass der Icache des aktuellen Threads bei der Migration kohärent zu dem Anweisungsspeicher ist.

BEISPIELE
Bei den folgenden Dateien ist vorgesehen, dass sie miteinander kompiliert und gelinkt werden. Die Funktion modify_instruction() ersetzt eine Addition von Null durch eine Addition mit Eins, was dazu führt, dass sich die Rückgabe der Anweisungssequenz in get_value() von Null auf Eins ändert.

  Programmquelle: cmodx.c
    #include <stdio.h>
    #include <sys/prctl.h>

    extern int get_value(void);
    extern void modify_instruction(void);

    int
    main(void)
    {
        int value = get_value();

        printf("Wert vor cmodx: %d\n", value);

        // prctl wird vor erstem fence.i aufgerufen
        prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, PR_RISCV_CTX_SW_FENCEI_ON,
              PR_RISCV_SCOPE_PER_PROCESS);

        modify_instruction();

        // prctl wird nach abschließendem fence.i im Prozess aufgerufen
        prctl(PR_RISCV_SET_ICACHE_FLUSH_CTX, PR_RISCV_CTX_SW_FENCEI_OFF,
              PR_RISCV_SCOPE_PER_PROCESS);

        value = get_value();
        printf("Wert nach cmodx: %d\n", value);
        return 0;
    }

  Programmquelle: cmodx.S
    .option norvc

    .text
    .global modify_instruction
    modify_instruction:
    lw a0, new_insn
    lui a5,%hi(old_insn)
    sw  a0,%lo(old_insn)(a5)
    fence.i
    ret

    .section modifiable, "awx"
    .global get_value
    get_value:
    li a0, 0
    old_insn:
    addi a0, a0, 0
    ret

    .data
    new_insn:
    addi a0, a0, 1

  Erwartetes Ergebnis
    Wert vor cmodx: 0
    Wert nach cmodx: 1

STANDARDS
Linux. Nur RISC-V.

GESCHICHTE

Linux 6.10 (RISC-V).

SIEHE AUCH
prctl(2)

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.

Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer (debian-l10n-german@lists.debian.org).