root/src/add-ons/kernel/partitioning_systems/apple/apple.h
/*
** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
** Distributed under the terms of the MIT License.
*/
#ifndef APPLE_H
#define APPLE_H


#include "SupportDefs.h"
#include "ByteOrder.h"


enum apple_signature {
        kDriverDescriptorSignature              = 'ER',
        kPartitionMapSignature                  = 'PM',
        kObsoletePartitionMapSignature  = 'TS',
};


struct apple_driver_descriptor {
        int16   signature;
        int16   block_size;
        int32   block_count;
        int16   type;                           // reserved
        int16   id;                                     // "
        int32   data;                           // "
        int16   descriptor_count;
        int32   driver_block;
        int16   driver_size;
        int16   os_type;                        // operating system type

        int16 BlockSize() { return B_BENDIAN_TO_HOST_INT16(block_size); }
        int32 BlockCount() { return B_BENDIAN_TO_HOST_INT32(block_count); }

        bool HasValidSignature() { return B_BENDIAN_TO_HOST_INT16(signature) == kDriverDescriptorSignature; }
};

struct apple_partition_map {
        int16   signature;
        int16   _reserved0;
        int32   map_block_count;
        int32   start;                          // in blocks
        int32   size;
        char    name[32];
        char    type[32];
        int32   data_start;                     // in blocks
        int32   data_size;
        int32   status;
        int32   boot_start;
        int32   boot_size;
        int32   boot_address;
        int32   _reserved1;
        int32   boot_entry;
        int32   _reserved2;
        int32   boot_code_checksum;
        char    processor_type[16];

        int32 StartBlock() { return B_BENDIAN_TO_HOST_INT32(start); }
        int32 BlockCount() { return B_BENDIAN_TO_HOST_INT32(size); }
        uint64 Start(apple_driver_descriptor &descriptor) { return StartBlock() * descriptor.BlockSize(); }
        uint64 Size(apple_driver_descriptor &descriptor) { return BlockCount() * descriptor.BlockSize(); }

        bool HasValidSignature();
};


inline bool 
apple_partition_map::HasValidSignature()
{
        int16 sig = B_BENDIAN_TO_HOST_INT16(signature);

        return sig == kPartitionMapSignature
                || sig == kObsoletePartitionMapSignature;
}


enum partition_status {
        kPartitionIsValid                               = 0x00000001,
    kPartitionIsAllocated                       = 0x00000002,
    kPartitionIsInUse                           = 0x00000004,
    kPartitionIsBootValid                       = 0x00000008,
    kPartitionIsReadable                        = 0x00000010,
    kPartitionAUXIsWriteable            = 0x00000020,   // dunno why IsWriteable is here twice...
    kPartitionIsBootPIC                         = 0x00000040,
    kPartitionIsWriteable                       = 0x00000020,
    kPartitionIsMounted                         = 0x40000000,
    kPartitionIsStartup                         = 0x80000000,
    kPartitionIsChainCompatible         = 0x00000100,
    kPartitionIsRealDeviceDriver        = 0x00000200,
    kPartitionCanChainToNext            = 0x00000400,
};

#endif  /* APPLE_H */