Fix buildworld for powerpc.

vmpage requires struct pmap to exist and contain a pm_stats field.  As of
r308817, either AIM or BOOKE is required to be set in order to get their
respective pmap structs.  Rather than expose them both, or try to unify them
unnecessarily, add a third option which contains only a pm_stats field, and
change the two existing pmap structures to place the common fields at the
beginning of the struct.  This actually fixes the stats collection by libkvm on
AIM hardware, because before it was accessing a possibly different offset, which
would cause it to read garbage.

Bump __FreeBSD_version to denote this ABI change, so that ports which depend on
libkvm can be rebuilt.
This commit is contained in:
jhibbits 2016-11-20 06:10:12 +00:00
parent 7efec23782
commit 8d17c296fe
4 changed files with 20 additions and 12 deletions

View File

@ -51,6 +51,11 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 12.x IS SLOW:
****************************** SPECIAL WARNING: ******************************
20161119:
The layout of the pmap structure has changed for powerpc to put the pmap
statistics at the front for all CPU variations. libkvm(3) and all tools
that link against it need to be recompiled.
20161030:
isl(4) and cyapa(4) drivers now require a new driver,
chromebook_platform(4), to work properly on Chromebook-class hardware.

View File

@ -30,9 +30,6 @@
#include <sys/cpuset.h>
#include <sys/sysctl.h>
#include <vm/vm.h>
#include <vm/vm_page.h>
#include <vm/uma.h>
#include <vm/uma_int.h>

View File

@ -74,6 +74,9 @@
#include <machine/slb.h>
#include <machine/tlb.h>
struct pmap;
typedef struct pmap *pmap_t;
#if defined(AIM)
#if !defined(NPMAPS)
@ -81,8 +84,6 @@
#endif /* !defined(NPMAPS) */
struct slbtnode;
struct pmap;
typedef struct pmap *pmap_t;
struct pvo_entry {
LIST_ENTRY(pvo_entry) pvo_vlink; /* Link to common virt page */
@ -131,6 +132,7 @@ RB_PROTOTYPE(pvo_tree, pvo_entry, pvo_plink, pvo_vaddr_compare);
#define PVO_VSID(pvo) ((pvo)->pvo_vpn >> 16)
struct pmap {
struct pmap_statistics pm_stats;
struct mtx pm_mtx;
#ifdef __powerpc64__
@ -143,7 +145,6 @@ struct pmap {
cpuset_t pm_active;
struct pmap *pmap_phys;
struct pmap_statistics pm_stats;
struct pvo_tree pmap_pvo;
};
@ -182,10 +183,10 @@ void slb_free_user_cache(struct slb **);
#elif defined(BOOKE)
struct pmap {
struct pmap_statistics pm_stats; /* pmap statistics */
struct mtx pm_mtx; /* pmap mutex */
tlbtid_t pm_tid[MAXCPU]; /* TID to identify this pmap entries in TLB */
cpuset_t pm_active; /* active on cpus */
struct pmap_statistics pm_stats; /* pmap statistics */
/* Page table directory, array of pointers to page tables. */
pte_t *pm_pdir[PDIR_NENTRIES];
@ -193,7 +194,6 @@ struct pmap {
/* List of allocated ptbl bufs (ptbl kva regions). */
TAILQ_HEAD(, ptbl_buf) pm_ptbl_list;
};
typedef struct pmap *pmap_t;
struct pv_entry {
pmap_t pv_pmap;
@ -210,6 +210,16 @@ struct md_page {
#define pmap_page_get_memattr(m) VM_MEMATTR_DEFAULT
#define pmap_page_is_mapped(m) (!TAILQ_EMPTY(&(m)->md.pv_list))
#else
/*
* Common pmap members between AIM and BOOKE.
* libkvm needs pm_stats at the same location between both, as it doesn't define
* AIM nor BOOKE, and is expected to work across all.
*/
struct pmap {
struct pmap_statistics pm_stats; /* pmap statistics */
struct mtx pm_mtx; /* pmap mutex */
};
#endif /* AIM */
extern struct pmap kernel_pmap_store;

View File

@ -28,10 +28,6 @@
#include <sys/param.h>
#define LIBMEMSTAT /* Cause vm_page.h not to include opt_vmpage.h */
#include <vm/vm.h>
#include <vm/vm_page.h>
#include <vm/uma.h>
#include <vm/uma_int.h>