#ifndef __LOKI_H_
#define __LOKI_H_

#define VERSION "2.1"

#define BOOT_MAGIC_SIZE 8
#define BOOT_NAME_SIZE 16
#define BOOT_ARGS_SIZE 512

#define BOOT_PARTITION      "/dev/block/platform/msm_sdcc.1/by-name/boot"
#define RECOVERY_PARTITION  "/dev/block/platform/msm_sdcc.1/by-name/recovery"
#define ABOOT_PARTITION     "/dev/block/platform/msm_sdcc.1/by-name/aboot"

#define PATTERN1 "\xf0\xb5\x8f\xb0\x06\x46\xf0\xf7"
#define PATTERN2 "\xf0\xb5\x8f\xb0\x07\x46\xf0\xf7"
#define PATTERN3 "\x2d\xe9\xf0\x41\x86\xb0\xf1\xf7"
#define PATTERN4 "\x2d\xe9\xf0\x4f\xad\xf5\xc6\x6d"
#define PATTERN5 "\x2d\xe9\xf0\x4f\xad\xf5\x21\x7d"
#define PATTERN6 "\x2d\xe9\xf0\x4f\xf3\xb0\x05\x46"

#define ABOOT_BASE_SAMSUNG 0x88dfffd8
#define ABOOT_BASE_LG 0x88efffd8
#define ABOOT_BASE_G2 0xf7fffd8
#define ABOOT_BASE_VIPER 0x40100000

struct boot_img_hdr {
    unsigned char magic[BOOT_MAGIC_SIZE];
    unsigned kernel_size;   /* size in bytes */
    unsigned kernel_addr;   /* physical load addr */
    unsigned ramdisk_size;  /* size in bytes */
    unsigned ramdisk_addr;  /* physical load addr */
    unsigned second_size;   /* size in bytes */
    unsigned second_addr;   /* physical load addr */
    unsigned tags_addr;     /* physical addr for kernel tags */
    unsigned page_size;     /* flash page size we assume */
    unsigned dt_size;       /* device_tree in bytes */
    unsigned unused;        /* future expansion: should be 0 */
    unsigned char name[BOOT_NAME_SIZE];    /* asciiz product name */
    unsigned char cmdline[BOOT_ARGS_SIZE];
    unsigned id[8];         /* timestamp / checksum / sha1 / etc */
};

struct loki_hdr {
    unsigned char magic[4];     /* 0x494b4f4c */
    unsigned int recovery;      /* 0 = boot.img, 1 = recovery.img */
    char build[128];   /* Build number */

    unsigned int orig_kernel_size;
    unsigned int orig_ramdisk_size;
    unsigned int ramdisk_addr;
};

int loki_patch(const char* partition_label, const char* aboot_image, const char* in_image, const char* out_image);
int loki_flash(const char* partition_label, const char* loki_image);
int loki_find(const char* aboot_image);
int loki_unlok(const char* in_image, const char* out_image);

#define PATCH	"\xfe\xb5"			\
				"\x0d\x4d"			\
				"\xd5\xf8"			\
				"\x88\x04"			\
				"\xab\x68"			\
				"\x98\x42"			\
				"\x12\xd0"			\
				"\xd5\xf8"			\
				"\x90\x64"			\
				"\x0a\x4c"			\
				"\xd5\xf8"			\
				"\x8c\x74"			\
				"\x07\xf5\x80\x57"	\
				"\x0f\xce"			\
				"\x0f\xc4"			\
				"\x10\x3f"			\
				"\xfb\xdc"			\
				"\xd5\xf8"			\
				"\x88\x04"			\
				"\x04\x49"			\
				"\xd5\xf8"			\
				"\x8c\x24"			\
				"\xa8\x60"			\
				"\x69\x61"			\
				"\x2a\x61"			\
				"\x00\x20"			\
				"\xfe\xbd"			\
				"\xff\xff\xff\xff"	\
				"\xee\xee\xee\xee"

#endif //__LOKI_H_