Certification of an Instruction Set Simulator

Cette these expose nos travaux de certification d'une partie d'un programme C/C++ nomme SimSoC (Simulation of System on Chip), qui simule le comportement d'archi- tectures basees sur des processeurs tels que ARM, PowerPC, MIPS ou SH4. Un simulateur de System on Chip peut etre utilise pour developper le logiciel d'un systeme embarque specifique, afin de raccourcir les phases des developpement et de test, en particulier quand la vitesse de simulation est realiste (environ 100 millions d'instructions par seconde par cœur dans le cas de SimSoC). Les reductions de temps et de cout de developpement obtenues se traduisent par des cycles de conception interactifs et rapides, en evitant la lourdeur d'un systeme de developpement materiel. SimSoC est un logiciel complexe, comprenant environ 60 000 de C++, integrant des parties ecrites en SystemC et des optimisations non triviales pour atteindre une grande vitesse de simulation. La partie de SimSoC dediee au processeur ARM, l'un des plus repandus dans le domaine des SoC, transcrit les informations contenues dans un manuel epais de plus de 1000 pages. Les erreurs sont inevitables a ce niveau de complexite, et certaines sont passees au travers des tests intensifs effectues sur la version precedente de SimSoC pour l'ARMv5, qui reussissait tout de meme a simuler l'amorcage complet de linux. Un probleme critique se pose alors : le simulateur simule-t-il effectivement le materiel reel ? Pour apporter des elements de reponse positifs a cette question, notre travail vise a prouver la correction d'une partie significative de SimSoC, de sorte a augmenter la confiance de l'utilisateur en ce similateur notamment pour des systemes critiques. Nous avons concentre nos efforts sur un composant particulierement sensible de SimSoC : le simulateur du jeu d'instructions de l'ARMv6, faisant partie de la version actuelle de SimSoC. Les approches basees sur une semantique axiomatique (logique de Hoare par exemple) sont les plus repandues en preuve de programmes imperatifs. Cependant, nous avons prefere essayer une approche moins classique mais plus directe, basee sur la semantique operationnelle de C : cela etait rendu possible en theorie depuis la formalisation en Coq d'une telle semantique au sein du projet CompCert et mettait a notre disposition toute la puissance de Coq pour gerer la complexitite de la specification. A notre connaissance, au dela de la certification d'un simulateur, il s'agit de la premiere experience de preuve de correction de programmes C a cette echelle basee sur la semantique operationnelle. Nous definissons une representation du jeu d'instruction ARM et de ses modes d'adressage formalisee en Coq, grâce a un generateur automatique prenant en entree le pseudo-code des instructions issu du manuel de reference ARM. Nous generons egale- ment l'arbre syntaxique abstrait CompCert du code C simulant les memes instructions au sein de Simlight, une version allegee de SimSoC. A partir de ces deux representations Coq, nous pouvons enoncer et demontrer la correction de Simlight, en nous appuyant sur la semantique operationnelle definie dans CompCert. Cette methodologie a ete appliquee a au moins une instruction de chaque categorie du jeu d'instruction de l'ARM. Au passage, nous avons ameliore la technologie disponible en Coq pour effectuer des inversions, une forme de raisonnement utilisee intensivement dans ce type de situation.

[1]  David Delahaye,et al.  A Tactic Language for the System Coq , 2000, LPAR.

[2]  Conor McBride,et al.  Inverting Inductively Defined Relations in LEGO , 1996, TYPES.

[3]  Xavier Leroy,et al.  Formal Verification of a C-like Memory Model and Its Uses for Verifying Program Transformations , 2008, Journal of Automated Reasoning.

[4]  Claude Marché,et al.  The Why/Krakatoa/Caduceus Platform for Deductive Program Verification , 2007, CAV.

[5]  James R. Larus,et al.  Facile: a language and compiler for high-performance processor simulators , 2001, PLDI '01.

[6]  Christian Pichler,et al.  Generating an Efficient Instruction Set Simulator from a Complete Property Suite , 2009, 2009 IEEE/IFIP International Symposium on Rapid System Prototyping.

[7]  Jianwen Zhu,et al.  A retargetable micro-architecture simulator , 2003, DAC '03.

[8]  Rainer Leupers,et al.  Generation of interpretive and compiled instruction set simulators , 1999, Proceedings of the ASP-DAC '99 Asia and South Pacific Design Automation Conference 1999 (Cat. No.99EX198).

[9]  Xavier Leroy,et al.  The CompCert C verified compiler: Documentation and user’s manual , 2015 .

[10]  Michael Norrish,et al.  seL4: formal verification of an OS kernel , 2009, SOSP '09.

[11]  Sharad Malik,et al.  A formal concurrency model based architecture description language for synthesis of software development tools , 2004, LCTES '04.

[12]  Nikil D. Dutt,et al.  A retargetable framework for instruction-set architecture simulation , 2006, TECS.

[13]  Magnus O. Myreen,et al.  A Trustworthy Monadic Formalization of the ARMv7 Instruction Set Architecture , 2010, ITP.

[14]  Cristina Cornes,et al.  Automating Inversion of Inductive Predicates in Coq , 1995, TYPES.

[15]  Wilmer Ricciotti,et al.  Theoretical and implementation aspects in the mechanization of the metatheory of programming languages , 2011 .

[16]  Jean-François Monin,et al.  Designing a CPU model: from a pseudo-formal document to fast code , 2011, ArXiv.

[17]  Xavier Leroy,et al.  Formal verification of a realistic compiler , 2009, CACM.

[18]  Rainer Leupers,et al.  A universal technique for fast and flexible instruction-set architecture simulation , 2002, IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems.

[19]  Joseph Tassarotti,et al.  RockSalt: better, faster, stronger SFI for the x86 , 2012, PLDI.

[20]  Jean-François Monin,et al.  Handcrafted Inversions Made Operational on Operational Semantics , 2013, ITP.

[21]  Georges Gonthier,et al.  Engineering mathematics: the odd order theorem proof , 2013, POPL.

[22]  Paolo Herms,et al.  Certification of a Tool Chain for Deductive Program Verification. (Certification d'une chaine de vérification déductive de programmes) , 2013 .

[23]  Benjamin Monate,et al.  A Value Analysis for C Programs , 2009, 2009 Ninth IEEE International Working Conference on Source Code Analysis and Manipulation.

[24]  Bishop Brock,et al.  ACL2 Theorems About Commercial Microprocessors , 1996, FMCAD.

[25]  Peter J. Stuckey,et al.  Monadic constraint programming , 2009, Journal of Functional Programming.

[26]  Warren A. Hunt FM8501: A Verified Microprocessor , 1994, Lecture Notes in Computer Science.

[27]  Stefano Berardi,et al.  Types for proofs and programs : International Workshop TYPES '95, Torino, Italy, June 5-8, 1995 : selected papers , 1996 .

[28]  James McKinna,et al.  Why dependent types matter , 2006, POPL '06.

[29]  Vikram S. Adve,et al.  LLVM: a compilation framework for lifelong program analysis & transformation , 2004, International Symposium on Code Generation and Optimization, 2004. CGO 2004..

[30]  Frank Ghenassia,et al.  Transaction Level Modeling with SystemC , 2005 .

[31]  J. Monin Proof Trick: Small Inversions , 2010 .

[32]  Inria Paris-Rocquencourt,et al.  The CompCert C verified compiler , 2015 .

[33]  Chun-Kun,et al.  Lecture Note Sel4: Formal Verification of an Os Kernel , 2022 .

[34]  Robert S. Boyer,et al.  Automated proofs of object code for a widely used microprocessor , 1996, JACM.

[35]  François Bobot,et al.  Why3: Shepherd Your Herd of Provers , 2011 .

[36]  Flemming Nielson,et al.  Semantics with applications - a formal introduction , 1992, Wiley professional computing.

[37]  Frank Ghenassia Transaction-Level Modeling with SystemC: TLM Concepts and Applications for Embedded Systems , 2010 .

[38]  Daniel D. Gajski,et al.  A retargetable, ultra-fast instruction set simulator , 1999, Design, Automation and Test in Europe Conference and Exhibition, 1999. Proceedings (Cat. No. PR00078).

[39]  Brian Campbell,et al.  An Executable Semantics for CompCert C , 2012, CPP.

[40]  Pierre Castéran,et al.  Interactive Theorem Proving and Program Development , 2004, Texts in Theoretical Computer Science An EATCS Series.

[41]  Warren A. Hunt,et al.  Automated Code Proofs on a Formal Model of the X86 , 2013, VSTTE.

[42]  Xavier Leroy,et al.  Coinductive big-step operational semantics , 2006, Inf. Comput..

[43]  Fabrice Bellard,et al.  QEMU, a Fast and Portable Dynamic Translator , 2005, USENIX ATC, FREENIX Track.

[44]  Yves Bertot,et al.  Interactive Theorem Proving and Program Development: Coq'Art The Calculus of Inductive Constructions , 2010 .

[45]  Simon Peyton Jones,et al.  Tackling the Awkward Squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell , 2005 .

[46]  Xavier Leroy,et al.  The CompCert Memory Model, Version 2 , 2012 .

[47]  Georges Gonthier,et al.  Formal Proof—The Four- Color Theorem , 2008 .

[48]  Jean-François Monin,et al.  First Steps towards the Certification of an ARM Simulator Using Compcert , 2011, CPP.

[49]  Olivier Temam,et al.  UNISIM: An Open Simulation Environment and Library for Complex Architecture Design and Collaborative Development , 2007, IEEE Computer Architecture Letters.

[50]  Robert S. Boyer,et al.  Computational Logic , 1990, ESPRIT Basic Research Series.

[51]  Jianwen Zhu,et al.  An ultra-fast instruction set simulator , 2002, IEEE Trans. Very Large Scale Integr. Syst..

[52]  Gerhard Fettweis,et al.  A generic tool set for application specific processor architectures , 2000, CODES '00.

[53]  Claude Helmstetter,et al.  SimSoC: A SystemC TLM integrated ISS for full system simulation , 2008, APCCAS 2008 - 2008 IEEE Asia Pacific Conference on Circuits and Systems.

[54]  Hui Xiao,et al.  SimSoC: A full system simulation software for embedded systems , 2009, 2009 IEEE International Workshop on Open-source Software for Scientific Computation (OSSC).

[55]  Claude Marché,et al.  A Certified Multi-prover Verification Condition Generator , 2012, VSTTE.

[56]  Fredrik Larsson,et al.  Simics: A Full System Simulation Platform , 2002, Computer.