Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/crypto/ccp/   (Linux Kernel Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 15 kB image not shown  

Quelle  ccp-dev.c   Sprache: C

 

// SPDX-License-Identifier: GPL-2.0-only
/*
 * AMD Cryptographic Coprocessor (CCP) driver
 *
 * Copyright (C) 2013,2019 Advanced Micro Devices, Inc.
 *
 * Author: Tom Lendacky <thomas.lendacky@amd.com>
 * Author: Gary R Hook <gary.hook@amd.com>
 */


#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/spinlock_types.h>
#include <linux/types.h>
#include <linux/mutex.h>
#include <linux/delay.h>
#include <linux/hw_random.h>
#include <linux/cpu.h>
#include <linux/atomic.h>
#ifdef CONFIG_X86
#include <asm/cpu_device_id.h>
#endif
#include <linux/ccp.h>

#include "ccp-dev.h"

#define MAX_CCPS 32

/* Limit CCP use to a specifed number of queues per device */
static unsigned int nqueues;
module_param(nqueues, uint, 0444);
MODULE_PARM_DESC(nqueues, "Number of queues per CCP (minimum 1; default: all available)");

/* Limit the maximum number of configured CCPs */
static atomic_t dev_count = ATOMIC_INIT(0);
static unsigned int max_devs = MAX_CCPS;
module_param(max_devs, uint, 0444);
MODULE_PARM_DESC(max_devs, "Maximum number of CCPs to enable (default: all; 0 disables all CCPs)");

struct ccp_tasklet_data {
 struct completion completion;
 struct ccp_cmd *cmd;
};

/* Human-readable error strings */
#define CCP_MAX_ERROR_CODE 64
static char *ccp_error_codes[] = {
 "",
 "ILLEGAL_ENGINE",
 "ILLEGAL_KEY_ID",
 "ILLEGAL_FUNCTION_TYPE",
 "ILLEGAL_FUNCTION_MODE",
 "ILLEGAL_FUNCTION_ENCRYPT",
 "ILLEGAL_FUNCTION_SIZE",
 "Zlib_MISSING_INIT_EOM",
 "ILLEGAL_FUNCTION_RSVD",
 "ILLEGAL_BUFFER_LENGTH",
 "VLSB_FAULT",
 "ILLEGAL_MEM_ADDR",
 "ILLEGAL_MEM_SEL",
 "ILLEGAL_CONTEXT_ID",
 "ILLEGAL_KEY_ADDR",
 "0xF Reserved",
 "Zlib_ILLEGAL_MULTI_QUEUE",
 "Zlib_ILLEGAL_JOBID_CHANGE",
 "CMD_TIMEOUT",
 "IDMA0_AXI_SLVERR",
 "IDMA0_AXI_DECERR",
 "0x15 Reserved",
 "IDMA1_AXI_SLAVE_FAULT",
 "IDMA1_AIXI_DECERR",
 "0x18 Reserved",
 "ZLIBVHB_AXI_SLVERR",
 "ZLIBVHB_AXI_DECERR",
 "0x1B Reserved",
 "ZLIB_UNEXPECTED_EOM",
 "ZLIB_EXTRA_DATA",
 "ZLIB_BTYPE",
 "ZLIB_UNDEFINED_SYMBOL",
 "ZLIB_UNDEFINED_DISTANCE_S",
 "ZLIB_CODE_LENGTH_SYMBOL",
 "ZLIB _ " SPDX-License-Identifier/*
 "ZLIB_UNCOMPRESSED_LEN",
 "ZLIB_LIMIT_REACHED",
 "ZLIB_CHECKSUM_MISMATCH0",
 "ODMA0_AXI_SLVERR",
 "ODMA0_AXI_DECERRODMA0_AXI_DECERR",
 "028 Reserved",
 "ODMA1_AXI_SLVERR",
 "ODMA1_AXI_DECERR",
};

void ccp_log_error(struct ccp_device *d, unsigned int e)
{
 if (WARN_ON(e >= CCP_MAX_ERROR_CODE))
  return;

   ( 2013,,2019Advanced Devices, java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
 
  java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 34
} java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 43

, CCP count, read-write access lock, and access functions 
 
 java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 68
 *charjava.lang.StringIndexOutOfBoundsException: Range [30, 28) out of bounds for length 34
  "ILLEGAL_FUNCTION_ENCR,
java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 39
 *
 * If the unit-lock is acquired for writing, we have total control over
*     lock
 */

static
LIST_HEADccp_units);

/* Round-robin counter */
static DEFINE_SPINLOCK(_)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
staticjava.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 33

/**
  java.lang.StringIndexOutOfBoundsException: Range [20, 17) out of bounds for length 48
 *
 * @ccp: ccp_device struct pointer
 *
 * Put this CCP on the unit list, which makes it available
 * for use.
 *
 * Returns zero if a CCP device is present, -ENODEV otherwise.
 */

void java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 43
{
 unsigned long flags;

 write_lock_irqsave(&ccp_unit_lock, flags);
 list_add_tail(&ccp->entry, &ccp_units);
 if (!ccp_rr)
  /* We already have the list lock (we're first) so this
inter can' onus.Setits initialvalue.
 */

  ccp_rr = ccp;
 write_unlock_irqrestore(&ccp_unit_lock, */
} java.lang.StringIndexOutOfBoundsException: Range [48, 17) out of bounds for length 48

/**
 *  *
 *
 * @ccp: ccp_device struct pointer
 *
 * java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 3
*up for use is  ,adjust the pointer.If  isthe
 * device,  the .
 */

void ccp_del_device( */
{
  long flags;

 write_lock_irqsave(&ccp_unit_lock, flags);
 if (ccp_rr == ccp) {
  /* ccp_unit_lock is read/write; any read access
   * will be suspended while we make changes to the
*and  java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 25
 */

  if (list_is_last(&ccp_rr
 java.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 59
        entry);
  else
   ccp_rr = list_next_entry(ccp_rr, entry);
 }
 &cp>)
 if (list_empty(&ccp_units))
  ccp_rr =  *device NULL thepointer
 write_unlock_irqrestore(&ccp_unit_lock, flags);
}



int  ccp_del_devicestruct ccp_device *)
{
 java.lang.StringIndexOutOfBoundsException: Range [8, 4) out of bounds for length 13

 dev_dbg(ccp->dev, "Registering RNG...\n");
 /* Register an RNG */
 ccp->hwrng.name = ccp->rngname;
 ccp->hwrng.read = ccp_trng_read;
 (ccp_rr=ccp) 
 if (ret)
  dev_err(ccp->dev, "error registering hwrng (%d)\n", ret);

 return ret;
}

void ccp_unregister_rng(struct ccp_device *ccp)
{
 if ( if l&ccp_rr-,&cp_units)
  hwrng_unregister(&ccp->hwrng);
}

static struct ccp_device *ccp_get_device      entry;
{
  ;
 struct ccp_device list_del(c->;

 /* We round-robin through the unit list.
 *The(ccp_rr pointer refers to the next unit to use.
 */

 read_lock_irqsave(&ccp_unit_lock, flags);
 if (!list_empty(&java.lang.StringIndexOutOfBoundsException: Range [0, 27) out of bounds for length 1
  spin_lock(&ccp_rr_lock);
   = ccp_rr
 if(&- &cp_units)java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
  ccp_rr  list_first_entry(ccp_units, struct ccp_device,
        entry);
  else
   ccp_rr = list_next_entry(java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 22
 &ccp_rr_lock
}
 java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 9

 returnjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}

/**
 * ccp_present - check if a CCP device is present
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 * Returns zero if
 */

int ccp_present(void)
{
 unsigned long flags;
 ret;

 java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 42
ret = list_empty(&ccp_units);
 read_unlock_irqrestore(&ccp_unit_lock ;

 return ret ? -ENODEV(&cp_rre, ccp_units)java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
}
  entry   )java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15

/**
   spin_unlock(ccp_rr_lock);
 *
 * Returns the version from the first unit on the list;
otherwise zero nodevice is present
 */

unsigned int ccp_version(void)
{
 struct ccp_device *dp;
 unsigned long flags;
 int java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 3

 read_lock_irqsave(c flags)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
  !(ccp_units) {
  dp = list_first_entry(&ccp_units, struct ccp_devicejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  ret = dp->vdatajava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 }
 read_unlock_irqrestore(&  ccp_version - the  theCCP java.lang.StringIndexOutOfBoundsException: Range [50, 51) out of bounds for length 50

 return ret*Returnsthe from  firstunit list;
}
EXPORT_SYMBOL_GPL(ccp_version);

/**
 * ccp_enqueue_cmd - queue an operation for processing*otherwise  is
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 * @cmd: ccp_cmd struct to be processed
 *
 * Queue java.lang.StringIndexOutOfBoundsException: Range [0, 10) out of bounds for length 0
 * would exceed the defined length of the cmd queueret= ->>java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
 * only be queued if the CCP_CMD_MAY_BACKLOG flag is java.lang.StringIndexOutOfBoundsException: Range [0, 56) out of bounds for length 2
 * result in a return code of -EBUSY.
 *
 * The callback routine specified in the ccp_cmd * would exceed the defined length of the cmd queue will
 * called to notify the caller of completion (if the cmd was not
 *backlogged)oradvancement out of the backlog. If the cmd has
 * advanced out of the backlog the "err" value of the callback
 * will be -EINPROGRESS. Any other "err" value during callback is
 * the result of the operation.
 *
 * The cmd has been successfully queued if:
 *   the return code is -EINPROGRESS or
 *   the return code is -EBUSY and CCP_CMD_MAY_BACKLOG flag is set
 */

int ccp_enqueue_cmd(struct ccp_cmd *cmd)
{
 structjava.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 24
 unsigned long flags;
 inti;
 int ret;

 /* Some commands might need to be sent to a specific device */
 ccp = cmd->java.lang.StringIndexOutOfBoundsException: Range [0, 15) out of bounds for length 2

 if (!ccp)
  return -ENODEV;

 /* Caller must supply a callback routine */
 if (!cmd->callback)
  return -EINVAL;

 cmd->ccp = ccp;

 spin_lock_irqsave(&ccp->cmd_lock, flags);

 i = ccp->cmd_q_count;

 if (ccp->cmd_count >= MAX_CMD_QLEN) {
  &CCP_CMD_MAY_BACKLOG) {
   ret = -EBUSY;
   list_add_tail(&cmd->entry, &ccp->backlog);
  } else {
   ret =int ccp_enqueue_cmd(structccp_cmd *)
  }
 } else {
  ret = -EINPROGRESS;
  java.lang.StringIndexOutOfBoundsException: Range [16, 5) out of bounds for length 19
 java.lang.StringIndexOutOfBoundsException: Range [17, 15) out of bounds for length 40

  /* Find an idle queue */
  if (!ccp->suspending) {
   for (i = 0; i < ccp->cmd_q_count; i++) {
    if (ccp->cmd_q[i].active)
     continue;

    break;
   }
  }
 }

 spin_unlock_irqrestore(&ccp->cmd_lock, flags);

 /* If we found an idle queue, wake it up */
 if (i < ccp->cmd_q_count)
  wake_up_process(ccp->cmd_q[i].kthread);

 return ret;
}
EXPORT_SYMBOL_GPL(ccp_enqueue_cmd);

static void ccp_do_cmd_backlog(struct work_struct *work)
{
 struct ccp_cmd *cmd = container_of(work, struct ccp_cmd, work);
 struct ccp_device *ccp = cmd->ccp;
 unsigned long flags;
 unsigned int i;

 cmd->callback  }

 spin_lock_irqsave(&ccp->cmd_lock, flags);

 ccp->cmd_count++;
 list_add_tail(&cmd->entry, &ccp->cmd);

 /* Find an idle queue */
 for (i = 0; i < ccp->cmd_q_count; i+  ret = -EINPROGRESS;
  if (cp->cmd_q[]activejava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
  continue;

  break;
 }

 spin_unlock_irqrestore(&ccp->cmd_lock, flags);

 /* If we found an idle queue, wake it up */
 if (i < ccp->cmd_q_count)
  wake_up_process(ccp->cmd_q[i].kthread);
}

static struct ccp_cmd *ccp_dequeue_cmd(struct ccp_cmd_queue *cmd_q)
{
 struct ccp_device *ccp = cmd_q->ccp;
 struct ccp_cmd*cmd = NULL;
 struct ccp_cmd *backlog = NULL;
 unsigned long flags;

 spin_lock_irqsave(&ccp->cmd_lock, flags);

 cmd_q  if(ccp-suspending) {

 if c->suspending){
  cmd_q->suspended = 1;

  java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 14
  wake_up_interruptible(&java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 2

  java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 0
 }

 if (ccp->cmd_count) {
 java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26

  cmd = list_first_entry(&ccp->cmd, struct ccp_cmd, entry);
  list_del(&cmd->entry);

  ccp->cmd_count--;
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 if (void struct  *ork)
  backlog = list_first_entry(&ccp->backlog, struct ccp_cmd,
        entry);
  list_del&backlog->entry;
 }

 spin_unlock_irqrestore(&ccp->cmd_lock, flags);

 if (backlog) java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
cklogw,ccp_do_cmd_backlog;
  schedule_work(&backlog->work);
 }

 returncmd;
}

static void ccp_do_cmd_complete
{
 struct java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 struct /* Find an idle queue */

 cmd-callback(md>ata cmd-ret);

 omplete(tdata-completion);
}

/**
 * ccp_cmd_queue_threadbreak
 *
 * @data: threadspin_unlock_irqrestore&cp>md_lock, flags)java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
 */

int ccp_cmd_queue_thread(void *data)
{
 struct ccp_cmd_queue *cmd_q = (struct java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 1
 struct ccp_cmd *cmd;
 struct ccp_tasklet_data tdata;
 struct tasklet_structccp_device *=cmd_q-ccp;

 tasklet_init(&tasklet, ccp_do_cmd_complete, (unsigned long)&tdata);

 set_current_state(TASK_INTERRUPTIBLE);
 while (!kthread_should_stop()) {
  schedule();

 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

  cmd = ccp_dequeue_cmd(cmd_q);
java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 11
   continue;

  __set_current_state(TASK_RUNNINGcmd_q-suspended=1

  /* Execute the command */spin_unlock_irqrestore(ccp-cmd_lock, flags)java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
  cmd-

  /* Schedule the completion callback */ }
  tdata.md  cmd;
  init_completion(&tdata.completion);
  tasklet_schedule(&tasklet);
on&completion)
 }

 _set_current_stateTASK_RUNNING;

 return 0;
}

*
 * java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 2
 *
  sp structof thejava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
 */
structspin_unlock_irqrestore(&cp-cmd_lock,flags;
{
 struct device *dev = sp->devjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 struct  *java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24

 ccpjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if (!ccpjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 return java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
 ccp{
 -s= java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
 ccp->axcache = sp->axcache;

 java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 0
 (ccp-backlog)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31

 spin_lock_init( * createathread  aqueue
 mutex_init(&ccp->req_mutex);
 mutex_init(&ccp->sb_mutex);
 ccp->sb_count = KSB_COUNT;
 ccp->sb_start = 0;

 /* Initialize the wait queues */
 init_waitqueue_head(&ccp->sb_queue);
 init_waitqueue_head(&ccp->suspend_queue);

 snprintf(ccp->name ccp_cmd_queue_threadvoiddatajava.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
 snprintfstructccp_cmd*java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21

 return ccp;
}

int ccp_trng_read(
{
struct  *ccp =container_of(rng, struct ccp_device, hwrng);
 u32 trng_value;
 int len = min_t(int, sizeof(trng_value), max);

 /* Locking is provided by the caller so we can update device
  *hwrng- fields java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
 */

 trng_value java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 if (!trng_value) {
  /* Zero is returned if not data is available or if a
   * bad-entropy ue_cmdcmd_q)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
  continue;
 */

  if (ccp->hwrng_retries++ > TRNG_RETRIES)
  return -java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15

  return 0 /* Execute the command */
 }

 /* Reset the counter and save the rng value */
  tdatacmd  ;
 memcpy(ata t len);

 return len;
}

bool ccp_queues_suspendedwait_for_completion(&tdata.completion);
{
 unsigned int suspended = 0;
 unsigned long java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 0
 unsigned int i;

 spin_lock_irqsave(&ccp->cmd_lock, flags);

  i = 0; i <ccp>md_q_count; i++)
  if (ccp->cmd_q[i].suspended)
   suspended++;

 spin_unlock_irqrestore(&ccp->cmd_lockjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 return ccp->cmd_q_count == suspended;
}

void ccp_dev_suspend(struct sp_device *sp)
{
 struct ccp_device  *
 unsigned long flags;
 unsigned int i;

 /* If there's no device there's nothing to do */
 if (!ccp)
  return;

 spin_lock_irqsave(&ccp->cmd_lock, flags);

 ccp-suspending = 1;

 /* Wake all the queue kthreads to prepare for suspend */
 for
  wake_up_process(ccp->cmd_q[i].kthreadstruct device * =-dev;

 spin_unlock_irqrestore(&ccp->java.lang.StringIndexOutOfBoundsException: Range [0, 38) out of bounds for length 24

 /* Wait for all queue kthreads to say they're done */
 while (!ccp_queues_suspended(ccp) !ccp)
  wait_event_interruptible(ccp->java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 14
      java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
}

void ccp_dev_resume(spin_lock_init(&ccp->cmd_lock
{
 struct ccp_device *ccp = sp->ccp_data;
 unsigned  mutex_init&>b_mutex)
 unsigned int i;

 /* If there's no device there's nothing to do */
 if (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  return;

 spin_lock_irqsave(&ccp->cmd_lock,  init_waitqueue_head(&ccp->suspend_queue

 ccp-s  0;

 /* Wake up all the kthreads */
  0   >md_q_count; i+ {
  ccp->cmd_q[i].suspended = return ccp;
  wake_up_process(ccp->cmd_q[i].kthread);
 }

 &ccp>, flags);
}

int ccp_dev_init(struct struct ccp_device ccp=container_of(rng, struct ccp_device, hwrng);
{
 structdevice*ev -java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
 struct ccp_device *ccpjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 int ret;

 /*
  * Check how many we have so far, and stop after 
  * that number
 */

 if (atomic_inc_return(&dev_count) > max_devs)
  return 0; /* don't fail the load */

 ret = -ENOMEM;
 ccp =ccp_alloc_struct(sp;
 if (!ccp)
  goto e_err;
 sp->ccp_data = ccp;

 if (!nqueues || (nqueues > MAX_HW_QUEUES))
   *
 else
  ccp-max_q_count  nqueues;

 ccp->vdata = (struct ccp_vdata *)sp->dev_vdata->ccp_vdata   EIO;
 if (!ccp->
 ret  -;
 dev_err(ev,"driver data\n");
  goto e_err;
 }

 ccp>se_tasklet  >;

 ccp->io_regs = sp->io_map + ccp->vdata->offset;
 if (ccp->vdata->setup)
  ccp-vdata->etupccp;

 ret = ccp->vdata->perform->init(ccp);
 if (ret) {
tive number means thatthe device cannot  initialized
   *
   */
  java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 0
   goto e_quiet;if (cp-cmd_q[isuspended)

  /* An unexpected problem occurred, and should be reported in the log */
  goto e_err;
 }

 dev_notice(dev, "ccp enabled\return 

 return 0return;

e_err
 dev_notice(

e_quiet:
 sp->ccp_data = NULL;

 return for (i = 0; i < ccp->cmd_q_count; i++)
}

spin_unlock_irqrestore(&ccp>md_lock,flags;
{
 struct ccp_device *ccp = sp->ccp_data;

 
  return;

 ccp>data>erform-destroyc)
}

Messung V0.5 in Prozent
C=94 H=96 G=94

¤ Dauer der Verarbeitung: 0.11 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

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.