* ========== Copyright Header Begin ==========================================
* Hypervisor Software File: prom_prop.c
* Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
* - Do no alter or remove copyright notices
* - Redistribution and use of this software in source and binary forms, with
* or without modification, are permitted provided that the following
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of Sun Microsystems, Inc. or the names of contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
* MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN
* OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
* FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
* DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
* SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* You acknowledge that this software is not designed, licensed or
* intended for use in the design, construction, operation or maintenance of
* ========== Copyright Header End ============================================
* Copyright (c) 2000-2003 Sun Microsystems, Inc.
* Use is subject to license terms.
#pragma ident "@(#)prom_prop.c 1.1 00/08/07 SMI"
#include <sys/promimpl.h>
prom_getproplen(phandle_t nodeid
, caddr_t name
)
ci
[0] = p1275_ptr2cell("getproplen"); /* Service name */
ci
[1] = (cell_t
)2; /* #argument cells */
ci
[2] = (cell_t
)1; /* #return cells */
ci
[3] = p1275_phandle2cell(nodeid
); /* Arg1: package */
ci
[4] = p1275_ptr2cell(name
); /* Arg2: Property name */
ci
[5] = (cell_t
)-1; /* Res1: Prime result */
(void) p1275_cif_handler(&ci
);
return (p1275_cell2int(ci
[5])); /* Res1: Property length */
prom_getprop(phandle_t nodeid
, caddr_t name
, caddr_t buf
)
* This function assumes the buffer is large enough to
* hold the result, so we pass in the length of the
* property as the length of the buffer.
* Note that we ignore the "length" result of the service.
if ((len
= prom_getproplen(nodeid
, name
)) <= 0)
ci
[0] = p1275_ptr2cell("getprop"); /* Service name */
ci
[1] = (cell_t
)4; /* #argument cells */
ci
[2] = (cell_t
)0; /* #result cells */
ci
[3] = p1275_phandle2cell(nodeid
); /* Arg1: package */
ci
[4] = p1275_ptr2cell(name
); /* Arg2: property name */
ci
[5] = p1275_ptr2cell(buf
); /* Arg3: buffer address */
ci
[6] = len
; /* Arg4: buf len (assumed) */
rv
= p1275_cif_handler(&ci
);
return (len
); /* Return known length */
prom_bounded_getprop(phandle_t nodeid
, caddr_t name
, caddr_t buf
,
ci
[0] = p1275_ptr2cell("getprop"); /* Service name */
ci
[1] = (cell_t
)4; /* #argument cells */
ci
[2] = (cell_t
)1; /* #result cells */
ci
[3] = p1275_phandle2cell(nodeid
); /* Arg1: package */
ci
[4] = p1275_ptr2cell(name
); /* Arg2: property name */
ci
[5] = p1275_ptr2cell(buf
); /* Arg3: buffer address */
ci
[6] = p1275_int2cell(buflen
); /* Arg4: buffer length */
ci
[7] = (cell_t
)-1; /* Res1: Prime result */
(void) p1275_cif_handler(&ci
);
return (p1275_cell2int(ci
[7])); /* Res1: Returned length */
prom_nextprop(phandle_t nodeid
, caddr_t previous
, caddr_t next
)
(void) prom_strcpy(next
, ""); /* Prime result, in case call fails */
ci
[0] = p1275_ptr2cell("nextprop"); /* Service name */
ci
[1] = (cell_t
)3; /* #argument cells */
ci
[2] = (cell_t
)1; /* #result cells */
ci
[3] = p1275_phandle2cell(nodeid
); /* Arg1: phandle */
ci
[4] = p1275_ptr2cell(previous
); /* Arg2: addr of prev name */
ci
[5] = p1275_ptr2cell(next
); /* Arg3: addr of 32 byte buf */
(void) p1275_cif_handler(&ci
);
return (p1275_cell2int(ci
[6]));
prom_setprop(phandle_t nodeid
, caddr_t name
, caddr_t buf
, int32_t buflen
)
ci
[0] = p1275_ptr2cell("setprop"); /* Service name */
ci
[1] = (cell_t
)4; /* #argument cells */
ci
[2] = (cell_t
)1; /* #result cells */
ci
[3] = p1275_phandle2cell(nodeid
); /* Arg1: phandle */
ci
[4] = p1275_ptr2cell(name
); /* Arg2: property name */
ci
[5] = p1275_ptr2cell(buf
); /* Arg3: New value ptr */
ci
[6] = p1275_int2cell(buflen
); /* Arg4: New value len */
ci
[7] = (cell_t
)-1; /* Res1: Prime result */
(void) p1275_cif_handler(&ci
);
return (p1275_cell2int(ci
[7])); /* Res1: Actual new size */
* prom_decode_composite_string:
* Returns successive strings in a composite string property.
* A composite string property is a buffer containing one or more
* NULL terminated strings contained within the length of the buffer.
* Always call with the base address and length of the property buffer.
* On the first call, call with prev == 0, call successively
* with prev set to the last value returned from this function
* until the routine returns zero which means no more string values.
prom_decode_composite_string(void *buf
, size_t buflen
, char *prev
)
if ((buf
== 0) || (buflen
== 0) || ((int)buflen
== -1))
prev
+= prom_strlen(prev
) + 1;
if (prev
>= ((char *)buf
+ buflen
))