mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-10 09:42:26 +00:00
amd64: centralize definitions of CS_SECURE and EFL_SECURE
Requested by markj Reviewed by: jhb, markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D31954
This commit is contained in:
parent
590d0715b3
commit
a42d362bb5
@ -166,9 +166,6 @@ CTASSERT(PC_PTI_STACK_SZ * sizeof(register_t) >= 2 * sizeof(struct pti_frame) -
|
||||
|
||||
extern u_int64_t hammer_time(u_int64_t, u_int64_t);
|
||||
|
||||
#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
|
||||
#define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
|
||||
|
||||
static void cpu_startup(void *);
|
||||
static void get_fpcontext(struct thread *td, mcontext_t *mcp,
|
||||
char *xfpusave, size_t xfpusave_len);
|
||||
|
@ -73,9 +73,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <machine/pcb.h>
|
||||
#include <machine/cpufunc.h>
|
||||
|
||||
#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
|
||||
#define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
|
||||
|
||||
int
|
||||
fill_regs32(struct thread *td, struct reg32 *regs)
|
||||
{
|
||||
|
@ -85,9 +85,6 @@ __FBSDID("$FreeBSD$");
|
||||
static void freebsd4_ia32_sendsig(sig_t, ksiginfo_t *, sigset_t *);
|
||||
#endif
|
||||
|
||||
#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
|
||||
#define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
|
||||
|
||||
static void
|
||||
ia32_get_fpcontext(struct thread *td, struct ia32_mcontext *mcp,
|
||||
char *xfpusave, size_t xfpusave_len)
|
||||
|
@ -46,4 +46,9 @@ struct pti_frame {
|
||||
register_t pti_ss;
|
||||
};
|
||||
|
||||
#ifdef _KERNEL
|
||||
#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
|
||||
#define EFL_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -555,9 +555,7 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
|
||||
* Corruption of the PSL_RF bit at worst causes one more or
|
||||
* one less debugger trap, so allowing it is fairly harmless.
|
||||
*/
|
||||
|
||||
#define RFLAG_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
|
||||
if (!RFLAG_SECURE(rflags & ~PSL_RF, regs->tf_rflags & ~PSL_RF)) {
|
||||
if (!EFL_SECURE(rflags & ~PSL_RF, regs->tf_rflags & ~PSL_RF)) {
|
||||
printf("linux_rt_sigreturn: rflags = 0x%lx\n", rflags);
|
||||
return (EINVAL);
|
||||
}
|
||||
@ -567,7 +565,6 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
|
||||
* hardware check for invalid selectors, excess privilege in
|
||||
* other selectors, invalid %eip's and invalid %esp's.
|
||||
*/
|
||||
#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
|
||||
if (!CS_SECURE(context->sc_cs)) {
|
||||
printf("linux_rt_sigreturn: cs = 0x%x\n", context->sc_cs);
|
||||
ksiginfo_init_trap(&ksi);
|
||||
|
@ -519,9 +519,8 @@ linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args)
|
||||
return (EFAULT);
|
||||
|
||||
/* Check for security violations. */
|
||||
#define EFLAGS_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
|
||||
eflags = frame.sf_sc.sc_eflags;
|
||||
if (!EFLAGS_SECURE(eflags, regs->tf_rflags))
|
||||
if (!EFL_SECURE(eflags, regs->tf_rflags))
|
||||
return(EINVAL);
|
||||
|
||||
/*
|
||||
@ -529,7 +528,6 @@ linux_sigreturn(struct thread *td, struct linux_sigreturn_args *args)
|
||||
* hardware check for invalid selectors, excess privilege in
|
||||
* other selectors, invalid %eip's and invalid %esp's.
|
||||
*/
|
||||
#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
|
||||
if (!CS_SECURE(frame.sf_sc.sc_cs)) {
|
||||
ksiginfo_init_trap(&ksi);
|
||||
ksi.ksi_signo = SIGBUS;
|
||||
@ -602,9 +600,8 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
|
||||
context = &uc.uc_mcontext;
|
||||
|
||||
/* Check for security violations. */
|
||||
#define EFLAGS_SECURE(ef, oef) ((((ef) ^ (oef)) & ~PSL_USERCHANGE) == 0)
|
||||
eflags = context->sc_eflags;
|
||||
if (!EFLAGS_SECURE(eflags, regs->tf_rflags))
|
||||
if (!EFL_SECURE(eflags, regs->tf_rflags))
|
||||
return(EINVAL);
|
||||
|
||||
/*
|
||||
@ -612,7 +609,6 @@ linux_rt_sigreturn(struct thread *td, struct linux_rt_sigreturn_args *args)
|
||||
* hardware check for invalid selectors, excess privilege in
|
||||
* other selectors, invalid %eip's and invalid %esp's.
|
||||
*/
|
||||
#define CS_SECURE(cs) (ISPL(cs) == SEL_UPL)
|
||||
if (!CS_SECURE(context->sc_cs)) {
|
||||
ksiginfo_init_trap(&ksi);
|
||||
ksi.ksi_signo = SIGBUS;
|
||||
|
Loading…
Reference in New Issue
Block a user