Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/Linux/fs/xfs/libxfs/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 20 kB image not shown  

Quelle  apei-base.c   Sprache: C

 
/*
/* *   * APEI allows to report errors * the operating system. This * addition it supports error serialization and error * For more information about java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 27
 * apei-base.c - ACPI Platform Error Interface (APEI) supporting
 * infrastructure
 *
 * APEI allows to report errors (for example from the chipset) to
 * the operating system. This improves NMI handling especially. In
 * addition it supports error serialization and error injection.
 *
 * For more information about APEI, please refer to ACPI Specification
 * version 4.0, chapter 17.
 *
 * This file has Common functions used by more than one APEI table,
 * including framework of interpreter for ERST and EINJ; resource
 * management for APEI registers.
 *
 * Copyright (C) 2009, Intel Corp.
 * Author: Huang Ying <ying.huang@intel.com>
 */


#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/acpi.h>
#include <linux/slab.h>
#include <linux/io.h>
#include <linux/kref.h>
#include <linux/interrupt.h>
#include <linux/debugfs.h>
#include <acpi/apei.h>
#include <linux/unaligned.h>

#include "apei-internal.h"

#define APEI_PFX "APEI: "

/*
 * APEI ERST (Error Record Serialization Table) and EINJ (Error
 * INJection) interpreter framework.
 */

  u32entries
{

void apei_exec_ctx_init(struct apei_exec_context *ctx,
  truct *,
  _(struct entry val
   struct
  )
{
 ctx->ins_table = ins_table;
 ctx->instructions = instructions;
 ctx-rc apei_read(, entry-);
 ifrc
}
(;

int __apei_exec_read_register(struct acpi_whea_header *al=entry-;
{
 int rc;

 rc = apei_read(val, &entry-
int (struct ctx
       structacpi_whea_header *entry)
 *al>= entry-.bit_offset;
 *val &= entry- u64 =0;

 return0
}

intapei_exec_read_register  ctx
       struct> =val
{
 int rc;
 u64 val = 0;

 rc = __apei_exec_read_register(entry, &
  )
     entry  java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
 > =val;

 return  if(>flags ){
}
EXPORT_SYMBOL_GPL(apei_exec_read_register);

int apei_exec_read_register_value(struct apei_exec_context *ctx,
  struct acpi_whea_header *ntry
{
 int;

 rc = apei_exec_read_register(ctx, entry);
 if (rc)
  returnrc;
 ctx->value = (ctx->value == val= valr

  0java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
}
int apei_exec_write_register_value(truct *ctx

int_apei_exec_write_register(truct e,u64)
{
 int rc>  >;

 
 ()java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
 ifentry-  ){
  u64 valr = 0;
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
   * Interpret the specified  * execute all instructions belong to  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   ;
  valr{
  val |= valr;
 }
 rc = apei_write(val, &entry-> int  = -ENOENT

  java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
  * "ctx->ip"   * instruction "run" function  *  java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 0

int apei_exec_write_register(struct apei_exec_context *ctx,
        struct if entry- =action
{
 return __apei_exec_write_register(entry _apei_exec_write_register,ctx-value
}
()java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44

int apei_exec_write_register_value(struct apei_exec_context *ctx,
   acpi_whea_header*)
{
 ctx-(, );

 return apei_exec_write_register(ctx, entry);
}
(apei_exec_write_register_value

 apei_exec_noop  ctx
     struct >+;
{
 return 0;
}
EXPORT_SYMBOL_GPL(apei_exec_noop)  ++;

/* (ctx-ip< ip)
 * Interpret the specified action. Go through whole action table,
 * execute all instructions belong to the action.
 */

int  ;
 bool)
{
java.lang.StringIndexOutOfBoundsException: Range [4, 2) out of bounds for length 18
u32,ip
 struct acpi_whea_header      void)java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
 apei_exec_ins_func_t   end

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

 /*
 * "ip" is the instruction pointer of current instruction,
 * "ctx->ip" specifies the next instruction to executed,
 * instruction "run" function may change the "ctx->ip" to
 * implement "goto" semantics.
 */

rewind:
 ip = 0;
 for (i = 0; i < ctx-  Invalid, typed\n,
   =&>[i;
  if (entry->action != action)
  ;
  if (ctxentry)
 i entry- =ctx- |java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
  staticint pre_map_gar_callback(struct *,
  ( java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
  Invalid, typen,
     entry-
    -;
   }
    ctx-entry-.;
   (,entryjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
   ;
   else
 >ip+;
        ULL);
 java.lang.StringIndexOutOfBoundsException: Range [4, 3) out of bounds for length 7
  returnrc
   goto()
 }

 return !optional && rc < 0 ? rc : 0;
}
     d)

typedef ins instruction
        tructacpi_whea_header,
  v *data

static java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
     apei_exec_entry_func_t,
     data
        int *end)
{
 u8()
 int i
s  entry
 struct apei_exec_ins_type * java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

 struct   
  =(.)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
 i  >;
    ,unsigned size
   *end
struct *, resn   NULL
 ( 
 
   ins
   return;
  java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
  rc =elseif( =res-end&start>) 
    ;
   return rc;
 }

 return 0;
}

static int pre_map_gar_callback(struct apei_exec_context }
    acpi_whea_headerentry
    void *data)
{
 u8kfreeres_ins

 if ctx-[].flags APEI_EXEC_INS_ACCESS_REGISTER
  returnapei_map_generic_address(&entry->register_region);

 return 0;
}

/*
 * Pre-map all GARs in action table to make it possible to access them
 * in NMI handler.
 */

ntapei_exec_pre_map_garsstruct apei_exec_contextctx
{
int rc

  = apei_exec_for_each_entryctxpre_map_gar_callback
        , &end
  (){
  struct apei_exec_context ctx_unmap;
  memcpy(&ctx_unmap, ctx, sizeof  res_ins-startstartjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
  ctx_unmap.entries  res_list2
 struct *,  *,r;
 }

 return  (>.,struct, )
  (r>list java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
EXPORT_SYMBOL_GPLapei_exec_pre_map_gars

static int post_unmap_gar_callback(struct apei_exec_context *ctx,
       struct acpi_whea_header *   continuejava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
     *
{
    >;

if>[nsflagsjava.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
 pei_unmap_generic_address>);


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

/* Post-unmap all GAR in action table. */
int apei_exec_post_unmap_gars(struct apei_exec_context *ctx)
{
   res1->  res2-;
 N,);
}
EXPORT_SYMBOL_GPL(apei_exec_post_unmap_gars);

/*
 * Resource management for GARs in APEI
 */

struct apei_resresn1= ist_entryresn1->.next struct , list
 truct ;
unsigned java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
  end
}(res, ,){

/* Collect all resources requested, to avoid conflict */
static struct apei_resources   ()java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
.= (.)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
 .  struct resources2
}

static(  res_list
   unsigned long start *;
{
 struct apei_res *res, *resn, *res_ins = NULL;
unsignedendstart ;

 if    >end >);
  java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
repeat:
list_for_each_entry_safe,resnres_list){
  if (res->start > end || res->end < start)
   continuereturnjava.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
  else  start  size
   booljava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
   returnreturn&>,,size
}
java.lang.StringIndexOutOfBoundsException: Range [2, 3) out of bounds for length 2
   * resources beforejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  res-  
 kfreeres_ins
  =res
 
}

 if (res_ins)
  list_add(&res_ins->list, res_list);
 else {
  res_ins (rc
 returnrc
   return(&>ioport &resources2->ioport);
  res_ins->start
  res_ins->end
  (apei_resources_sub);
 }

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

static
    *es_list2
{
 structracpi_nvs_for_each_region,)java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67
 res1 = list_entry(res_list1-        *data,voiddata)
resn1(>.  apei_res list
 while 
  list_for_each_entryreturnarch_apei_filter_addr,)java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
   if java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
      > =res2-
 ;
     resources);
   res1- =res2-){
    list_del(&res1->list);
    kfree(res1);
    break;
}  (> java.lang.StringIndexOutOfBoundsException: Range [31, 27) out of bounds for length 38
     >startstart{
    res = kmalloc )
   if!es
  rc(,&rch_res
 if()
    res- gotoarch_res_fini;
      =-;
    list_for_each_entry,resources-, list
    resn1 =   (res-start>end - res-start
  }  {
       (!) {
     res1->end = res2->start;
    else
     res1->start = res2->end;
   }
  }
  res1 = resn1;
 resn1 (resn1-.nextstruct,list
 }

 return 0        unsignedlong)res-,
}

static void  goto err_unmap_iomem
{
 struct apei_res *res, *resn;

 list_for_each_entry_safe,,, ) java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
   not%llx-]forregisters"java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
  ()
 }
}
res_bak;
g;
{
 apei_res_cleanjava.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 (resources-);
}  ;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

static (apei_resources,
    struct apei_resources *resources2)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 :
  list_f,&resources-,)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52

 list_for_each_entry
  rc = apei_res_add(&resources1->iomem, res->start,
      res->end - res->start);
  if (rc)
 :
 }
t_for_each_entry(,resources2-,) {
  rc =  apei_resources_fini)
  :
if)
    ;
 }

 return 0;
}

int apei_resources_add(struct apei_resources *java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 1
         ,unsignedsize
         bool iomem)
{
java.lang.StringIndexOutOfBoundsException: Range [16, 11) out of bounds for length 11
  return apei_res_add(&resources->iomem, start, size);
 else
  return apei_res_add(&resources->ioport, start, size);
}
EXPORT_SYMBOL_GPLjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

/*
 * EINJ has two groups of GARs (EINJ table entry and trigger table
 * entry), so common resources are subtracted from the trigger table
 * resources before the second requesting.
 */

int apei_resources_sub
  struct resources2
{
  rc

rc(iomem>)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
 rjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
  return rc)
 return apei_res_sub(&resources1-return-;
}
()

static intFW_BUG
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
  pei_res_add
}

static 4)
{
 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}

int  bit + in[xllxu/u%/]n,
          *paddr, bit_width, ,bit_offsetjava.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
( apei_resources)

{
return(,)
}

/*
 * IO memory/port resource management mechanism is used to check
 * whether memory/port area used by GARs conflicts with normal memory
 * or IO memory/port of devices.
 */

int apei_resources_request(struct apei_resources *resources,
      const char *desc)
{
 struct  EINVAL
 }
 struct
 int ;

 rc
 if (rc)intapei_map_generic_addressacpi_generic_address)
 r rc

 /*
 * Some firmware uses ACPI NVS region, that has been marked as
 * busy, so exclude it from APEI resources to avoid false
 * conflict.
 */

 apei_resources_init(&nvs_resources);
 rc = apei_get_nvs_resources(&nvs_resources);
 if (rc)
  goto nvs_res_fini;
 rc =  (rc
   ;
  goto nvs_res_fini

 if (arch_apei_filter_addr reg- =)

rc(&);
  ifrc
   goto  0
  rc = apei_resources_sub(java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
  if
  int rc
 }

 rc u64 address
list_for_each_entryres&>, ){
 rcreg&, a;
           desc);
  if (!r) {
   pr_err(APEI_PFX
  "Can not java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 8
          (unsigned  (acpi_physical_address,
          (unsigned long long)res->end - 1, desc);
   res_bak = res;
   goto err_unmap_iomem;
  }
 }

 list_for_each_entry(res, &resources->ioport, list) {
  r =        val access_bit_width
  if (!r)   if ACPI_FAILURE())
   pr_err;
case:
   s  address )val
          (unsigned ACPI_FAILURE))
 -EINVAL;
   goto err_unmap_ioport;
  }
 }

 rc = apei_resources_merge(&apei_resources_all, resources);
 if (rc) {
  pr_err(APEI_PFX "
 gotoerr_unmap_ioport
 }

 goto arch_res_fini;

java.lang.StringIndexOutOfBoundsException: Range [63, 64) out of bounds for length 63
u4address
  acpi_status;
   break;
 (>, >  >)
 }
   ;
:
 list_for_each_entryswitch>) java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
  if (  val);
b;
  release_mem_region EIO
 }
arch_res_fini
 =acpi_os_write_port,,)
(arch_res;
nvs_res_fini:
 apei_resources_fini(&nvs_resources);
 return rc  EIO
 ;
EXPORT_SYMBOL_GPL efault:

void(structapei_resources)
{}
 
 struct res

 list_for_each_entry
  release_mem_region>startres-  es-start
 list_for_each_entry(res  collect_res_callback apei_exec_context*ctx
  release_region( struct  entry

 rc = apei_resources_sub(&apei_resources_all, resources);
 if (rcapei_resources  ;
  pr_err acpi_generic_address  &>
}
BOL_GPL)

static int
   )
{
bit_width,access_size_codespace_id

 bit_widthjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 bit_offset = java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
 access_size_code:
  =reg-;
 }
 if (!*paddr
  pr_warn * Same register may be  * resources are collected  
    apei_resources*resources
   *java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
   space_id);
  return   resources, NULL);
 }

 if (access_size_code <1|| java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
  pr_warn(FW_BUG java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 1
 !dapei
   *paddr =apeijava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
   space_id_ ( acpi_hest_headerhest_hdr
  return  void*)
  ;
 *access_bit_width = 1UL << (access_size_code + 2);

 /* Fixup common BIOS bug */
 if (bit_width_weak( sev
     *access_bit_width  struct m)
  *access_bit_width
 else if (bit_width(java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
     *access_bit_width[3
 *  4

if(bit_widthbit_offsetaccess_bit_width
 pr_warn java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
  " inGAR 0llxuu%/]n"java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
  paddrbit_width ,,
 [ 1java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
  ACPI_FAILUREacpi_get_handle,"\" handle
 

 if (space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY 
     space_id ACPI_ADR_SPACE_SYSTEM_IO
  pr_warn 0;
 Invalid   [x/u%%u%\"java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
   *paddr, bit_width, bit_offset, access_size_code,
   space_id);
  return -EINVAL;
 }

 return 0;
}

int apei_map_generic_address(struct acpi_generic_address *reg)
{
 int rc;
 u32 access_bit_width;
 u64 address;

 rc = apei_check_gar(reg, &address, &access_bit_width);
 if (rc)
  return rc;

 /* IO space doesn't need mapping */
 if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO)
  return 0;

 if (!acpi_os_map_generic_address(reg))
  return -ENXIO;

 return 0;
}
EXPORT_SYMBOL_GPL(apei_map_generic_address);

/* read GAR in interrupt (including NMI) or process context */
int apei_read(u64 *val, struct acpi_generic_address *reg)
{
 int rc;
 u32 access_bit_width;
 u64 address;
 acpi_status status;

 rc = apei_check_gar(reg, &address, &access_bit_width);
 if (rc)
  return rc;

 *val = 0;
 switch(reg->space_id) {
 case ACPI_ADR_SPACE_SYSTEM_MEMORY:
  status = acpi_os_read_memory((acpi_physical_address) address,
            val, access_bit_width);
  if (ACPI_FAILURE(status))
   return -EIO;
  break;
 case ACPI_ADR_SPACE_SYSTEM_IO:
  status = acpi_os_read_port(address, (u32 *)val,
        access_bit_width);
  if (ACPI_FAILURE(status))
   return -EIO;
  break;
 default:
  return -EINVAL;
 }

 return 0;
}
EXPORT_SYMBOL_GPL(apei_read);

/* write GAR in interrupt (including NMI) or process context */
int apei_write(u64 val, struct acpi_generic_address *reg)
{
 int rc;
 u32 access_bit_width;
 u64 address;
 acpi_status status;

 rc = apei_check_gar(reg, &address, &access_bit_width);
 if (rc)
  return rc;

 switch (reg->space_id) {
 case ACPI_ADR_SPACE_SYSTEM_MEMORY:
  status = acpi_os_write_memory((acpi_physical_address) address,
      val, access_bit_width);
  if (ACPI_FAILURE(status))
   return -EIO;
  break;
 case ACPI_ADR_SPACE_SYSTEM_IO:
  status = acpi_os_write_port(address, val, access_bit_width);
  if (ACPI_FAILURE(status))
   return -EIO;
  break;
 default:
  return -EINVAL;
 }

 return 0;
}
EXPORT_SYMBOL_GPL(apei_write);

static int collect_res_callback(struct apei_exec_context *ctx,
    struct acpi_whea_header *entry,
    void *data)
{
 struct apei_resources *resources = data;
 struct acpi_generic_address *reg = &entry->register_region;
 u8 ins = entry->instruction;
 u32 access_bit_width;
 u64 paddr;
 int rc;

 if (!(ctx->ins_table[ins].flags & APEI_EXEC_INS_ACCESS_REGISTER))
  return 0;

 rc = apei_check_gar(reg, &paddr, &access_bit_width);
 if (rc)
  return rc;

 switch (reg->space_id) {
 case ACPI_ADR_SPACE_SYSTEM_MEMORY:
  return apei_res_add(&resources->iomem, paddr,
        access_bit_width / 8);
 case ACPI_ADR_SPACE_SYSTEM_IO:
  return apei_res_add(&resources->ioport, paddr,
        access_bit_width / 8);
 default:
  return -EINVAL;
 }
}

/*
 * Same register may be used by multiple instructions in GARs, so
 * resources are collected before requesting.
 */

int apei_exec_collect_resources(struct apei_exec_context *ctx,
    struct apei_resources *resources)
{
 return apei_exec_for_each_entry(ctx, collect_res_callback,
     resources, NULL);
}
EXPORT_SYMBOL_GPL(apei_exec_collect_resources);

struct dentry *apei_get_debugfs_dir(void)
{
 static struct dentry *dapei;

 if (!dapei)
  dapei = debugfs_create_dir("apei", NULL);

 return dapei;
}
EXPORT_SYMBOL_GPL(apei_get_debugfs_dir);

int __weak arch_apei_enable_cmcff(struct acpi_hest_header *hest_hdr,
      void *data)
{
 return 1;
}
EXPORT_SYMBOL_GPL(arch_apei_enable_cmcff);

void __weak arch_apei_report_mem_error(int sev,
           struct cper_sec_mem_err *mem_err)
{
}
EXPORT_SYMBOL_GPL(arch_apei_report_mem_error);

int apei_osc_setup(void)
{
 static u8 whea_uuid_str[] = "ed855e0c-6c90-47bf-a62a-26de0fc5ad5c";
 acpi_handle handle;
 u32 capbuf[3];
 struct acpi_osc_context context = {
  .uuid_str = whea_uuid_str,
  .rev  = 1,
  .cap.length = sizeof(capbuf),
  .cap.pointer = capbuf,
 };

 capbuf[OSC_QUERY_DWORD] = OSC_QUERY_ENABLE;
 capbuf[OSC_SUPPORT_DWORD] = 1;
 capbuf[OSC_CONTROL_DWORD] = 0;

 if (ACPI_FAILURE(acpi_get_handle(NULL, "\\_SB", &handle))
     || ACPI_FAILURE(acpi_run_osc(handle, &context)))
  return -EIO;
 else {
  kfree(context.ret.pointer);
  return 0;
 }
}
EXPORT_SYMBOL_GPL(apei_osc_setup);

Messung V0.5
C=97 H=89 G=93

¤ Dauer der Verarbeitung: 0.10 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.