tracechild.hh revision 3115
15299Sgblack@eecs.umich.edu/*
25450Sgblack@eecs.umich.edu * Copyright (c) 2006 The Regents of The University of Michigan
35299Sgblack@eecs.umich.edu * All rights reserved.
45299Sgblack@eecs.umich.edu *
57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without
67087Snate@binkert.org * modification, are permitted provided that the following conditions are
77087Snate@binkert.org * met: redistributions of source code must retain the above copyright
87087Snate@binkert.org * notice, this list of conditions and the following disclaimer;
97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright
107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
117087Snate@binkert.org * documentation and/or other materials provided with the distribution;
127087Snate@binkert.org * neither the name of the copyright holders nor the names of its
135299Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
147087Snate@binkert.org * this software without specific prior written permission.
157087Snate@binkert.org *
167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225299Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245299Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255299Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265299Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275299Sgblack@eecs.umich.edu *
285299Sgblack@eecs.umich.edu * Authors: Gabe Black
295299Sgblack@eecs.umich.edu */
305299Sgblack@eecs.umich.edu
315299Sgblack@eecs.umich.edu#ifndef REGSTATE_I386_HH
325299Sgblack@eecs.umich.edu#define REGSTATE_I386_HH
335299Sgblack@eecs.umich.edu
345299Sgblack@eecs.umich.edu#include <linux/user.h>
355299Sgblack@eecs.umich.edu#include <sys/types.h>
365299Sgblack@eecs.umich.edu#include <sys/ptrace.h>
375299Sgblack@eecs.umich.edu#include <assert.h>
385299Sgblack@eecs.umich.edu#include <string>
395299Sgblack@eecs.umich.edu
405299Sgblack@eecs.umich.edu#include "tracechild.hh"
4111793Sbrandon.potter@amd.com
4211793Sbrandon.potter@amd.comclass I386TraceChild : public TraceChild
4311793Sbrandon.potter@amd.com{
447629Sgblack@eecs.umich.edupublic:
455299Sgblack@eecs.umich.edu        enum RegNum
465303Sgblack@eecs.umich.edu        {
478706Sandreas.hansson@arm.com                //GPRs
485299Sgblack@eecs.umich.edu                EAX, EBX, ECX, EDX,
497737Sgblack@eecs.umich.edu                //Index registers
505299Sgblack@eecs.umich.edu                ESI, EDI,
515299Sgblack@eecs.umich.edu                //Base pointer and stack pointer
525299Sgblack@eecs.umich.edu                EBP, ESP,
535299Sgblack@eecs.umich.edu                //Segmentation registers
545299Sgblack@eecs.umich.edu                CS, DS, ES, FS, GS, SS,
555450Sgblack@eecs.umich.edu                //PC
565299Sgblack@eecs.umich.edu                EIP,
575299Sgblack@eecs.umich.edu                numregs
585299Sgblack@eecs.umich.edu        };
595299Sgblack@eecs.umich.eduprivate:
605299Sgblack@eecs.umich.edu        char printBuffer [256];
615299Sgblack@eecs.umich.edu        static char * regNames[numregs];
625299Sgblack@eecs.umich.edu        int64_t getRegs(user_regs_struct & myregs, int num);
635299Sgblack@eecs.umich.edu        user_regs_struct regs;
647532Ssteve.reinhardt@amd.com        user_regs_struct oldregs;
655299Sgblack@eecs.umich.edu        bool regDiffSinceUpdate[numregs];
667532Ssteve.reinhardt@amd.com
675303Sgblack@eecs.umich.eduprotected:
685303Sgblack@eecs.umich.edu        bool update(int pid);
695303Sgblack@eecs.umich.edu
705303Sgblack@eecs.umich.edupublic:
715303Sgblack@eecs.umich.edu
725303Sgblack@eecs.umich.edu        I386TraceChild();
735303Sgblack@eecs.umich.edu
745303Sgblack@eecs.umich.edu        int getNumRegs()
755303Sgblack@eecs.umich.edu        {
765303Sgblack@eecs.umich.edu                return numregs;
775303Sgblack@eecs.umich.edu        }
785303Sgblack@eecs.umich.edu
795303Sgblack@eecs.umich.edu        bool diffSinceUpdate(int num)
805303Sgblack@eecs.umich.edu        {
815303Sgblack@eecs.umich.edu                assert(num < numregs && num >= 0);
825303Sgblack@eecs.umich.edu                return regDiffSinceUpdate[num];
8314010Sgabeblack@google.com        }
848852Sandreas.hansson@arm.com
855303Sgblack@eecs.umich.edu        std::string getRegName(int num)
865303Sgblack@eecs.umich.edu        {
875303Sgblack@eecs.umich.edu                assert(num < numregs && num >= 0);
885303Sgblack@eecs.umich.edu                return regNames[num];
895303Sgblack@eecs.umich.edu        }
9014010Sgabeblack@google.com
918852Sandreas.hansson@arm.com        int64_t getRegVal(int num);
925303Sgblack@eecs.umich.edu        int64_t getOldRegVal(int num);
935303Sgblack@eecs.umich.edu        uint64_t getPC() {return getRegVal(EIP);}
945303Sgblack@eecs.umich.edu        uint64_t getSP() {return getRegVal(ESP);}
955303Sgblack@eecs.umich.edu        std::ostream & outputStartState(std::ostream & output)
965303Sgblack@eecs.umich.edu        {
975303Sgblack@eecs.umich.edu            output << "Printing i386 initial state not yet implemented"
985303Sgblack@eecs.umich.edu                << std::endl;
995303Sgblack@eecs.umich.edu            return output;
1005303Sgblack@eecs.umich.edu        }
1015303Sgblack@eecs.umich.edu
1025303Sgblack@eecs.umich.edu        char * printReg(int num);
1035303Sgblack@eecs.umich.edu};
1045303Sgblack@eecs.umich.edu
1055303Sgblack@eecs.umich.edu#endif
1065303Sgblack@eecs.umich.edu