int putreg(struct task_struct *child, int regno, unsignedlong value)
{
regno >>= 2; switch (regno) { case EBX: case ECX: case EDX: case ESI: case EDI: case EBP: case EAX: case EIP: case UESP: break; case ORIG_EAX: /* Update the syscall number. */
UPT_SYSCALL_NR(&child->thread.regs.regs) = value; break; case FS: if (value && (value & 3) != 3) return -EIO; break; case GS: if (value && (value & 3) != 3) return -EIO; break; case DS: case ES: if (value && (value & 3) != 3) return -EIO;
value &= 0xffff; break; case SS: case CS: if ((value & 3) != 3) return -EIO;
value &= 0xffff; break; case EFL:
value &= FLAG_MASK;
child->thread.regs.regs.gp[HOST_EFLAGS] |= value; return 0; default :
panic("Bad register in putreg() : %d\n", regno);
}
child->thread.regs.regs.gp[reg_offsets[regno]] = value; return 0;
}
int poke_user(struct task_struct *child, long addr, long data)
{ if ((addr & 3) || addr < 0) return -EIO;
regno >>= 2; switch (regno) { case FS: case GS: case DS: case ES: case SS: case CS:
mask = 0xffff; break; case EIP: case UESP: case EAX: case EBX: case ECX: case EDX: case ESI: case EDI: case EBP: case EFL: case ORIG_EAX: break; default:
panic("Bad register in getreg() : %d\n", regno);
} return mask & child->thread.regs.regs.gp[reg_offsets[regno]];
}
/* read the word at location addr in the USER area. */ int peek_user(struct task_struct *child, long addr, long data)
{ unsignedlong tmp;
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.