/*
 * Definitions for cpus with variable page sizes.
 *
 *  Copyright (c) 2003 Fabrice Bellard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef EXEC_PAGE_VARY_H
#define EXEC_PAGE_VARY_H

/*
 * For system mode, the minimum comes from the number of bits
 * required for maximum alignment (6) and the number of bits
 * required for TLB_FLAGS_MASK (3).
 *
 * For user mode, TARGET_PAGE_BITS_VARY is a hack to allow the target
 * page size to match the host page size.  Mostly, this reduces the
 * ordinary target page size to run on a host with 4KiB pages (i.e. x86).
 * There is no true minimum required by the implementation, but keep the
 * same minimum as for system mode for sanity.
 * See linux-user/mmap.c, mmap_h_lt_g and mmap_h_gt_g.
 */
#define TARGET_PAGE_BITS_MIN 9

typedef struct {
    bool decided;
    int bits;
    uint64_t mask;
} TargetPageBits;

/**
 * set_preferred_target_page_bits:
 * @bits: number of bits needed to represent an address within the page
 *
 * Set the preferred target page size (the actual target page
 * size may be smaller than any given CPU's preference).
 * Returns true on success, false on failure (which can only happen
 * if this is called after the system has already finalized its
 * choice of page size and the requested page size is smaller than that).
 */
bool set_preferred_target_page_bits(int bits);

/**
 * finalize_target_page_bits:
 * Commit the final value set by set_preferred_target_page_bits.
 */
void finalize_target_page_bits(void);

/**
 * migration_legacy_page_bits
 *
 * For migration compatibility with qemu v2.9, prior to the introduction
 * of the configuration/target-page-bits section, return the value of
 * TARGET_PAGE_BITS that the target had then.
 */
int migration_legacy_page_bits(void);

#endif /* EXEC_PAGE_VARY_H */
