Index: sys/arch/amd64/amd64/machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/amd64/machdep.c,v retrieving revision 1.245 diff -u -r1.245 machdep.c --- sys/arch/amd64/amd64/machdep.c 26 Dec 2016 13:55:13 -0000 1.245 +++ sys/arch/amd64/amd64/machdep.c 26 Dec 2016 17:11:58 -0000 @@ -254,14 +254,6 @@ size_t dump_header_size; size_t dump_totalbytesleft; -vaddr_t msgbuf_vaddr; - -struct { - paddr_t paddr; - psize_t sz; -} msgbuf_p_seg[VM_PHYSSEG_MAX]; -unsigned int msgbuf_p_cnt = 0; - vaddr_t idt_vaddr; paddr_t idt_paddr; vaddr_t gdt_vaddr; @@ -1466,52 +1458,6 @@ extern vector *IDTVEC(exceptions)[]; static void -init_x86_64_msgbuf(void) -{ - /* Message buffer is located at end of core. */ - psize_t sz = round_page(MSGBUFSIZE); - psize_t reqsz = sz; - uvm_physseg_t x; - - search_again: - for (x = uvm_physseg_get_first(); - uvm_physseg_valid_p(x); - x = uvm_physseg_get_next(x)) { - - if (ctob(uvm_physseg_get_avail_end(x)) == avail_end) - break; - } - - if (uvm_physseg_valid_p(x) == false) - panic("init_x86_64: can't find end of memory"); - - /* Shrink so it'll fit in the last segment. */ - if (uvm_physseg_get_avail_end(x) - uvm_physseg_get_avail_start(x) < atop(sz)) - sz = ctob(uvm_physseg_get_avail_end(x) - uvm_physseg_get_avail_start(x)); - - uvm_physseg_unplug(uvm_physseg_get_end(x) - atop(sz), atop(sz)); - msgbuf_p_seg[msgbuf_p_cnt].sz = sz; - msgbuf_p_seg[msgbuf_p_cnt++].paddr = ctob(uvm_physseg_get_avail_end(x)); - - /* Now find where the new avail_end is. */ - avail_end = ctob(uvm_physseg_get_avail_end(x)); - - if (sz == reqsz) - return; - - reqsz -= sz; - if (msgbuf_p_cnt == VM_PHYSSEG_MAX) { - /* No more segments available, bail out. */ - printf("WARNING: MSGBUFSIZE (%zu) too large, using %zu.\n", - (size_t)MSGBUFSIZE, (size_t)(MSGBUFSIZE - reqsz)); - return; - } - - sz = reqsz; - goto search_again; -} - -static void init_x86_64_ksyms(void) { #if NKSYMS || defined(DDB) || defined(MODULAR) @@ -1640,7 +1586,7 @@ atop(avail_start), atop(avail_end), VM_FREELIST_DEFAULT); #endif - init_x86_64_msgbuf(); + init_x86_msgbuf(); pmap_growkernel(VM_MIN_KERNEL_ADDRESS + 32 * 1024 * 1024); Index: sys/arch/i386/i386/machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/i386/i386/machdep.c,v retrieving revision 1.775 diff -u -r1.775 machdep.c --- sys/arch/i386/i386/machdep.c 26 Dec 2016 15:47:48 -0000 1.775 +++ sys/arch/i386/i386/machdep.c 26 Dec 2016 17:11:59 -0000 @@ -236,13 +236,6 @@ int i386_has_sse; int i386_has_sse2; -vaddr_t msgbuf_vaddr; -struct { - paddr_t paddr; - psize_t sz; -} msgbuf_p_seg[VM_PHYSSEG_MAX]; -unsigned int msgbuf_p_cnt = 0; - vaddr_t idt_vaddr; paddr_t idt_paddr; vaddr_t gdt_vaddr; @@ -1034,51 +1027,6 @@ #endif /* !XEN */ } -static void -init386_msgbuf(void) -{ - /* Message buffer is located at end of core. */ - psize_t sz = round_page(MSGBUFSIZE); - psize_t reqsz = sz; - uvm_physseg_t x; - -search_again: - for (x = uvm_physseg_get_first(); - uvm_physseg_valid_p(x); - x = uvm_physseg_get_next(x)) { - if (ctob(uvm_physseg_get_avail_end(x)) == avail_end) { - break; - } - } - if (uvm_physseg_valid_p(x) == false) - panic("init386: can't find end of memory"); - - /* Shrink so it'll fit in the last segment. */ - if (uvm_physseg_get_avail_end(x) - uvm_physseg_get_avail_start(x) < atop(sz)) - sz = ctob(uvm_physseg_get_avail_end(x) - uvm_physseg_get_avail_start(x)); - - uvm_physseg_unplug(uvm_physseg_get_end(x) - atop(sz), atop(sz)); - msgbuf_p_seg[msgbuf_p_cnt].sz = sz; - msgbuf_p_seg[msgbuf_p_cnt++].paddr = ctob(uvm_physseg_get_avail_end(x)); - - /* Now find where the new avail_end is. */ - avail_end = ctob(uvm_physseg_get_avail_end(x)); - - if (sz == reqsz) - return; - - reqsz -= sz; - if (msgbuf_p_cnt == VM_PHYSSEG_MAX) { - /* No more segments available, bail out. */ - printf("WARNING: MSGBUFSIZE (%zu) too large, using %zu.\n", - (size_t)MSGBUFSIZE, (size_t)(MSGBUFSIZE - reqsz)); - return; - } - - sz = reqsz; - goto search_again; -} - #ifndef XEN static void init386_pte0(void) @@ -1273,7 +1221,7 @@ #endif /* !XEN */ - init386_msgbuf(); + init_x86_msgbuf(); #if !defined(XEN) && NBIOSCALL > 0 /* Index: sys/arch/x86/include/machdep.h =================================================================== RCS file: /cvsroot/src/sys/arch/x86/include/machdep.h,v retrieving revision 1.8 diff -u -r1.8 machdep.h --- sys/arch/x86/include/machdep.h 16 Jul 2016 17:02:34 -0000 1.8 +++ sys/arch/x86/include/machdep.h 26 Dec 2016 17:11:59 -0000 @@ -32,11 +32,21 @@ extern phys_ram_seg_t mem_clusters[]; extern int mem_cluster_cnt; +extern vaddr_t msgbuf_vaddr; +extern unsigned int msgbuf_p_cnt; + struct btinfo_memmap; struct extent; struct sysctllog; +struct msgbuf_p_seg { + paddr_t paddr; + psize_t sz; +}; + +extern struct msgbuf_p_seg msgbuf_p_seg[]; + void x86_cpu_idle_init(void); void x86_cpu_idle_get(void (**)(void), char *, size_t); void x86_cpu_idle_set(void (*)(void), const char *, bool); @@ -45,6 +55,7 @@ void init_x86_clusters(void); int init_x86_vm(paddr_t); +void init_x86_msgbuf(void); void x86_startup(void); void x86_sysctl_machdep_setup(struct sysctllog **); Index: sys/arch/x86/x86/x86_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/x86/x86/x86_machdep.c,v retrieving revision 1.79 diff -u -r1.79 x86_machdep.c --- sys/arch/x86/x86/x86_machdep.c 20 Dec 2016 14:03:15 -0000 1.79 +++ sys/arch/x86/x86/x86_machdep.c 26 Dec 2016 17:11:59 -0000 @@ -101,6 +101,14 @@ static kauth_listener_t x86_listener; +vaddr_t msgbuf_vaddr; + +struct msgbuf_p_seg msgbuf_p_seg[VM_PHYSSEG_MAX]; + +unsigned int msgbuf_p_cnt = 0; + +void init_x86_msgbuf(void); + /* * Given the type of a bootinfo entry, looks for a matching item inside * the bootinfo structure. If found, returns a pointer to it (which must @@ -902,6 +910,52 @@ #endif /* !XEN */ void +init_x86_msgbuf(void) +{ + /* Message buffer is located at end of core. */ + psize_t sz = round_page(MSGBUFSIZE); + psize_t reqsz = sz; + uvm_physseg_t x; + + search_again: + for (x = uvm_physseg_get_first(); + uvm_physseg_valid_p(x); + x = uvm_physseg_get_next(x)) { + + if (ctob(uvm_physseg_get_avail_end(x)) == avail_end) + break; + } + + if (uvm_physseg_valid_p(x) == false) + panic("init_x86_msgbuf: can't find end of memory"); + + /* Shrink so it'll fit in the last segment. */ + if (uvm_physseg_get_avail_end(x) - uvm_physseg_get_avail_start(x) < atop(sz)) + sz = ctob(uvm_physseg_get_avail_end(x) - uvm_physseg_get_avail_start(x)); + + uvm_physseg_unplug(uvm_physseg_get_end(x) - atop(sz), atop(sz)); + msgbuf_p_seg[msgbuf_p_cnt].sz = sz; + msgbuf_p_seg[msgbuf_p_cnt++].paddr = ctob(uvm_physseg_get_avail_end(x)); + + /* Now find where the new avail_end is. */ + avail_end = ctob(uvm_physseg_get_avail_end(x)); + + if (sz == reqsz) + return; + + reqsz -= sz; + if (msgbuf_p_cnt == VM_PHYSSEG_MAX) { + /* No more segments available, bail out. */ + printf("WARNING: MSGBUFSIZE (%zu) too large, using %zu.\n", + (size_t)MSGBUFSIZE, (size_t)(MSGBUFSIZE - reqsz)); + return; + } + + sz = reqsz; + goto search_again; +} + +void x86_reset(void) { uint8_t b;