Deleted Added
full compact
26c26
< * $FreeBSD: head/sys/ia64/ia32/ia32_signal.c 102808 2002-09-01 21:41:24Z jake $
---
> * $FreeBSD: head/sys/ia64/ia32/ia32_signal.c 115084 2003-05-16 21:26:42Z marcel $
54a55,58
> #include <machine/frame.h>
> #include <machine/md_var.h>
> #include <machine/pcb.h>
>
67,68d70
< #include <machine/frame.h>
< #include <machine/md_var.h>
87c89
< 0, 0, 0, 0
---
> 0
89c91
< static int ia32_szsigcode = sizeof(ia32_sigcode) & ~3;
---
> static int ia32_szsigcode = sizeof(ia32_sigcode);
108,109c110,111
< MINSIGSTKSZ,
< 4096,
---
> IA32_MINSIGSTKSZ,
> IA32_PAGE_SIZE,
148,149c150,151
< destp = (caddr_t)arginfo - szsigcode - SPARE_USRSPACE -
< roundup((ARG_MAX - imgp->stringspace), sizeof(char *));
---
> destp = (caddr_t)arginfo - szsigcode - IA32_USRSPACE -
> roundup((ARG_MAX - imgp->stringspace), sizeof(char *));
187a190
> vectp = (void*)((uintptr_t)vectp & ~15);
240c243
< struct trapframe *frame = td->td_frame;
---
> struct trapframe *tf = td->td_frame;
247,251c250
< /*
< * Make sure that we restore the entire trapframe after an
< * execve.
< */
< frame->tf_flags &= ~FRAME_SYSCALL;
---
> exec_setregs(td, entry, stack, ps_strings);
253,254c252,257
< bzero(frame->tf_r, sizeof(frame->tf_r));
< bzero(frame->tf_f, sizeof(frame->tf_f));
---
> /* Non-syscall frames are cleared by exec_setregs() */
> if (tf->tf_flags & FRAME_SYSCALL) {
> bzero(&tf->tf_scratch, sizeof(tf->tf_scratch));
> bzero(&tf->tf_scratch_fp, sizeof(tf->tf_scratch_fp));
> } else
> tf->tf_special.ndirty = 0;
256,266c259,260
< frame->tf_cr_iip = entry;
< frame->tf_cr_ipsr = (IA64_PSR_IC
< | IA64_PSR_I
< | IA64_PSR_IT
< | IA64_PSR_DT
< | IA64_PSR_RT
< | IA64_PSR_DFH
< | IA64_PSR_IS
< | IA64_PSR_BN
< | IA64_PSR_CPL_USER);
< frame->tf_r[FRAME_R12] = stack;
---
> tf->tf_special.psr |= IA64_PSR_IS;
> tf->tf_special.sp = stack;
267a262,265
> /* Point the RSE backstore to something harmless. */
> tf->tf_special.bspstore = (IA32_PS_STRINGS - ia32_szsigcode -
> IA32_USRSPACE + 15) & ~15;
>
272,284c270,273
< #if 1
< frame->tf_r[FRAME_R16] = (datasel << 48) | (datasel << 32)
< | (datasel << 16) | datasel;
< frame->tf_r[FRAME_R17] = (ldtsel << 32) | (datasel << 16) | codesel;
< #else
< frame->tf_r[FRAME_R16] = datasel;
< frame->tf_r[FRAME_R17] = codesel;
< frame->tf_r[FRAME_R18] = datasel;
< frame->tf_r[FRAME_R19] = datasel;
< frame->tf_r[FRAME_R20] = datasel;
< frame->tf_r[FRAME_R21] = datasel;
< frame->tf_r[FRAME_R22] = ldtsel;
< #endif
---
> /* Setup ia32 segment registers. */
> tf->tf_scratch.gr16 = (datasel << 48) | (datasel << 32) |
> (datasel << 16) | datasel;
> tf->tf_scratch.gr17 = (ldtsel << 32) | (datasel << 16) | codesel;
290,293c279,281
< vm_map_find(&vmspace->vm_map, 0, 0,
< &gdt, PAGE_SIZE, 0,
< VM_PROT_ALL, VM_PROT_ALL, 0);
< ldt = gdt + 4096;
---
> vm_map_find(&vmspace->vm_map, 0, 0, &gdt, IA32_PAGE_SIZE << 1, 0,
> VM_PROT_ALL, VM_PROT_ALL, 0);
> ldt = gdt + IA32_PAGE_SIZE;
333,338d320
< ia64_set_csd(codeseg);
< ia64_set_ssd(dataseg);
< frame->tf_r[FRAME_R24] = dataseg; /* ESD */
< frame->tf_r[FRAME_R27] = dataseg; /* DSD */
< frame->tf_r[FRAME_R28] = dataseg; /* FSD */
< frame->tf_r[FRAME_R29] = dataseg; /* GSD */
339a322,328
> tf->tf_scratch.csd = codeseg;
> tf->tf_scratch.ssd = dataseg;
> tf->tf_scratch.gr24 = dataseg; /* ESD */
> tf->tf_scratch.gr27 = dataseg; /* DSD */
> tf->tf_scratch.gr28 = dataseg; /* FSD */
> tf->tf_scratch.gr29 = dataseg; /* GSD */
>
354,355d342
< frame->tf_r[FRAME_R30] = ldtseg; /* LDTD */
< frame->tf_r[FRAME_R31] = gdtseg; /* GDTD */
356a344,348
> tf->tf_scratch.gr30 = ldtseg; /* LDTD */
> tf->tf_scratch.gr31 = gdtseg; /* GDTD */
>
> /* Set ia32 control registers on this processor. */
> ia64_set_cflg(CR0_PE | CR0_PG | ((long)(CR4_XMM | CR4_FXSR) << 32));
360c352
< frame->tf_r[FRAME_R11] = IA32_PS_STRINGS;
---
> tf->tf_scratch.gr11 = IA32_PS_STRINGS;
368a361,384
>
> void
> ia32_restorectx(struct pcb *pcb)
> {
>
> ia64_set_cflg(pcb->pcb_ia32_cflg);
> ia64_set_eflag(pcb->pcb_ia32_eflag);
> ia64_set_fcr(pcb->pcb_ia32_fcr);
> ia64_set_fdr(pcb->pcb_ia32_fdr);
> ia64_set_fir(pcb->pcb_ia32_fir);
> ia64_set_fsr(pcb->pcb_ia32_fsr);
> }
>
> void
> ia32_savectx(struct pcb *pcb)
> {
>
> pcb->pcb_ia32_cflg = ia64_get_cflg();
> pcb->pcb_ia32_eflag = ia64_get_eflag();
> pcb->pcb_ia32_fcr = ia64_get_fcr();
> pcb->pcb_ia32_fdr = ia64_get_fdr();
> pcb->pcb_ia32_fir = ia64_get_fir();
> pcb->pcb_ia32_fsr = ia64_get_fsr();
> }