/*
 * Copyright (c) 2006-2007 The Regents of The University of Michigan
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Authors: Gabe Black
 */

#include <sys/ptrace.h>
#include <stdint.h>

#include <cerrno>
#include <iostream>

#include "arch/sparc/tracechild.hh"

using namespace std;

bool
SparcTraceChild::sendState(int socket)
{
    uint64_t regVal = 0;
    for (int x = 0; x <= I7; x++) {
        regVal = getRegVal(x);
        if (write(socket, &regVal, sizeof(regVal)) == -1) {
            cerr << "Write failed! " << strerror(errno) << endl;
            tracing = false;
            return false;
        }
    }
    regVal = getRegVal(PC);
    if (write(socket, &regVal, sizeof(regVal)) == -1) {
        cerr << "Write failed! " << strerror(errno) << endl;
        tracing = false;
        return false;
    }
    regVal = getRegVal(NPC);
    if (write(socket, &regVal, sizeof(regVal)) == -1) {
        cerr << "Write failed! " << strerror(errno) << endl;
        tracing = false;
        return false;
    }
    regVal = getRegVal(CCR);
    if (write(socket, &regVal, sizeof(regVal)) == -1) {
        cerr << "Write failed! " << strerror(errno) << endl;
        tracing = false;
        return false;
    }
    return true;
}

int64_t
getRegs(regs & myregs, fpu & myfpu, uint64_t * locals,
        uint64_t * inputs, int num)
{
    assert(num < SparcTraceChild::numregs && num >= 0);
    switch (num) {
      //Global registers
      case SparcTraceChild::G0: return 0;
      case SparcTraceChild::G1: return myregs.r_g1;
      case SparcTraceChild::G2: return myregs.r_g2;
      case SparcTraceChild::G3: return myregs.r_g3;
      case SparcTraceChild::G4: return myregs.r_g4;
      case SparcTraceChild::G5: return myregs.r_g5;
      case SparcTraceChild::G6: return myregs.r_g6;
      case SparcTraceChild::G7: return myregs.r_g7;
      //Output registers
      case SparcTraceChild::O0: return myregs.r_o0;
      case SparcTraceChild::O1: return myregs.r_o1;
      case SparcTraceChild::O2: return myregs.r_o2;
      case SparcTraceChild::O3: return myregs.r_o3;
      case SparcTraceChild::O4: return myregs.r_o4;
      case SparcTraceChild::O5: return myregs.r_o5;
      case SparcTraceChild::O6: return myregs.r_o6;
      case SparcTraceChild::O7: return myregs.r_o7;
      //Local registers
      case SparcTraceChild::L0: return locals[0];
      case SparcTraceChild::L1: return locals[1];
      case SparcTraceChild::L2: return locals[2];
      case SparcTraceChild::L3: return locals[3];
      case SparcTraceChild::L4: return locals[4];
      case SparcTraceChild::L5: return locals[5];
      case SparcTraceChild::L6: return locals[6];
      case SparcTraceChild::L7: return locals[7];
      //Input registers
      case SparcTraceChild::I0: return inputs[0];
      case SparcTraceChild::I1: return inputs[1];
      case SparcTraceChild::I2: return inputs[2];
      case SparcTraceChild::I3: return inputs[3];
      case SparcTraceChild::I4: return inputs[4];
      case SparcTraceChild::I5: return inputs[5];
      case SparcTraceChild::I6: return inputs[6];
      case SparcTraceChild::I7: return inputs[7];
      //Floating point
      case SparcTraceChild::F0: return myfpu.f_fpstatus.fpu_fr[0];
      case SparcTraceChild::F2: return myfpu.f_fpstatus.fpu_fr[1];
      case SparcTraceChild::F4: return myfpu.f_fpstatus.fpu_fr[2];
      case SparcTraceChild::F6: return myfpu.f_fpstatus.fpu_fr[3];
      case SparcTraceChild::F8: return myfpu.f_fpstatus.fpu_fr[4];
      case SparcTraceChild::F10: return myfpu.f_fpstatus.fpu_fr[5];
      case SparcTraceChild::F12: return myfpu.f_fpstatus.fpu_fr[6];
      case SparcTraceChild::F14: return myfpu.f_fpstatus.fpu_fr[7];
      case SparcTraceChild::F16: return myfpu.f_fpstatus.fpu_fr[8];
      case SparcTraceChild::F18: return myfpu.f_fpstatus.fpu_fr[9];
      case SparcTraceChild::F20: return myfpu.f_fpstatus.fpu_fr[10];
      case SparcTraceChild::F22: return myfpu.f_fpstatus.fpu_fr[11];
      case SparcTraceChild::F24: return myfpu.f_fpstatus.fpu_fr[12];
      case SparcTraceChild::F26: return myfpu.f_fpstatus.fpu_fr[13];
      case SparcTraceChild::F28: return myfpu.f_fpstatus.fpu_fr[14];
      case SparcTraceChild::F30: return myfpu.f_fpstatus.fpu_fr[15];
      case SparcTraceChild::F32: return myfpu.f_fpstatus.fpu_fr[16];
      case SparcTraceChild::F34: return myfpu.f_fpstatus.fpu_fr[17];
      case SparcTraceChild::F36: return myfpu.f_fpstatus.fpu_fr[18];
      case SparcTraceChild::F38: return myfpu.f_fpstatus.fpu_fr[19];
      case SparcTraceChild::F40: return myfpu.f_fpstatus.fpu_fr[20];
      case SparcTraceChild::F42: return myfpu.f_fpstatus.fpu_fr[21];
      case SparcTraceChild::F44: return myfpu.f_fpstatus.fpu_fr[22];
      case SparcTraceChild::F46: return myfpu.f_fpstatus.fpu_fr[23];
      case SparcTraceChild::F48: return myfpu.f_fpstatus.fpu_fr[24];
      case SparcTraceChild::F50: return myfpu.f_fpstatus.fpu_fr[25];
      case SparcTraceChild::F52: return myfpu.f_fpstatus.fpu_fr[26];
      case SparcTraceChild::F54: return myfpu.f_fpstatus.fpu_fr[27];
      case SparcTraceChild::F56: return myfpu.f_fpstatus.fpu_fr[28];
      case SparcTraceChild::F58: return myfpu.f_fpstatus.fpu_fr[29];
      case SparcTraceChild::F60: return myfpu.f_fpstatus.fpu_fr[30];
      case SparcTraceChild::F62: return myfpu.f_fpstatus.fpu_fr[31];
      //Miscelaneous
      case SparcTraceChild::FSR: return myfpu.f_fpstatus.Fpu_fsr;
      case SparcTraceChild::FPRS: return myregs.r_fprs;
      case SparcTraceChild::PC: return myregs.r_tpc;
      case SparcTraceChild::NPC: return myregs.r_tnpc;
      case SparcTraceChild::Y: return myregs.r_y;
      case SparcTraceChild::CWP:
        return (myregs.r_tstate >> 0) & ((1 << 5) - 1);
      case SparcTraceChild::PSTATE:
        return (myregs.r_tstate >> 8) & ((1 << 13) - 1);
      case SparcTraceChild::ASI:
        return (myregs.r_tstate >> 24) & ((1 << 8) - 1);
      case SparcTraceChild::CCR:
        return (myregs.r_tstate >> 32) & ((1 << 8) - 1);
      default:
        assert(0);
        return 0;
    }
}

bool
SparcTraceChild::update(int pid)
{
    memcpy(&oldregs, &theregs, sizeof(regs));
    memcpy(&oldfpregs, &thefpregs, sizeof(fpu));
    memcpy(oldLocals, locals, 8 * sizeof(uint64_t));
    memcpy(oldInputs, inputs, 8 * sizeof(uint64_t));
    if (ptrace(PTRACE_GETREGS, pid, &theregs, 0) != 0) {
        cerr << "Update failed" << endl;
        return false;
    }
    uint64_t stackPointer = getSP();
    uint64_t stackBias = 2047;
    bool v9 = stackPointer % 2;
    for (unsigned int x = 0; x < 8; x++) {
        uint64_t localAddr = stackPointer +
            (v9 ? (stackBias + x * 8) : (x * 4));
        locals[x] = ptrace(PTRACE_PEEKTEXT, pid, localAddr, 0);
        if (!v9) locals[x] >>= 32;
        uint64_t inputAddr = stackPointer +
            (v9 ? (stackBias + x * 8 + (8 * 8)) : (x * 4 + 8 * 4));
        inputs[x] = ptrace(PTRACE_PEEKTEXT, pid, inputAddr, 0);
        if (!v9) inputs[x] >>= 32;
    }
    if (ptrace(PTRACE_GETFPREGS, pid, &thefpregs, 0) != 0)
        return false;
    for (unsigned int x = 0; x < numregs; x++)
        regDiffSinceUpdate[x] = (getRegVal(x) != getOldRegVal(x));
    return true;
}

SparcTraceChild::SparcTraceChild()
{
    for (unsigned int x = 0; x < numregs; x++)
        regDiffSinceUpdate[x] = false;
}

int
SparcTraceChild::getTargets(uint32_t inst, uint64_t pc, uint64_t npc,
                            uint64_t &target1, uint64_t &target2)
{
    //We can identify the instruction categories we care about using the top
    //10 bits of the instruction, excluding the annul bit in the 3rd most
    //significant bit position and the condition field. We'll call these
    //bits the "sig" for signature.
    uint32_t sig = (inst >> 22) & 0x307;
    uint32_t cond = (inst >> 25) & 0xf;
    bool annul = (inst & (1 << 29));

    //Check if it's a ba...
    bool ba = (cond == 0x8) &&
        (sig == 0x1 || sig == 0x2 || sig == 0x5 || sig == 0x6);
    //or a bn...
    bool bn = (cond == 0x0) &&
        (sig == 0x1 || sig == 0x2 || sig == 0x5 || sig == 0x6);
    //or a bcc
    bool bcc = (cond & 0x7) &&
        (sig == 0x1 || sig == 0x2 || sig == 0x3 || sig == 0x5 || sig == 0x6);

    if (annul) {
        if (bcc) {
            target1 = npc;
            target2 = npc + 4;
            return 2;
        } else if(ba) {
            //This branches immediately to the effective address of the branch
            //which we'll have to calculate.
            uint64_t disp = 0;
            int64_t extender = 0;
            //Figure out how big the displacement field is, and grab the bits
            if (sig == 0x1 || sig == 0x5) {
                disp = inst & ((1 << 19) - 1);
                extender = 1 << 18;
            } else {
                disp = inst & ((1 << 22) - 1);
                extender = 1 << 21;
            }
            //This does sign extension, believe it or not.
            disp = (disp ^ extender) - extender;
            //Multiply the displacement by 4. I'm assuming the compiler is
            //smart enough to turn this into a shift.
            disp *= 4;
            target1 = pc + disp;
        } else if(bn)
            target1 = npc + 4;
        else
            target1 = npc;
        return 1;
    } else {
        target1 = npc;
        return 1;
    }
}

bool
SparcTraceChild::step()
{
    //Increment the count of the number of instructions executed
    instructions++;
    //Two important considerations are that the address of the instruction
    //being breakpointed should be word (64bit) aligned, and that both the
    //next instruction and the instruction after that need to be breakpointed
    //so that annulled branches will still stop as well.

    /*
     * Useful constants
     */
    const static uint64_t breakInst = 0x91d02001;
    const static uint64_t lowBreakInst = breakInst;
    const static uint64_t highBreakInst = breakInst << 32;
    const static uint64_t breakWord = breakInst | (breakInst << 32);
    const static uint64_t lowMask = 0xFFFFFFFFULL;
    const static uint64_t highMask = lowMask << 32;

    /*
     * storage for the original contents of the child process's memory
     */
    uint64_t originalInst, originalAnnulInst;

    /*
     * Get information about where the process is and is headed next.
     */
    uint64_t currentPC = getRegVal(PC);
    bool unalignedPC = currentPC & 7;
    uint64_t alignedPC = currentPC & (~7);
    uint64_t nextPC = getRegVal(NPC);
    bool unalignedNPC = nextPC & 7;
    uint64_t alignedNPC = nextPC & (~7);

    //Get the current instruction
    uint64_t curInst = ptrace(PTRACE_PEEKTEXT, pid, alignedPC);
    curInst = unalignedPC ? (curInst & 0xffffffffULL) : (curInst >> 32);

    uint64_t bp1, bp2;
    int numTargets = getTargets(curInst, currentPC, nextPC, bp1, bp2);
    assert(numTargets == 1 || numTargets == 2);

    bool unalignedBp1 = bp1 & 7;
    uint64_t alignedBp1 = bp1 & (~7);
    bool unalignedBp2 = bp2 & 7;
    uint64_t alignedBp2 = bp2 & (~7);
    uint64_t origBp1, origBp2;

    /*
     * Set the first breakpoint
     */
    origBp1 = ptrace(PTRACE_PEEKTEXT, pid, alignedBp1, 0);
    uint64_t newBp1 = origBp1;
    newBp1 &= unalignedBp1 ? highMask : lowMask;
    newBp1 |= unalignedBp1 ? lowBreakInst : highBreakInst;
    if (ptrace(PTRACE_POKETEXT, pid, alignedBp1, newBp1) != 0)
        cerr << "Poke failed" << endl;
    /*
     * Set the second breakpoint if necessary
     */
    if (numTargets == 2) {
        origBp2 = ptrace(PTRACE_PEEKTEXT, pid, alignedBp2, 0);
        uint64_t newBp2 = origBp2;
        newBp2 &= unalignedBp2 ? highMask : lowMask;
        newBp2 |= unalignedBp2 ? lowBreakInst : highBreakInst;
        if (ptrace(PTRACE_POKETEXT, pid, alignedBp2, newBp2) != 0)
            cerr << "Poke failed" << endl;
    }

    /*
     * Restart the child process
     */
    //Note that the "addr" parameter is supposed to be ignored, but in at
    //least one version of the kernel, it must be 1 or it will set what
    //pc to continue from
    if (ptrace(PTRACE_CONT, pid, 1, 0) != 0)
        cerr << "Cont failed" << endl;
    doWait();

    /*
     * Update our record of the child's state
     */
    update(pid);

    /*
     * Put back the original contents of the childs address space in the
     * reverse order.
     */
    if (numTargets == 2) {
        if (ptrace(PTRACE_POKETEXT, pid, alignedBp2, origBp2) != 0)
            cerr << "Poke failed" << endl;
    }
    if (ptrace(PTRACE_POKETEXT, pid, alignedBp1, origBp1) != 0)
        cerr << "Poke failed" << endl;
}

int64_t
SparcTraceChild::getRegVal(int num)
{
    return getRegs(theregs, thefpregs, locals, inputs, num);
}

int64_t
SparcTraceChild::getOldRegVal(int num)
{
    return getRegs(oldregs, oldfpregs, oldLocals, oldInputs, num);
}

ostream &
SparcTraceChild::outputStartState(ostream & os)
{
    bool v8 = false;
    uint64_t sp = getSP();
    if (sp % 2) {
        os << "Detected a 64 bit executable.\n";
        v8 = false;
    } else {
        os << "Detected a 32 bit executable.\n";
        v8 = true;
    }
    uint64_t pc = getPC();
    char obuf[1024];
    sprintf(obuf, "Initial stack pointer = 0x%016llx\n", sp);
    os << obuf;
    sprintf(obuf, "Initial program counter = 0x%016llx\n", pc);
    os << obuf;
    if (!v8) {
        //Take out the stack bias
        sp += 2047;
    }
    //Output the window save area
    for (unsigned int x = 0; x < 16; x++) {
        uint64_t regspot = ptrace(PTRACE_PEEKDATA, pid, sp, 0);
        if (v8) regspot = regspot >> 32;
        sprintf(obuf, "0x%016llx: Window save %d = 0x%016llx\n",
                sp, x+1, regspot);
        os << obuf;
        sp += v8 ? 4 : 8;
    }
    //Output the argument count
    uint64_t cargc = ptrace(PTRACE_PEEKDATA, pid, sp, 0);
    if (v8) cargc = cargc >> 32;
    sprintf(obuf, "0x%016llx: Argc = 0x%016llx\n", sp, cargc);
    os << obuf;
    sp += v8 ? 4 : 8;
    //Output argv pointers
    int argCount = 0;
    uint64_t cargv;
    do {
        cargv = ptrace(PTRACE_PEEKDATA, pid, sp, 0);
        if (v8) cargv = cargv >> 32;
        sprintf(obuf, "0x%016llx: argv[%d] = 0x%016llx\n",
                sp, argCount++, cargv);
        os << obuf;
        sp += v8 ? 4 : 8;
    } while(cargv);
    //Output the envp pointers
    int envCount = 0;
    uint64_t cenvp;
    do {
        cenvp = ptrace(PTRACE_PEEKDATA, pid, sp, 0);
        if (v8) cenvp = cenvp >> 32;
        sprintf(obuf, "0x%016llx: envp[%d] = 0x%016llx\n",
                sp, envCount++, cenvp);
        os << obuf;
        sp += v8 ? 4 : 8;
    } while (cenvp);
    uint64_t auxType, auxVal;
    do {
        auxType = ptrace(PTRACE_PEEKDATA, pid, sp, 0);
        if (v8) auxType = auxType >> 32;
        sp += (v8 ? 4 : 8);
        auxVal = ptrace(PTRACE_PEEKDATA, pid, sp, 0);
        if (v8) auxVal = auxVal >> 32;
        sp += (v8 ? 4 : 8);
        sprintf(obuf, "0x%016llx: Auxiliary vector = {0x%016llx, 0x%016llx}\n",
                sp - 8, auxType, auxVal);
        os << obuf;
    } while (auxType != 0 || auxVal != 0);
    //Print out the argument strings, environment strings, and file name.
    string current;
    uint64_t buf;
    uint64_t currentStart = sp;
    bool clearedInitialPadding = false;
    do {
        buf = ptrace(PTRACE_PEEKDATA, pid, sp, 0);
        char * cbuf = (char *)&buf;
        for (int x = 0; x < sizeof(uint32_t); x++) {
            if (cbuf[x])
                current += cbuf[x];
            else {
                sprintf(obuf, "0x%016llx: \"%s\"\n",
                        currentStart, current.c_str());
                os << obuf;
                current = "";
                currentStart = sp + x + 1;
            }
        }
        sp += (v8 ? 4 : 8);
        clearedInitialPadding = clearedInitialPadding || buf != 0;
    } while (!clearedInitialPadding || buf != 0);
    return os;
}

TraceChild *
genTraceChild()
{
    return new SparcTraceChild;
}

