/*************************************************************************
 ** mmu.library                                                         **
 **                                                                     **
 ** a system library for arbitration and control of the MC68K MMUs      **
 **                                                                     **
 ** © 1998 THOR-Software, Thomas Richter                                **
 ** No commercial use, reassembly, modification without prior, written  **
 ** permission of the authors.                                          **
 ** Including this library in any commercial software REQUIRES a        **
 ** written permission and the payment of a small fee.                  **
 **                                                                     **
 **---------------------------------------------------------------------**
 ** context related definitions                                         **
 *************************************************************************/

#ifndef MMU_CONTEXT_H
#define MMU_CONTEXT_H

#ifndef EXEC_TYPES_H
#include <exec/types.h>
#endif

/* A context keeps roughly speaking an MMU table. Lovers of unix might
   want to use the name "process" instead, whereas an exec task or
   a dos.library process might be called "a thread".
   All tasks sharing one context share one logical addressing space. */

/* The definition of the context structure: This is something you do
   not care about. */

struct MMUContext {
        struct MMUContext       *ctx_succ;      /* A doubly linked list */
        struct MMUContext       *ctx_pred;
        /* private data here. Do not touch, modify, .... */     
};


/* A mapping node, used to define the address space. This is what you find
   in the list arbitrated by GetMapping().

   This structure is stricly READ ONLY */

struct MappingNode {
        struct MappingNode     *map_succ;
        struct MappingNode     *map_pred;
        
        ULONG            map_Lower;     /* lower address this node covers. */
        ULONG            map_Higher;    /* higher address, inclusive */
        ULONG            map_Flags;     /* internal use only. */
        ULONG            map_Properties;        /* see below for definitions */
        union {
                void    *map_UserData;  /* your data if this is invalid or swapped */
                void    *map_Page;      /* destination page if bundled */
                LONG    *map_Descriptor;/* pointer to a descriptor, alternatively */
                LONG    map_Delta;      /* added to the logical address if remapped */
        }                map_un;
};



/* Property types:
   These define the "property flags" you may assign to memory with
   SetProperties() and SetPageProperties(). */

#define MAPP_WRITEPROTECTED     (1<<2L)
/* The region is write protected and the segmentation fault exception hooks 
   will be called on a write access. */

#define MAPP_USED               (1<<3L)
/* Set by the MMU on access, querried by GetPageProperties(). */

#define MAPP_MODIFIED           (1<<4L)
/* Set by the MMU on write accesses, querried by GetPageProperties(). */

#define MAPP_CACHEINHIBIT       (1<<6L)
/* Region is cache-inhibited, by default serialized access, precise
   exception mode */

#define MAPP_SUPERVISORONLY     (1<<7L)
/* Supervisor access only. Note that this is currently implemented by
   marking the pages as invalid in the user MMU tables, not by setting
   the supervisor bit. */

#define MAPP_USERPAGE0          (1<<8L)
/* User page attribute 0, used only by 68040, 68060.
   These bits are available at special pins of the CPU,
   special hardware might require this. */

#define MAPP_USERPAGE1          (1<<9L)
/* User page attribute 1 */

#define MAPP_GLOBAL             (1<<10L)
/* This memory region is global. The MMU library makes currently no
   effective use of this flag, and it makes only a difference for the
   040 and 060 anyhow. */

#define MAPP_BLANK              (1<<11L)
/* There's no memory here. If accessed, the access is quietly tolerated, 
   even though nothing useful should be expected. This is mainly to work
   around bad software if no enforcer is available. */

#define MAPP_SINGLEPAGE         (1<<12L)
/* Give this page a private page descriptor. This flag IS A MUST
   if you want to use GetPagePropertiesA/SetPagePropertiesA on
   that page.  */

#define MAPP_COPYBACK           (1<<13L)
/* MC68040 or MC68060 advanced copyback mode enabled. The library sets this
   by default for all non-chip memory. */

#define MAPP_INVALID            (1<<14L)
/* The page is invalid. Accessing it results in a segmentation fault, i.e.
   the library will call the appropriate exception hooks. */

#define MAPP_REMAPPED           (1<<15L)
/* Page is redirected to a different memory region. Note that you MUST NOT
   add this memory to the exec library free memory list because some DMA
   devices don't support I/O from this region and the MMU library will
   guru as soon as you try to place MMU tables in remapped memory. 
   This might change in the future. */

#define MAPP_SWAPPED            (1<<16L)
/* This page is currently swapped out. If a program accesses this, a 
   swapped-out fault is generated. UserData is available for a swapper 
   daemon, usually the memory.library. */

#define MAPP_ROM                (1<<17L)
/* This is read-only memory, but the library tolerates write accesses 
   quietly and no hook is called on writes. Hence, this turns the memory
   region effectively into a "ROM". */

#define MAPP_SHARED             (1<<18L)
/* Shares the table of the global NULL context. This is currently not
   implemented and should not be set. */

#define MAPP_TRANSLATED         (1<<19L)
/* This memory region is - probably partially - under control of the 
   transparent translation registers and should not be touched. 
   The mmu library does not handle the transparent translation very well
   and tries to get rid of them on startup. */

#define MAPP_REPAIRABLE         (1<<20L)
/* This flag allows invalid or write protected pages to get repaired on
   a fault by software rather than by swapping in a page. 
   The mmu.library will try to make the written data available to the 
   exception hook, and will try to provide readback data for the input 
   pipeline of the CPU. Note that this is very useful for debugging tools 
   and the like, but causes quite a lot of overhead.
   Furthermore, MAPP_REPAIRABLE pages do not get user data. */

#define MAPP_IMPRECISE          (1<<21L)
/* If non-cacheable, allow imprecise exception mode */

#define MAPP_INDIRECT           (1<<22L)
/* Indirect table pointer to a user-provided table. Note that the mmu library
   exception handler returns always a pointer to the descriptor pointing to
   your descriptor, not to your descriptor directly. */

#define MAPP_BUNDLED            (1<<23L)
/* Several pages bundled to one physical page in memory, usually done to 
   map out memory. */

#define MAPP_USER0              (1<<24L)
#define MAPP_USER1              (1<<25L)
#define MAPP_USER2              (1<<26L)
#define MAPP_USER3              (1<<27L)        
/* Strictly for you. Not touched by the library. */

#define MAPP_NONSERIALIZED      (1<<29L)
/* If non-cacheable, allow non-serialized access */

#define MAPP_TEMPORARY          (1<<30L)
/* This is internal use only, do not set this flag. */
#endif
