#include <sys/param.h>
#include <sys/proc.h>
#include <sys/ptrace.h>
#include <sys/systm.h>
#include <sys/user.h>
#include <machine/pcb.h>
#include <machine/reg.h>
int
process_read_regs(struct proc *p, struct reg *regs)
{
struct trapframe *tf = p->p_addr->u_pcb.pcb_tf;
memcpy(®s->r_t[0], &tf->tf_t[0], sizeof(regs->r_t));
memcpy(®s->r_s[0], &tf->tf_s[0], sizeof(regs->r_s));
memcpy(®s->r_a[0], &tf->tf_a[0], sizeof(regs->r_a));
regs->r_ra = tf->tf_ra;
regs->r_sp = tf->tf_sp;
regs->r_gp = tf->tf_gp;
regs->r_tp = tf->tf_tp;
regs->r_sepc = tf->tf_sepc;
regs->r_sstatus = tf->tf_sstatus;
return(0);
}
int
process_read_fpregs(struct proc *p, struct fpreg *regs)
{
struct trapframe *tf = p->p_addr->u_pcb.pcb_tf;
if (p->p_addr->u_pcb.pcb_flags & PCB_FPU)
fpu_save(p, tf);
if (p->p_addr->u_pcb.pcb_flags & PCB_FPU)
memcpy(regs, &p->p_addr->u_pcb.pcb_fpstate, sizeof(*regs));
else
memset(regs, 0, sizeof(*regs));
return(0);
}
#ifdef PTRACE
int
process_write_regs(struct proc *p, struct reg *regs)
{
struct trapframe *tf = p->p_addr->u_pcb.pcb_tf;
memcpy(&tf->tf_t[0], ®s->r_t[0], sizeof(tf->tf_t));
memcpy(&tf->tf_s[0], ®s->r_s[0], sizeof(tf->tf_s));
memcpy(&tf->tf_a[0], ®s->r_a[0], sizeof(tf->tf_a));
tf->tf_ra = regs->r_ra;
tf->tf_sp = regs->r_sp;
tf->tf_gp = regs->r_gp;
tf->tf_tp = regs->r_tp;
tf->tf_sepc = regs->r_sepc;
return(0);
}
int
process_write_fpregs(struct proc *p, struct fpreg *regs)
{
struct trapframe *tf = p->p_addr->u_pcb.pcb_tf;
memcpy(&p->p_addr->u_pcb.pcb_fpstate, regs,
sizeof(p->p_addr->u_pcb.pcb_fpstate));
p->p_addr->u_pcb.pcb_flags |= PCB_FPU;
tf->tf_sstatus &= ~SSTATUS_FS_MASK;
tf->tf_sstatus |= SSTATUS_FS_OFF;
return(0);
}
int
process_sstep(struct proc *p, int sstep)
{
return (EOPNOTSUPP);
}
int
process_set_pc(struct proc *p, caddr_t addr)
{
struct trapframe *tf = p->p_addr->u_pcb.pcb_tf;
tf->tf_sepc = (uint64_t)addr;
return (0);
}
#endif