#include extern uint32 atags_ptr; int atag_valid(struct atag *a) { switch (a->tag) { case ATAG_NONE: return a->size == 2; case ATAG_CORE: return a->size == 2 || a->size == 5; case ATAG_MEM: case ATAG_INITRD2: case ATAG_SERIAL: return a->size == 4; case ATAG_VIDEOTEXT: case ATAG_RAMDISK: return a->size == 5; case ATAG_REVISION: return a->size == 3; case ATAG_VIDEOLFB: return a->size == 8; case ATAG_CMDLINE: return a->size >= 3; default: return 0; } } int _atags_mem_region(struct atag **mem_header, int initialize) { if (initialize) *mem_header = (struct atag *)atags_ptr; else *mem_header = (struct atag *)((uint32 *)*mem_header + (*mem_header)->size); while (atag_valid(*mem_header) && (*mem_header)->tag != ATAG_NONE && (*mem_header)->tag != ATAG_MEM) { *mem_header = (struct atag *)((uint32 *)*mem_header + (*mem_header)->size); } if (!atag_valid(*mem_header) || (*mem_header)->tag == ATAG_NONE) return -1; return 0; }