12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /*
- * arch/ppc/common/bootinfo.c
- *
- * 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);
- }
|