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


Quelle  disable-tsc-test.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...)
 *
 * Basic test to test behaviour of PR_GET_TSC and PR_SET_TSC
 */


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <inttypes.h>


#include <sys/prctl.h>
#include <linux/prctl.h>

/* Get/set the process' ability to use the timestamp counter instruction */
#ifndef PR_GET_TSC
#define PR_GET_TSC 25
#define PR_SET_TSC 26
define PR_TSC_ENABLE  1   /* allow the use of the timestamp counter */
define PR_TSC_SIGSEGV  2   /* throw a SIGSEGV instead of reading the TSC */
#endif

const char *tsc_names[] =
{
 [0] = "[not set]",
 [PR_TSC_ENABLE] = "PR_TSC_ENABLE",
 [PR_TSC_SIGSEGV] = "PR_TSC_SIGSEGV",
};

static uint64_t rdtsc(void)
{
uint32_t lo, hi;
/* We cannot use "=A", since this would use %rax on x86_64 */
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return (uint64_t)hi << 32 | lo;
}

static void sigsegv_cb(int sig)
{
 int tsc_val = 0;

 printf("[ SIG_SEGV ]\n");
 printf("prctl(PR_GET_TSC, &tsc_val); ");
 fflush(stdout);

 if ( prctl(PR_GET_TSC, &tsc_val) == -1)
  perror("prctl");

 printf("tsc_val == %s\n", tsc_names[tsc_val]);
 printf("prctl(PR_SET_TSC, PR_TSC_ENABLE)\n");
 fflush(stdout);
 if ( prctl(PR_SET_TSC, PR_TSC_ENABLE) == -1)
  perror("prctl");

 printf("rdtsc() == ");
}

int main(void)
{
 int tsc_val = 0;

 signal(SIGSEGV, sigsegv_cb);

 printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
 printf("prctl(PR_GET_TSC, &tsc_val); ");
 fflush(stdout);

 if ( prctl(PR_GET_TSC, &tsc_val) == -1)
  perror("prctl");

 printf("tsc_val == %s\n", tsc_names[tsc_val]);
 printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
 printf("prctl(PR_SET_TSC, PR_TSC_ENABLE)\n");
 fflush(stdout);

 if ( prctl(PR_SET_TSC, PR_TSC_ENABLE) == -1)
  perror("prctl");

 printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
 printf("prctl(PR_SET_TSC, PR_TSC_SIGSEGV)\n");
 fflush(stdout);

 if ( prctl(PR_SET_TSC, PR_TSC_SIGSEGV) == -1)
  perror("prctl");

 printf("rdtsc() == ");
 fflush(stdout);
 printf("%llu\n", (unsigned long long)rdtsc());
 fflush(stdout);

 exit(EXIT_SUCCESS);
}


Messung V0.5
C=96 H=98 G=96

¤ Dauer der Verarbeitung: 0.3 Sekunden  ¤

*© 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