| /* | 
 |  * General bootinfo record utilities | 
 |  * Author: Randy Vinson <rvinson@mvista.com> | 
 |  * | 
 |  * 2002 (c) MontaVista Software, Inc. This file is licensed under the terms | 
 |  * of the GNU General Public License version 2. This program is licensed | 
 |  * "as is" without any warranty of any kind, whether express or implied. | 
 |  */ | 
 |  | 
 | #include <linux/types.h> | 
 | #include <linux/string.h> | 
 | #include <asm/bootinfo.h> | 
 |  | 
 | #include "nonstdio.h" | 
 |  | 
 | static struct bi_record * birec = NULL; | 
 |  | 
 | static struct bi_record * | 
 | __bootinfo_build(struct bi_record *rec, unsigned long tag, unsigned long size, | 
 | 		 void *data) | 
 | { | 
 | 	/* set the tag */ | 
 | 	rec->tag = tag; | 
 |  | 
 | 	/* if the caller has any data, copy it */ | 
 | 	if (size) | 
 | 		memcpy(rec->data, (char *)data, size); | 
 |  | 
 | 	/* set the record size */ | 
 | 	rec->size = sizeof(struct bi_record) + size; | 
 |  | 
 | 	/* advance to the next available space */ | 
 | 	rec = (struct bi_record *)((unsigned long)rec + rec->size); | 
 |  | 
 | 	return rec; | 
 | } | 
 |  | 
 | void | 
 | bootinfo_init(struct bi_record *rec) | 
 | { | 
 |  | 
 | 	/* save start of birec area */ | 
 | 	birec = rec; | 
 |  | 
 | 	/* create an empty list */ | 
 | 	rec = __bootinfo_build(rec, BI_FIRST, 0, NULL); | 
 | 	(void) __bootinfo_build(rec, BI_LAST, 0, NULL); | 
 |  | 
 | } | 
 |  | 
 | void | 
 | bootinfo_append(unsigned long tag, unsigned long size, void * data) | 
 | { | 
 |  | 
 | 	struct bi_record *rec = birec; | 
 |  | 
 | 	/* paranoia */ | 
 | 	if ((rec == NULL) || (rec->tag != BI_FIRST)) | 
 | 		return; | 
 |  | 
 | 	/* find the last entry in the list */ | 
 | 	while (rec->tag != BI_LAST) | 
 | 		rec = (struct bi_record *)((ulong)rec + rec->size); | 
 |  | 
 | 	/* overlay BI_LAST record with new one and tag on a new BI_LAST */ | 
 | 	rec = __bootinfo_build(rec, tag, size, data); | 
 | 	(void) __bootinfo_build(rec, BI_LAST, 0, NULL); | 
 | } |