Goto sanos source index

//
// syspage.h
//
// System page definitions
//
// Copyright (C) 2002 Michael Ringgaard. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 
// 1. Redistributions of source code must retain the above copyright 
//    notice, this list of conditions and the following disclaimer.  
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.  
// 3. Neither the name of the project nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission. 
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
// SUCH DAMAGE.
// 

#ifndef SYSPAGE_H
#define SYSPAGE_H

#define GDT_TO_SEL(gdt) ((gdt) << 3)

#define GDT_NULL     0
#define GDT_KTEXT    1
#define GDT_KDATA    2
#define GDT_UTEXT    3
#define GDT_UDATA    4
#define GDT_TSS      5
#define GDT_TIB      6
#define GDT_AUX1     7
#define GDT_APM40    8
#define GDT_APMCS    9
#define GDT_APMCS16  10
#define GDT_APMDS    11
#define GDT_PNPTEXT  12
#define GDT_PNPDATA  13
#define GDT_PNPTHUNK 14
#define GDT_AUX2     15

#define MAXGDT 16
#define MAXIDT 64

#define SEL_NULL     GDT_TO_SEL(GDT_NULL)
#define SEL_KTEXT    GDT_TO_SEL(GDT_KTEXT)
#define SEL_KDATA    GDT_TO_SEL(GDT_KDATA)
#define SEL_UTEXT    GDT_TO_SEL(GDT_UTEXT)
#define SEL_UDATA    GDT_TO_SEL(GDT_UDATA)
#define SEL_TSS      GDT_TO_SEL(GDT_TSS)
#define SEL_TIB      GDT_TO_SEL(GDT_TIB)
#define SEL_AUX1     GDT_TO_SEL(GDT_AUX1)
#define SEL_APM40    GDT_TO_SEL(GDT_APM40)
#define SEL_APMCS    GDT_TO_SEL(GDT_APMCS)
#define SEL_APMCS16  GDT_TO_SEL(GDT_APMCS16)
#define SEL_APMDS    GDT_TO_SEL(GDT_APMDS)
#define SEL_PNPTEXT  GDT_TO_SEL(GDT_PNPTEXT)
#define SEL_PNPDATA  GDT_TO_SEL(GDT_PNPDATA)
#define SEL_PNPTHUNK GDT_TO_SEL(GDT_PNPTHUNK)
#define SEL_AUX2     GDT_TO_SEL(GDT_AUX2)

#define SEL_RPL0    0
#define SEL_RPL3    3

#define KRNLOPTS_POSOFS      0x1A   // Offset in os loader for kernel option address
#define KRNLOPTS_LEN         128    // Maximum length of kernel options

#define VGA_MODE_SIZE        512    // Size of VESA mode information buffer

// APM install check flags

#define APM_16_BIT_SUPPORT      0x0001
#define APM_32_BIT_SUPPORT      0x0002
#define APM_IDLE_SLOWS_CLOCK    0x0004
#define APM_BIOS_DISABLED       0x0008
#define APM_BIOS_DISENGAGED     0x0010

// APM BIOS parameter block

struct apmparams {
  unsigned short version;      // APM version (BCD format)
  unsigned short flags;        // APM flags from install check
  unsigned short cseg32;       // APM 32-bit code segment (real mode segment base address)
  unsigned short entry;        // Offset of the entry point into the APM BIOS
  unsigned short cseg16;       // APM 16-bit code segment (real mode segment base address)
  unsigned short dseg;         // APM data segment (real mode segment base address)
  unsigned short cseg32len;    // APM BIOS 32-bit code segment length
  unsigned short cseg16len;    // APM BIOS 16-bit code segment length
  unsigned short dseglen;      // APM BIOS data segment length
};

// Memory map

#define MAX_MEMENTRIES    32

#define MEMTYPE_RAM       1
#define MEMTYPE_RESERVED  2
#define MEMTYPE_ACPI      3
#define MEMTYPE_NVS       4

#pragma pack(push, 1)

struct memmap {
  int count;              // Number of entries in memory map
  struct mementry {
    unsigned __int64 addr;     // Start of memory segment
    unsigned __int64 size;     // Size of memory segment
    unsigned long type;        // Type of memory segment
  } entry[MAX_MEMENTRIES];
};

// Boot parameter block

struct bootparams {
  int bootdrv;                 // Boot drive:
                               //  0x00 First floppy
                               //  0x01 Second floppy
                               //  0x80 First harddisk
                               //  0x81 Second harddisk
                               //  0xFD CD-ROM (1.44 MB Floppy Emulation)
                               //  0xFE PXE netboot
                               //  0xFF CD-ROM (No emulation)
  char *bootimg;               // Physical address of boot image
  char krnlopts[KRNLOPTS_LEN]; // Kernel options (set by mkdfs)
  struct apmparams apm;        // APM BIOS parameters
  struct memmap memmap;        // System memory map from BIOS
};

#pragma pack(pop)

// Loader parameter block

struct ldrparams {
  unsigned long heapstart;      // Start of boot heap
  unsigned long heapend;        // End of boot heap
  unsigned long memend;         // End of RAM
  int bootdrv;                  // Boot drive
  int bootpart;                 // Boot partition
  unsigned long initrd_size;    // Initial RAM disk size
};

// System page

struct syspage {
  struct tss tss;                       // Task State Segment
  struct segment gdt[MAXGDT];           // Global Descriptor Table
  struct gate idt[MAXIDT];              // Interrupt Descriptor Table
  struct bootparams bootparams;         // Boot parameter block
  struct ldrparams ldrparams;           // Loader parameter block
  unsigned char biosdata[256];          // Copy of BIOS data area
  unsigned char vgainfo[VGA_MODE_SIZE]; // VESA VBE video mode information
};

#ifdef KERNEL
#ifndef OSLDR
krnlapi extern struct syspage *syspage;
#endif
#endif

#define OSBASE      0x80000000
#define PTBASE      0x90000000
#define SYSBASE     0x90400000
#define PFDBBASE    0x90800000
#define HTABBASE    0x91000000
#define KHEAPBASE   0x92000000

#define KMODSIZE    0x10000000
#define KHEAPSIZE   0x6E000000
#define HTABSIZE    0x01000000

#define SYSPAGE_ADDRESS (SYSBASE + 0 * PAGESIZE)
#define PAGEDIR_ADDRESS (SYSBASE + 1 * PAGESIZE)
#define INITTCB_ADDRESS (SYSBASE + 2 * PAGESIZE)
#define OSVMAP_ADDRESS  (SYSBASE + 4 * PAGESIZE)
#define KMODMAP_ADDRESS (SYSBASE + 5 * PAGESIZE)
#define VIDBASE_ADDRESS (SYSBASE + 6 * PAGESIZE)

#define DMABUF_ADDRESS  (SYSBASE + 16 * PAGESIZE)  // 64K
#define INITRD_ADDRESS  (SYSBASE + 32 * PAGESIZE)  // 512K

#define TSS_ESP0 (SYSPAGE_ADDRESS + 4)

#define USERSPACE(addr) ((unsigned long)(addr) < OSBASE)
#define KERNELSPACE(addr) ((unsigned long)(addr) >= OSBASE)

#endif