diff --git a/sys/sys/exterrvar.h b/sys/sys/exterrvar.h --- a/sys/sys/exterrvar.h +++ b/sys/sys/exterrvar.h @@ -36,11 +36,17 @@ #define SET_ERROR_MSG(mmsg) NULL #endif -#define SET_ERROR2(eerror, mmsg, pp1, pp2) \ +#define _SET_ERROR2(eerror, mmsg, pp1, pp2) \ exterr_set(eerror, EXTERR_CATEGORY, SET_ERROR_MSG(mmsg), \ (uintptr_t)(pp1), (uintptr_t)(pp2), __LINE__) -#define SET_ERROR0(eerror, mmsg) SET_ERROR2(eerror, mmsg, 0, 0) -#define SET_ERROR1(eerror, mmsg, pp1) SET_ERROR2(eerror, mmsg, pp1, 0) +#define _SET_ERROR0(eerror, mmsg) _SET_ERROR2(eerror, mmsg, 0, 0) +#define _SET_ERROR1(eerror, mmsg, pp1) _SET_ERROR2(eerror, mmsg, pp1, 0) + +#define _EXTERROR_MACRO(eerror, mmsg, _1, _2, NAME, ...) \ + NAME +#define EXTERROR(...) \ + _EXTERROR_MACRO(__VA_ARGS__, _SET_ERROR2, _SET_ERROR1, \ + _SET_ERROR0)(__VA_ARGS__) int exterr_set(int eerror, int category, const char *mmsg, uintptr_t pp1, uintptr_t pp2, int line); diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -192,12 +192,12 @@ check_fp_fn = mrp->mr_check_fp_fn; if ((prot & ~(_PROT_ALL | PROT_MAX(_PROT_ALL))) != 0) { - return (SET_ERROR0(EINVAL, "unknown PROT bits")); + return (EXTERROR(EINVAL, "unknown PROT bits")); } max_prot = PROT_MAX_EXTRACT(prot); prot = PROT_EXTRACT(prot); if (max_prot != 0 && (max_prot & prot) != prot) { - return (SET_ERROR0(ENOTSUP, "prot is not subset of max_prot")); + return (EXTERROR(ENOTSUP, "prot is not subset of max_prot")); } p = td->td_proc; @@ -230,7 +230,7 @@ if (!SV_CURPROC_FLAG(SV_AOUT)) { if ((len == 0 && p->p_osrel >= P_OSREL_MAP_ANON) || ((flags & MAP_ANON) != 0 && (fd != -1 || pos != 0))) { - return (SET_ERROR2(EINVAL, + return (EXTERROR(EINVAL, "offset not zero/fd not -1 for MAP_ANON", fd, pos)); } @@ -242,7 +242,7 @@ if (flags & MAP_STACK) { if ((fd != -1) || ((prot & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE))) { - return (SET_ERROR1(EINVAL, "MAP_STACK with prot < rw", + return (EXTERROR(EINVAL, "MAP_STACK with prot < rw", prot)); } flags |= MAP_ANON; @@ -252,23 +252,23 @@ MAP_STACK | MAP_NOSYNC | MAP_ANON | MAP_EXCL | MAP_NOCORE | MAP_PREFAULT_READ | MAP_GUARD | MAP_32BIT | MAP_ALIGNMENT_MASK)) != 0) { - return (SET_ERROR0(EINVAL, "reserved flag set")); + return (EXTERROR(EINVAL, "reserved flag set")); } if ((flags & (MAP_EXCL | MAP_FIXED)) == MAP_EXCL) { - return (SET_ERROR0(EINVAL, "EXCL without FIXED")); + return (EXTERROR(EINVAL, "EXCL without FIXED")); } if ((flags & (MAP_SHARED | MAP_PRIVATE)) == (MAP_SHARED | MAP_PRIVATE)) { - return (SET_ERROR0(EINVAL, "both SHARED and PRIVATE set")); + return (EXTERROR(EINVAL, "both SHARED and PRIVATE set")); } if (prot != PROT_NONE && (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)) != 0) { - return (SET_ERROR1(EINVAL, "invalid prot", prot)); + return (EXTERROR(EINVAL, "invalid prot", prot)); } if ((flags & MAP_GUARD) != 0 && (prot != PROT_NONE || fd != -1 || pos != 0 || (flags & ~(MAP_FIXED | MAP_GUARD | MAP_EXCL | MAP_32BIT | MAP_ALIGNMENT_MASK)) != 0)) { - return (SET_ERROR0(EINVAL, "GUARD with wrong parameters")); + return (EXTERROR(EINVAL, "GUARD with wrong parameters")); } /* @@ -290,7 +290,7 @@ if (align != 0 && align != MAP_ALIGNED_SUPER && (align >> MAP_ALIGNMENT_SHIFT >= sizeof(void *) * NBBY || align >> MAP_ALIGNMENT_SHIFT < PAGE_SHIFT)) { - return (SET_ERROR1(EINVAL, "bad alignment", align)); + return (EXTERROR(EINVAL, "bad alignment", align)); } /* @@ -305,17 +305,17 @@ */ addr -= pageoff; if ((addr & PAGE_MASK) != 0) { - return (SET_ERROR1(EINVAL, "fixed mapping not aligned", + return (EXTERROR(EINVAL, "fixed mapping not aligned", addr)); } /* Address range must be all in user VM space. */ if (!vm_map_range_valid(&vms->vm_map, addr, addr + size)) { - SET_ERROR0(EINVAL, "mapping outside vm_map"); + EXTERROR(EINVAL, "mapping outside vm_map"); return (EINVAL); } if (flags & MAP_32BIT && addr + size > MAP_32BIT_MAX_ADDR) { - return (SET_ERROR0(EINVAL, + return (EXTERROR(EINVAL, "fixed 32bit mapping does not fit into 4G")); } } else if (flags & MAP_32BIT) { @@ -384,7 +384,7 @@ goto done; if ((flags & (MAP_SHARED | MAP_PRIVATE)) == 0 && p->p_osrel >= P_OSREL_MAP_FSTRICT) { - SET_ERROR0(EINVAL, "neither SHARED nor PRIVATE req"); + EXTERROR(EINVAL, "neither SHARED nor PRIVATE req"); error = EINVAL; goto done; } @@ -1314,7 +1314,7 @@ vm_pager_update_writecount(obj, 0, objsize); } } else { - error = SET_ERROR0(EINVAL, "non-reg file"); + error = EXTERROR(EINVAL, "non-reg file"); goto done; } if ((error = VOP_GETATTR(vp, &va, cred))) @@ -1405,7 +1405,7 @@ (prot & VM_PROT_WRITE) != 0) return (EACCES); if ((flags & (MAP_PRIVATE | MAP_COPY)) != 0) { - return (SET_ERROR0(EINVAL, "cdev mapping must be shared")); + return (EXTERROR(EINVAL, "cdev mapping must be shared")); } /* @@ -1432,7 +1432,7 @@ obj = vm_pager_allocate(OBJT_DEVICE, cdev, objsize, prot, *foff, td->td_ucred); if (obj == NULL) { - return (SET_ERROR0(EINVAL, + return (EXTERROR(EINVAL, "cdev driver does not support mmap")); } *objp = obj; @@ -1452,7 +1452,7 @@ boolean_t writecounted; if (size == 0) { - return (SET_ERROR0(EINVAL, "zero-sized req")); + return (EXTERROR(EINVAL, "zero-sized req")); } size = round_page(size); @@ -1479,7 +1479,7 @@ handle, &foff, &object, &writecounted); break; default: - error = SET_ERROR1(EINVAL, "unsupported backing obj type", + error = EXTERROR(EINVAL, "unsupported backing obj type", handle_type); break; } @@ -1562,7 +1562,7 @@ * exec). */ if ((foff & PAGE_MASK) != 0) { - return (SET_ERROR1(EINVAL, "offset not page-aligned", foff)); + return (EXTERROR(EINVAL, "offset not page-aligned", foff)); } if ((flags & MAP_FIXED) == 0) { @@ -1570,7 +1570,7 @@ *addr = round_page(*addr); } else { if (*addr != trunc_page(*addr)) { - return (SET_ERROR1(EINVAL, + return (EXTERROR(EINVAL, "non-fixed mapping address not aligned", *addr)); } fitit = false; @@ -1578,11 +1578,11 @@ if (flags & MAP_ANON) { if (object != NULL) { - return (SET_ERROR0(EINVAL, + return (EXTERROR(EINVAL, "anon mapping backed by an object")); } if (foff != 0) { - return (SET_ERROR0(EINVAL, + return (EXTERROR(EINVAL, "anon mapping with non-zero offset")); } docow = 0; @@ -1604,7 +1604,7 @@ docow |= MAP_WRITECOUNT; if (flags & MAP_STACK) { if (object != NULL) { - return (SET_ERROR0(EINVAL, + return (EXTERROR(EINVAL, "stack mapping backed by an object")); } docow |= MAP_STACK_AREA; @@ -1686,6 +1686,6 @@ } if ((curthread->td_pflags2 & (TDP2_UEXTERR | TDP2_EXTERR)) == TDP2_UEXTERR) - SET_ERROR1(error, "mach error", rv); + EXTERROR(error, "mach error", rv); return (error); }