Changeset e49e234 in mainline for kernel/generic/include/mm/frame.h


Ignore:
Timestamp:
2009-02-27T11:32:31Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c1f7f6ea
Parents:
5f0f29ce
Message:

kernel memory management revisited (phase 2): map physical memory according to zones

  • ia32: register reserved and ACPI zones
  • pareas are now used only for mapping of present physical memory (hw_area() is gone)
  • firmware zones and physical addresses outside any zones are allowed to be mapped generally
  • fix nasty antient bug in zones_insert_zone()
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/mm/frame.h

    r5f0f29ce re49e234  
    4040#include <adt/list.h>
    4141#include <mm/buddy.h>
     42#include <synch/spinlock.h>
    4243#include <arch/mm/page.h>
    4344#include <arch/mm/frame.h>
     
    6869typedef uint8_t zone_flags_t;
    6970
     71/** Available zone (free for allocation) */
     72#define ZONE_AVAILABLE  0x00
    7073/** Zone is reserved (not available for allocation) */
    71 #define ZONE_RESERVED  0x08
     74#define ZONE_RESERVED   0x08
    7275/** Zone is used by firmware (not available for allocation) */
    73 #define ZONE_FIRMWARE  0x10
     76#define ZONE_FIRMWARE   0x10
    7477
    7578/** Currently there is no equivalent zone flags
    7679    for frame flags */
    7780#define FRAME_TO_ZONE_FLAGS(frame_flags)  0
     81
     82typedef struct {
     83        count_t refcount;     /**< Tracking of shared frames */
     84        uint8_t buddy_order;  /**< Buddy system block order */
     85        link_t buddy_link;    /**< Link to the next free block inside
     86                               one order */
     87        void *parent;         /**< If allocated by slab, this points there */
     88} frame_t;
     89
     90typedef struct {
     91        pfn_t base;                    /**< Frame_no of the first frame
     92                                        in the frames array */
     93        count_t count;                 /**< Size of zone */
     94        count_t free_count;            /**< Number of free frame_t
     95                                        structures */
     96        count_t busy_count;            /**< Number of busy frame_t
     97                                        structures */
     98        zone_flags_t flags;            /**< Type of the zone */
     99       
     100        frame_t *frames;               /**< Array of frame_t structures
     101                                        in this zone */
     102        buddy_system_t *buddy_system;  /**< Buddy system for the zone */
     103} zone_t;
     104
     105/*
     106 * The zoneinfo.lock must be locked when accessing zoneinfo structure.
     107 * Some of the attributes in zone_t structures are 'read-only'
     108 */
     109typedef struct {
     110        SPINLOCK_DECLARE(lock);
     111        count_t count;
     112        zone_t info[ZONES_MAX];
     113} zones_t;
     114
     115extern zones_t zones;
    78116
    79117static inline uintptr_t PFN2ADDR(pfn_t frame)
     
    99137}
    100138
     139static inline bool zone_flags_available(zone_flags_t flags)
     140{
     141        return ((flags & (ZONE_RESERVED | ZONE_FIRMWARE)) == 0);
     142}
     143
    101144#define IS_BUDDY_ORDER_OK(index, order) \
    102145    ((~(((unative_t) -1) << (order)) & (index)) == 0)
     
    118161extern void frame_reference_add(pfn_t);
    119162
     163extern count_t find_zone(pfn_t frame, count_t count, count_t hint);
    120164extern count_t zone_create(pfn_t, count_t, pfn_t, zone_flags_t);
    121165extern void *frame_get_parent(pfn_t, count_t);
Note: See TracChangeset for help on using the changeset viewer.