From owner-p4-projects@FreeBSD.ORG Fri Aug 22 13:01:53 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 41EC51065682; Fri, 22 Aug 2008 13:01:53 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 05017106567D for ; Fri, 22 Aug 2008 13:01:53 +0000 (UTC) (envelope-from vi0@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id E85A28FC13 for ; Fri, 22 Aug 2008 13:01:52 +0000 (UTC) (envelope-from vi0@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.2/8.14.2) with ESMTP id m7MD1qvX057311 for ; Fri, 22 Aug 2008 13:01:52 GMT (envelope-from vi0@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.2/8.14.1/Submit) id m7MD1qe8057309 for perforce@freebsd.org; Fri, 22 Aug 2008 13:01:52 GMT (envelope-from vi0@FreeBSD.org) Date: Fri, 22 Aug 2008 13:01:52 GMT Message-Id: <200808221301.m7MD1qe8057309@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to vi0@FreeBSD.org using -f From: Przemek Witaszczyk To: Perforce Change Reviews Cc: Subject: PERFORCE change 148109 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Aug 2008 13:01:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=148109 Change 148109 by vi0@vi0_gilgamesh.semihalf.com on 2008/08/22 13:01:19 Bootable kernel, panics at no PIC found. Fixed some basic routines from OF_xxx() family. Affected files ... .. //depot/projects/soc2008/vi0/efika/sys/dev/ofw/openfirm.c#5 edit Differences ... ==== //depot/projects/soc2008/vi0/efika/sys/dev/ofw/openfirm.c#5 (text+ko) ==== @@ -67,10 +67,18 @@ #include +#define NBPG 4096 /* bytes/page */ +#define PGOFSET (NBPG-1) /* byte offset into page */ +#define PGSHIFT 12 /* LOG2(NBPG) */ + MALLOC_DEFINE(M_OFWPROP, "openfirm", "Open Firmware properties"); static ihandle_t stdout; +char *OF_buf; + +void ofw_stack(void); + /* Initialiser */ void @@ -116,7 +124,7 @@ 1, 1, }; - + ofw_stack(); args.service = (cell_t)name; if (openfirmware(&args) == -1) return (-1); @@ -136,6 +144,7 @@ (cell_t)"interpret", 1, }; + ofw_stack(); cell_t status; int i = 0; @@ -169,7 +178,7 @@ 0, 1, }; - + ofw_stack(); openfirmware(&args); return (args.ms); } @@ -179,9 +188,10 @@ */ /* Return the next sibling of this node or 0. */ + phandle_t OF_peer(phandle_t node) -{ +{ static struct { cell_t name; cell_t nargs; @@ -193,7 +203,7 @@ 1, 1, }; - + ofw_stack(); args.node = node; if (openfirmware(&args) == -1) return (-1); @@ -215,7 +225,7 @@ 1, 1, }; - + ofw_stack(); args.node = node; if (openfirmware(&args) == -1) return (-1); @@ -237,7 +247,7 @@ 1, 1, }; - + ofw_stack(); args.node = node; if (openfirmware(&args) == -1) return (-1); @@ -259,7 +269,7 @@ 1, 1, }; - + ofw_stack(); args.instance = instance; if (openfirmware(&args) == -1) return (-1); @@ -282,7 +292,7 @@ 2, 1, }; - + ofw_stack(); args.package = package; args.propname = (cell_t)propname; if (openfirmware(&args) == -1) @@ -308,13 +318,29 @@ 4, 1, }; - + int flag = 0; + + ofw_stack(); + + if (buflen > PAGE_SIZE) + return (-1); args.package = package; args.propname = (cell_t)propname; - args.buf = (cell_t)buf; + + if(OF_buf == NULL) + args.buf = (cell_t)buf; + else{ + flag = 1; + args.buf = (cell_t)OF_buf; + } args.buflen = buflen; if (openfirmware(&args) == -1) return (-1); + if(args.size > buflen) + args.size = buflen; + if (flag == 1 && args.size > 0){ + bcopy(OF_buf, buf, args.size); + } return (args.size); } @@ -359,12 +385,13 @@ 3, 1, }; - + ofw_stack(); args.package = package; args.previous = (cell_t)previous; - args.buf = (cell_t)buf; + args.buf = (cell_t) OF_buf; if (openfirmware(&args) == -1) return (-1); + strncpy(buf, OF_buf, 32); return (args.flag); } @@ -387,10 +414,15 @@ 4, 1, }; + ofw_stack(); + + if (len > NBPG) + return -1; + bcopy(buf, OF_buf, len); args.package = package; args.propname = (cell_t)propname; - args.buf = (cell_t)buf; + args.buf = (cell_t) OF_buf; args.len = len; if (openfirmware(&args) == -1) return (-1); @@ -414,7 +446,7 @@ 3, 1, }; - + ofw_stack(); args.device = (cell_t)device; args.buf = (cell_t)buf; args.len = len; @@ -438,7 +470,7 @@ 1, 1, }; - + ofw_stack(); args.device = (cell_t)device; if (openfirmware(&args) == -1) return (-1); @@ -462,12 +494,17 @@ 3, 1, }; - + if (len > PAGE_SIZE) + return -1; args.instance = instance; - args.buf = (cell_t)buf; + args.buf = (cell_t) OF_buf; args.len = len; if (openfirmware(&args) == -1) return (-1); + if (args.len > len) + args.len = len; + if (args.len > 0) + bcopy(OF_buf, buf, args.len); return (args.size); } @@ -488,12 +525,18 @@ 3, 1, }; - + ofw_stack(); + if (len > PAGE_SIZE) + return -1; args.package = package; - args.buf = (cell_t)buf; + args.buf = (cell_t) OF_buf; args.len = len; if (openfirmware(&args) == -1) return (-1); + if (args.len > len) + args.len = len; + if (args.len > 0) + bcopy(OF_buf, buf, args.len); return (args.size); } @@ -555,8 +598,13 @@ 1, 1, }; - - args.device = (cell_t)device; + int l; + + ofw_stack(); + if ((l = strlen(device)) >= PAGE_SIZE) + return -1; + bcopy(device, OF_buf, l + 1); + args.device = (cell_t) OF_buf; if (openfirmware(&args) == -1 || args.instance == 0) { return (-1); } @@ -576,7 +624,7 @@ (cell_t)"close", 1, }; - + ofw_stack(); args.instance = instance; openfirmware(&args); } @@ -599,12 +647,15 @@ 1, }; + ofw_stack(); args.instance = instance; - args.addr = (cell_t)addr; + args.addr = (cell_t)OF_buf; args.len = len; if (openfirmware(&args) == -1) return (-1); + bcopy(OF_buf, addr, len); + return (args.actual); } @@ -625,10 +676,13 @@ 3, 1, }; - + + ofw_stack(); args.instance = instance; - args.addr = (cell_t)addr; + bcopy(addr, OF_buf, len); + args.addr = (cell_t)OF_buf; args.len = len; + if (openfirmware(&args) == -1) return (-1); return (args.actual); @@ -651,7 +705,7 @@ 3, 1, }; - + ofw_stack(); args.instance = instance; args.poshi = pos >> 32; args.poslo = pos; @@ -681,7 +735,7 @@ 3, 1, }; - + ofw_stack(); args.virt = (cell_t)virt; args.size = size; args.align = align; @@ -704,7 +758,7 @@ (cell_t)"release", 2, }; - + ofw_stack(); args.virt = (cell_t)virt; args.size = size; openfirmware(&args); @@ -727,8 +781,13 @@ (cell_t)"boot", 1, }; + int l; - args.bootspec = (cell_t)bootspec; + if ((l = strlen(bootspec)) >= PAGE_SIZE) + panic("OF_boot"); + ofw_stack(); + bcopy(bootspec, OF_buf, l + 1); + args.bootspec = (cell_t) OF_buf; openfirmware(&args); for (;;) /* just in case */ ; @@ -745,7 +804,7 @@ } args = { (cell_t)"enter", }; - + ofw_stack(); openfirmware(&args); /* We may come back. */ } @@ -761,7 +820,7 @@ } args = { (cell_t)"exit", }; - + ofw_stack(); openfirmware(&args); for (;;) /* just in case */ ; @@ -807,4 +866,27 @@ #endif entry(0, 0, openfirmware, arg, len); } + +/* +void +(*OF_set_callback (void (*newfunc)(void *))) (void *) + { + static struct { + const char *name; + int nargs; + int nreturns; + void (*newfunc)(void *); + void (*oldfunc)(void *); + } args = { + "set-callback", + 1, + 1, + }; + + ofw_stack(); + args.newfunc = newfunc; + if (openfirmware(&args) == -1) + return 0; + return args.oldfunc; +}*/ #endif