12428aad8SPatrick Mooney /*
22428aad8SPatrick Mooney  * This file and its contents are supplied under the terms of the
32428aad8SPatrick Mooney  * Common Development and Distribution License ("CDDL"), version 1.0.
42428aad8SPatrick Mooney  * You may only use this file in accordance with the terms of version
52428aad8SPatrick Mooney  * 1.0 of the CDDL.
62428aad8SPatrick Mooney  *
72428aad8SPatrick Mooney  * A full copy of the text of the CDDL should have accompanied this
82428aad8SPatrick Mooney  * source.  A copy of the CDDL is also available via the Internet at
92428aad8SPatrick Mooney  * http://www.illumos.org/license/CDDL.
102428aad8SPatrick Mooney  */
112428aad8SPatrick Mooney 
122428aad8SPatrick Mooney /*
132428aad8SPatrick Mooney  * Copyright 2016 Joyent, Inc.
142428aad8SPatrick Mooney  */
152428aad8SPatrick Mooney 
162428aad8SPatrick Mooney 
172428aad8SPatrick Mooney #include <sys/types.h>
182428aad8SPatrick Mooney #include <sys/thread.h>
192428aad8SPatrick Mooney #include <sys/proc.h>
202428aad8SPatrick Mooney #include <sys/mman.h>
212428aad8SPatrick Mooney #include <sys/vmsystm.h>
222428aad8SPatrick Mooney #include <vm/as.h>
232428aad8SPatrick Mooney #include <vm/seg_umap.h>
242428aad8SPatrick Mooney 
252428aad8SPatrick Mooney #if !defined(__xpv)
262428aad8SPatrick Mooney #include <sys/comm_page.h>
272428aad8SPatrick Mooney #endif /* !defined(__xpv) */
282428aad8SPatrick Mooney 
292428aad8SPatrick Mooney /*
302428aad8SPatrick Mooney  * Map in the comm page.
312428aad8SPatrick Mooney  *
322428aad8SPatrick Mooney  * The contents of the comm page are only defined on non-xpv x86 at this time.
332428aad8SPatrick Mooney  * Furthermore, the data is only valid in userspace (32-bit or 64-bit) when
342428aad8SPatrick Mooney  * mapped from a 64-bit kernel.
352428aad8SPatrick Mooney  * See: "uts/i86pc/sys/comm_page.h"
362428aad8SPatrick Mooney  */
372428aad8SPatrick Mooney caddr_t
comm_page_mapin()382428aad8SPatrick Mooney comm_page_mapin()
392428aad8SPatrick Mooney {
4086ef0a63SRichard Lowe #if !defined(__xpv)
412428aad8SPatrick Mooney 	proc_t *p = curproc;
422428aad8SPatrick Mooney 	caddr_t addr = NULL;
432428aad8SPatrick Mooney 	size_t len = COMM_PAGE_SIZE;
442428aad8SPatrick Mooney 	uint_t prot = PROT_USER | PROT_READ;
452428aad8SPatrick Mooney 	segumap_crargs_t suarg;
462428aad8SPatrick Mooney 
472428aad8SPatrick Mooney 	map_addr(&addr, len, (offset_t)0, 1, 0);
482428aad8SPatrick Mooney 	if (addr == NULL || valid_usr_range(addr, len, prot, p->p_as,
492428aad8SPatrick Mooney 	    p->p_as->a_userlimit) != RANGE_OKAY) {
502428aad8SPatrick Mooney 		return (NULL);
512428aad8SPatrick Mooney 	}
522428aad8SPatrick Mooney 
532428aad8SPatrick Mooney 	suarg.kaddr = (caddr_t)&comm_page;
542428aad8SPatrick Mooney 	suarg.prot = suarg.maxprot = prot;
552428aad8SPatrick Mooney 	if (as_map(p->p_as, addr, len, segumap_create, &suarg) != 0) {
562428aad8SPatrick Mooney 		return (NULL);
572428aad8SPatrick Mooney 	}
582428aad8SPatrick Mooney 	return (addr);
5986ef0a63SRichard Lowe #else /* !defined(__xpv) */
602428aad8SPatrick Mooney 	return (NULL);
6186ef0a63SRichard Lowe #endif /* !defined(__xpv) */
622428aad8SPatrick Mooney }
63