diff options
Diffstat (limited to 'usr/src/cmd/devfsadm')
-rw-r--r-- | usr/src/cmd/devfsadm/Makefile | 24 | ||||
-rw-r--r-- | usr/src/cmd/devfsadm/Makefile.com | 145 | ||||
-rw-r--r-- | usr/src/cmd/devfsadm/devfsadm.h | 5 | ||||
-rw-r--r-- | usr/src/cmd/devfsadm/drm_link_i386.c | 318 | ||||
-rw-r--r-- | usr/src/cmd/devfsadm/i386/Makefile | 6 | ||||
-rw-r--r-- | usr/src/cmd/devfsadm/i386/misc_link_i386.c | 656 | ||||
-rw-r--r-- | usr/src/cmd/devfsadm/mapfile-vers | 64 | ||||
-rw-r--r-- | usr/src/cmd/devfsadm/sparc/Makefile | 28 |
8 files changed, 430 insertions, 816 deletions
diff --git a/usr/src/cmd/devfsadm/Makefile b/usr/src/cmd/devfsadm/Makefile index e008e8f..0f03abc 100644 --- a/usr/src/cmd/devfsadm/Makefile +++ b/usr/src/cmd/devfsadm/Makefile @@ -24,10 +24,6 @@ # cmd/devfsadm/Makefile # -DEFAULTFILES = devfsadm.dfl - -ETCDEVFILES=reserved_devnames - include ../Makefile.cmd # @@ -42,27 +38,9 @@ clobber := TARGET= clobber _msg := TARGET= _msg lint := TARGET= lint -ROOTETCDEV= $(ROOTETC)/dev -ROOTETCDEVFILES=$(ETCDEVFILES:%=$(ROOTETCDEV)/%) -$(ROOTETCDEV) := DIRMODE= 755 -$(ROOTETCDEVFILES) := FILEMODE = 0644 - .KEEP_STATE: -all: $(SUBDIRS) $(ETCDEVFILES) - -clean lint _msg: $(SUBDIRS) - -clobber: $(SUBDIRS) - $(RM) $(ROOTETCDEVFILES) - -install: $(SUBDIRS) $(ROOTETCDEFAULTFILES) $(ROOTETCDEVFILES) - -$(ROOTETCDEV): - $(INS.dir) - -$(ROOTETCDEV)/% : % $(ROOTETCDEV) - $(INS.file) +all install clean clobber lint _msg: $(SUBDIRS) $(SUBDIRS): FRC @cd $@; pwd; $(MAKE) $(TARGET) diff --git a/usr/src/cmd/devfsadm/Makefile.com b/usr/src/cmd/devfsadm/Makefile.com index 4df3b00..39c7cc6 100644 --- a/usr/src/cmd/devfsadm/Makefile.com +++ b/usr/src/cmd/devfsadm/Makefile.com @@ -22,165 +22,70 @@ # Use is subject to license terms. # -# This target builds both a command (daemon) and various shared objects. This -# isn't a typical target, and the inclusion of both library and command -# Makefiles were probably not in their original design. However, there doesn't -# presently seem to be a clash of any required definitions. -include ../../../lib/Makefile.lib -include ../../Makefile.cmd +include $(SRC)/lib/Makefile.lib COMMON = .. -UTSBASE = $(COMMON)/../../uts - -DEVFSADM_MOD = devfsadm - -DEVALLOCSRC = devalloc.c - -PLCYSRC = devpolicy.c plcysubr.c - -MODLOADDIR = $(COMMON)/../modload - -DEVFSADM_SRC = $(COMMON)/$(DEVFSADM_MOD:%=%.c) \ - $(DEVALLOCSRC:%=$(COMMON)/%) $(PLCYSRC:%=$(COMMON)/%) -DEVFSADM_OBJ = $(DEVFSADM_MOD:%=%.o) $(DEVALLOCSRC:%.c=%.o) $(PLCYSRC:%.c=%.o) - -DEVFSADM_DAEMON = devfsadmd +UTSBASE = $(SRC)/uts LINKMOD_DIR = linkmod DEVFSADM_DIR = devfsadm -CLOBBERFILES = $(MODS) $(DEVLINKTAB) $(DEVFSCOMPATLINKS) $(DEVFSADM_DAEMON) -CLOBBERFILES += $(POFILE) $(POFILES) ../plcysubr.c - -LINK_OBJS_CMN = \ - disk_link.o \ - ieee1394_link.o \ - dcam1394_link.o \ - tape_link.o \ - usb_link.o \ - port_link.o \ - audio_link.o \ - cfg_link.o \ - misc_link.o \ - lofi_link.o \ - ramdisk_link.o \ - fssnap_link.o \ - sgen_link.o \ - smp_link.o \ - md_link.o \ - dtrace_link.o \ - vscan_link.o \ - zfs_link.o \ - zut_link.o +CLOBBERFILES = $(LINK_MODS) + +LINK_OBJS_CMN = LINK_OBJS = $(LINK_OBJS_CMN) \ $(LINK_OBJS_$(MACH)) -LINK_SRCS = $(LINK_OBJS_CMN:%.o=$(COMMON)/%.c) \ - $(LINK_OBJS_$(MACH):%.o=%.c) - -LINT_MODULES = $(LINK_SRCS:%.c=%.ln) - LINK_MODS = $(LINK_OBJS:%.o=SUNW_%.so) -DEVLINKTAB = devlink.tab -DEVLINKTAB_SRC = $(COMMON)/$(DEVLINKTAB).sh - -COMPAT_LINKS = disks tapes ports audlinks devlinks drvconfig - CPPFLAGS += -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT \ - -I$(COMMON) -I$(UTSBASE)/common -I$(MODLOADDIR) + -I$(COMMON) -I$(UTSBASE)/common CFLAGS += $(CCVERBOSE) $(C_PICFLAGS) -LINTFLAGS += -erroff=E_NAME_USED_NOT_DEF2 -LINTFLAGS += -erroff=E_NAME_DEF_NOT_USED2 -LINTFLAGS += -erroff=E_NAME_MULTIPLY_DEF2 - -CERRWARN += -_gcc=-Wno-uninitialized -CERRWARN += -_gcc=-Wno-char-subscripts -CERRWARN += -_gcc=-Wno-parentheses - # Define the dependencies required by devfsadm and all shared objects. LDLIBS += -ldevinfo -devfsadm := LDLIBS += -lgen -lsysevent -lnvpair -lzonecfg -lbsm -SUNW_md_link.so := LDLIBS += -lmeta -SUNW_disk_link.so := LDLIBS += -ldevid -SUNW_sgen_link.so := LDLIBS += -ldevid # All libraries are built from the same SUNW_%.so rule (see below), and define # their own SONAME using -h explicitly. Null the generic -h macro that gets # inherited from Makefile.lib, otherwise we'll get two -h definitions. HSONAME = -SRCS = $(DEVFSADM_SRC) $(LINK_SRCS) -OBJS = $(DEVFSADM_OBJ) $(LINK_OBJS) -MODS = $(DEVFSADM_MOD) $(LINK_MODS) +OBJS = $(LINK_OBJS) -POFILES = $(LINK_SRCS:.c=.po) $(DEVFSADM_SRC:.c=.po) -POFILE = pdevfsadm.po +POFILES = +POFILE = # install specifics -ROOTLIB_DEVFSADM = $(ROOTLIB)/$(DEVFSADM_DIR) +ROOTLIB_DEVFSADM = $(ROOTLIBDIR)/$(DEVFSADM_DIR) ROOTLIB_DEVFSADM_LINKMOD = $(ROOTLIB_DEVFSADM)/$(LINKMOD_DIR) - ROOTLIB_DEVFSADM_LINK_MODS = $(LINK_MODS:%=$(ROOTLIB_DEVFSADM_LINKMOD)/%) -ROOTUSRSBIN_COMPAT_LINKS = $(COMPAT_LINKS:%=$(ROOTUSRSBIN)/%) - -ROOTUSRSBIN_DEVFSADM = $(DEVFSADM_MOD:%=$(ROOTUSRSBIN)/%) - -ROOTLIB_DEVFSADM_DAEMON = $(ROOTLIB_DEVFSADM)/$(DEVFSADM_DAEMON) - -ROOTETC_DEVLINKTAB = $(DEVLINKTAB:%=$(ROOTETC)/%) - FILEMODE= 755 -$(ROOTETC_DEVLINKTAB) := FILEMODE = 644 - all := TARGET= all install := TARGET= install clean := TARGET= clean clobber := TARGET= clobber lint := TARGET= lint - .KEEP_STATE: -all: $(MODS) $(DEVLINKTAB) +all: $(LINK_MODS) install: all \ $(ROOTLIB_DEVFSADM) \ $(ROOTLIB_DEVFSADM_LINKMOD) \ - $(ROOTUSRSBIN_DEVFSADM) \ - $(ROOTETC_DEVLINKTAB) \ - $(ROOTLIB_DEVFSADM_LINK_MODS) \ - $(ROOTUSRINCLUDE) \ - $(ROOTLIB_DEVFSADM_DAEMON) \ - $(ROOTUSRSBIN_COMPAT_LINKS) - + $(ROOTLIB_DEVFSADM_LINK_MODS) clean: $(RM) $(OBJS) - -lint: $(DEVFSADM_MOD).ln $(LINT_MODULES) - -devfsadm.ln: $(DEVFSADM_SRC) - $(LINT.c) $(DEVFSADM_SRC) $(LDLIBS) - -%.ln: $(DEVFSADM_SRC) %.c - $(LINT.c) $(DEVFSADM_SRC) $(@:.ln=.c) $(LDLIBS) +lint: include ../../Makefile.targ -$(POFILE): $(POFILES) - $(RM) $@; cat $(POFILES) > $@ - -$(DEVFSADM_MOD): $(DEVFSADM_OBJ) - $(LINK.c) -o $@ $< $(DEVFSADM_OBJ) $(LDLIBS) - $(POST_PROCESS) - SUNW_%.so: %.o $(MAPFILES) $(CC) -o $@ $(GSHARED) $(DYNFLAGS) -h $@ $< $(LDLIBS) -lc $(POST_PROCESS_SO) @@ -189,35 +94,11 @@ SUNW_%.so: %.o $(MAPFILES) $(COMPILE.c) -o $@ $< $(CTFCONVERT_HOOK) $(POST_PROCESS_O) - -$(DEVLINKTAB): $(DEVLINKTAB_SRC) - $(RM) $(DEVLINKTAB) - /bin/sh $(DEVLINKTAB_SRC) > $(DEVLINKTAB) - -$(ROOTUSRSBIN): - $(INS.dir) - $(ROOTLIB_DEVFSADM): $(INS.dir) -$(ROOTUSRINCLUDE): - $(INS.dir) - $(ROOTLIB_DEVFSADM_LINKMOD): $(INS.dir) $(ROOTLIB_DEVFSADM_LINKMOD)/%: % $(INS.file) - -$(ROOTLIB_DEVFSADM_DAEMON): - $(RM) $@; $(SYMLINK) ../../sbin/$(DEVFSADM_DIR) $@ - -$(ROOTUSRSBIN_COMPAT_LINKS): $(ROOTUSRSBIN_DEVFSADM) - $(RM) $@ ; $(LN) $(ROOTUSRSBIN_DEVFSADM) $@ - -# -# Source shared with add_drv/update_drv -# -../plcysubr.c: - rm -f $@ - ln -s ../modload/plcysubr.c .. diff --git a/usr/src/cmd/devfsadm/devfsadm.h b/usr/src/cmd/devfsadm/devfsadm.h index 3d801f6..5948ae9 100644 --- a/usr/src/cmd/devfsadm/devfsadm.h +++ b/usr/src/cmd/devfsadm/devfsadm.h @@ -22,6 +22,11 @@ * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. */ +/* + * Note: This header was copied from illumos-gate as a temporary meausre + * until illumos-gate installs this header in /usr/include for us. XXX + */ + #ifndef _DEVFSADM_H #define _DEVFSADM_H diff --git a/usr/src/cmd/devfsadm/drm_link_i386.c b/usr/src/cmd/devfsadm/drm_link_i386.c new file mode 100644 index 0000000..ab29ab7 --- /dev/null +++ b/usr/src/cmd/devfsadm/drm_link_i386.c @@ -0,0 +1,318 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * Copyright 2010 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + * Copyright 2012 Joyent, Inc. All rights reserved. + */ + +#include <regex.h> +#include <devfsadm.h> +#include <stdio.h> +#include <strings.h> +#include <stdlib.h> +#include <limits.h> +#include <ctype.h> + +/* + * Note: separate from misc_link_i386.c because this will later + * move to the gfx-drm gate. + */ + +static int agp_process(di_minor_t minor, di_node_t node); +static int drm_node(di_minor_t minor, di_node_t node); + +static devfsadm_create_t drm_cbt[] = { + { "drm", "ddi_display:drm", NULL, + TYPE_EXACT, ILEVEL_0, drm_node + }, + { "agp", "ddi_agp:pseudo", NULL, + TYPE_EXACT, ILEVEL_0, agp_process + }, + { "agp", "ddi_agp:target", NULL, + TYPE_EXACT, ILEVEL_0, agp_process + }, + { "agp", "ddi_agp:cpugart", NULL, + TYPE_EXACT, ILEVEL_0, agp_process + }, + { "agp", "ddi_agp:master", NULL, + TYPE_EXACT, ILEVEL_0, agp_process + }, +}; + +DEVFSADM_CREATE_INIT_V0(drm_cbt); + +/* + * For debugging, run devfsadm like this: + * devfsadm -V drm_mid -V devfsadm:enum -c drm + */ +static char *debug_mid = "drm_mid"; + +typedef enum { + DRIVER_AGPPSEUDO = 0, + DRIVER_AGPTARGET, + DRIVER_CPUGART, + DRIVER_AGPMASTER_DRM_I915, + DRIVER_AGPMASTER_DRM_RADEON, + DRIVER_AGPMASTER_VGATEXT, + DRIVER_UNKNOWN +} driver_defs_t; + +typedef struct { + char *driver_name; + int index; +} driver_name_table_entry_t; + +static driver_name_table_entry_t driver_name_table[] = { + { "agpgart", DRIVER_AGPPSEUDO }, + { "agptarget", DRIVER_AGPTARGET }, + { "amd64_gart", DRIVER_CPUGART }, + /* AGP master device managed by drm driver */ + { "i915", DRIVER_AGPMASTER_DRM_I915 }, + { "radeon", DRIVER_AGPMASTER_DRM_RADEON }, + { "vgatext", DRIVER_AGPMASTER_VGATEXT }, + { NULL, DRIVER_UNKNOWN } +}; + +static devfsadm_enumerate_t agptarget_rules[1] = + { "^agp$/^agptarget([0-9]+)$", 1, MATCH_ALL }; +static devfsadm_enumerate_t cpugart_rules[1] = + { "^agp$/^cpugart([0-9]+)$", 1, MATCH_ALL }; +static devfsadm_enumerate_t agpmaster_rules[1] = + { "^agp$/^agpmaster([0-9]+)$", 1, MATCH_ALL }; +static devfsadm_enumerate_t drm_rules[1] = + { "^dri$/^card([0-9]+)$", 1, MATCH_ALL }; + + +/* + * HOT auto cleanup of drm+agp links not desired. + */ +static devfsadm_remove_t drm_remove_cbt[] = { + { "agp", "^agpgart$", RM_POST, + ILEVEL_0, devfsadm_rm_all + }, + { "agp", "^agp/agpmaster[0-9]+$", RM_POST, + ILEVEL_0, devfsadm_rm_all + }, + { "agp", "^agp/agptarget[0-9]+$", RM_POST, + ILEVEL_0, devfsadm_rm_all + }, + { "agp", "^agp/cpugart[0-9]+$", RM_POST, + ILEVEL_0, devfsadm_rm_all + }, + { "drm", "^dri/card[0-9]+$", RM_POST, + ILEVEL_0, devfsadm_rm_all + }, +}; + +DEVFSADM_REMOVE_INIT_V0(drm_remove_cbt); + +static int +agp_process(di_minor_t minor, di_node_t node) +{ + char *minor_nm, *drv_nm; + char *devfspath; + char *I_path, *p_path, *buf; + char *name = (char *)NULL; + int i, index; + devfsadm_enumerate_t rules[1]; + + minor_nm = di_minor_name(minor); + drv_nm = di_driver_name(node); + + if ((minor_nm == NULL) || (drv_nm == NULL)) { + return (DEVFSADM_CONTINUE); + } + + devfsadm_print(debug_mid, "agp_process: minor=%s node=%s\n", + minor_nm, di_node_name(node)); + + devfspath = di_devfs_path(node); + if (devfspath == NULL) { + devfsadm_print(debug_mid, "agp_process: devfspath is NULL\n"); + return (DEVFSADM_CONTINUE); + } + + I_path = (char *)malloc(PATH_MAX); + + if (I_path == NULL) { + di_devfs_path_free(devfspath); + devfsadm_print(debug_mid, "agp_process: malloc failed\n"); + return (DEVFSADM_CONTINUE); + } + + p_path = (char *)malloc(PATH_MAX); + + if (p_path == NULL) { + devfsadm_print(debug_mid, "agp_process: malloc failed\n"); + di_devfs_path_free(devfspath); + free(I_path); + return (DEVFSADM_CONTINUE); + } + + (void) strlcpy(p_path, devfspath, PATH_MAX); + (void) strlcat(p_path, ":", PATH_MAX); + (void) strlcat(p_path, minor_nm, PATH_MAX); + di_devfs_path_free(devfspath); + + devfsadm_print(debug_mid, "agp_process: path %s\n", p_path); + + for (i = 0; ; i++) { + if ((driver_name_table[i].driver_name == NULL) || + (strcmp(drv_nm, driver_name_table[i].driver_name) == 0)) { + index = driver_name_table[i].index; + break; + } + } + switch (index) { + case DRIVER_AGPPSEUDO: + devfsadm_print(debug_mid, + "agp_process: psdeudo driver name\n"); + name = "agpgart"; + (void) snprintf(I_path, PATH_MAX, "%s", name); + devfsadm_print(debug_mid, + "mklink %s -> %s\n", I_path, p_path); + + (void) devfsadm_mklink(I_path, node, minor, 0); + + free(I_path); + free(p_path); + return (DEVFSADM_CONTINUE); + case DRIVER_AGPTARGET: + devfsadm_print(debug_mid, + "agp_process: target driver name\n"); + rules[0] = agptarget_rules[0]; + name = "agptarget"; + break; + case DRIVER_CPUGART: + devfsadm_print(debug_mid, + "agp_process: cpugart driver name\n"); + rules[0] = cpugart_rules[0]; + name = "cpugart"; + break; + case DRIVER_AGPMASTER_DRM_I915: + case DRIVER_AGPMASTER_DRM_RADEON: + case DRIVER_AGPMASTER_VGATEXT: + devfsadm_print(debug_mid, + "agp_process: agpmaster driver name\n"); + rules[0] = agpmaster_rules[0]; + name = "agpmaster"; + break; + case DRIVER_UNKNOWN: + devfsadm_print(debug_mid, + "agp_process: unknown driver name=%s\n", drv_nm); + free(I_path); + free(p_path); + return (DEVFSADM_CONTINUE); + } + + if (devfsadm_enumerate_int(p_path, 0, &buf, rules, 1)) { + devfsadm_print(debug_mid, "agp_process: exit/coninue\n"); + free(I_path); + free(p_path); + return (DEVFSADM_CONTINUE); + } + + + (void) snprintf(I_path, PATH_MAX, "agp/%s%s", name, buf); + + devfsadm_print(debug_mid, "agp_process: p_path=%s buf=%s\n", + p_path, buf); + + free(buf); + + devfsadm_print(debug_mid, "mklink %s -> %s\n", I_path, p_path); + + (void) devfsadm_mklink(I_path, node, minor, 0); + + free(p_path); + free(I_path); + + return (DEVFSADM_CONTINUE); +} + +static int +drm_node(di_minor_t minor, di_node_t node) +{ + char *minor_nm, *drv_nm; + char *devfspath; + char *I_path, *p_path, *buf; + char *name = "card"; + + minor_nm = di_minor_name(minor); + drv_nm = di_driver_name(node); + if ((minor_nm == NULL) || (drv_nm == NULL)) { + return (DEVFSADM_CONTINUE); + } + + devfsadm_print(debug_mid, "drm_node: minor=%s node=%s type=%s\n", + minor_nm, di_node_name(node), di_minor_nodetype(minor)); + + devfspath = di_devfs_path(node); + if (devfspath == NULL) { + devfsadm_print(debug_mid, "drm_node: devfspath is NULL\n"); + return (DEVFSADM_CONTINUE); + } + + I_path = (char *)malloc(PATH_MAX); + + if (I_path == NULL) { + di_devfs_path_free(devfspath); + devfsadm_print(debug_mid, "drm_node: malloc failed\n"); + return (DEVFSADM_CONTINUE); + } + + p_path = (char *)malloc(PATH_MAX); + + if (p_path == NULL) { + devfsadm_print(debug_mid, "drm_node: malloc failed\n"); + di_devfs_path_free(devfspath); + free(I_path); + return (DEVFSADM_CONTINUE); + } + + (void) strlcpy(p_path, devfspath, PATH_MAX); + (void) strlcat(p_path, ":", PATH_MAX); + (void) strlcat(p_path, minor_nm, PATH_MAX); + di_devfs_path_free(devfspath); + + devfsadm_print(debug_mid, "drm_node: p_path %s\n", p_path); + + if (devfsadm_enumerate_int(p_path, 0, &buf, drm_rules, 1)) { + free(p_path); + devfsadm_print(debug_mid, "drm_node: exit/coninue\n"); + return (DEVFSADM_CONTINUE); + } + (void) snprintf(I_path, PATH_MAX, "dri/%s%s", name, buf); + + devfsadm_print(debug_mid, "drm_node: p_path=%s buf=%s\n", + p_path, buf); + + free(buf); + + devfsadm_print(debug_mid, "mklink %s -> %s\n", I_path, p_path); + (void) devfsadm_mklink(I_path, node, minor, 0); + + free(p_path); + free(I_path); + + return (0); +} diff --git a/usr/src/cmd/devfsadm/i386/Makefile b/usr/src/cmd/devfsadm/i386/Makefile index 1f14c93..cf819bd 100644 --- a/usr/src/cmd/devfsadm/i386/Makefile +++ b/usr/src/cmd/devfsadm/i386/Makefile @@ -23,10 +23,6 @@ # LINK_OBJS_i386 = \ - misc_link_i386.o \ - xen_link.o - -xen_link.o xen_link.ln xen_link.po := CPPFLAGS += -I$(UTSBASE)/i86xpv + drm_link_i386.o include ../Makefile.com - diff --git a/usr/src/cmd/devfsadm/i386/misc_link_i386.c b/usr/src/cmd/devfsadm/i386/misc_link_i386.c deleted file mode 100644 index 5d2e18a..0000000 --- a/usr/src/cmd/devfsadm/i386/misc_link_i386.c +++ /dev/null @@ -1,656 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - * Copyright 2012 Joyent, Inc. All rights reserved. - */ - -#include <regex.h> -#include <devfsadm.h> -#include <stdio.h> -#include <strings.h> -#include <stdlib.h> -#include <limits.h> -#include <ctype.h> -#include <sys/mc_amd.h> -#include <bsm/devalloc.h> - -extern int system_labeled; - -static int lp(di_minor_t minor, di_node_t node); -static int serial_dialout(di_minor_t minor, di_node_t node); -static int serial(di_minor_t minor, di_node_t node); -static int diskette(di_minor_t minor, di_node_t node); -static int vt00(di_minor_t minor, di_node_t node); -static int kdmouse(di_minor_t minor, di_node_t node); -static int ipmi(di_minor_t minor, di_node_t node); -static int smbios(di_minor_t minor, di_node_t node); -static int agp_process(di_minor_t minor, di_node_t node); -static int drm_node(di_minor_t minor, di_node_t node); -static int mc_node(di_minor_t minor, di_node_t node); -static int xsvc(di_minor_t minor, di_node_t node); -static int srn(di_minor_t minor, di_node_t node); -static int ucode(di_minor_t minor, di_node_t node); -static int heci(di_minor_t minor, di_node_t node); - - -static devfsadm_create_t misc_cbt[] = { - { "vt00", "ddi_display", NULL, - TYPE_EXACT, ILEVEL_0, vt00 - }, - { "drm", "ddi_display:drm", NULL, - TYPE_EXACT, ILEVEL_0, drm_node - }, - { "mouse", "ddi_mouse", "mouse8042", - TYPE_EXACT | DRV_EXACT, ILEVEL_0, kdmouse - }, - { "pseudo", "ddi_pseudo", "ipmi", - TYPE_EXACT | DRV_EXACT, ILEVEL_0, ipmi, - }, - { "pseudo", "ddi_pseudo", "smbios", - TYPE_EXACT | DRV_EXACT, ILEVEL_1, smbios, - }, - /* floppies share the same class, but not link regex, as hard disks */ - { "disk", "ddi_block:diskette", NULL, - TYPE_EXACT, ILEVEL_1, diskette - }, - { "parallel", "ddi_printer", NULL, - TYPE_EXACT, ILEVEL_1, lp - }, - { "serial", "ddi_serial:mb", NULL, - TYPE_EXACT, ILEVEL_1, serial - }, - { "serial", "ddi_serial:dialout,mb", NULL, - TYPE_EXACT, ILEVEL_1, serial_dialout - }, - { "agp", "ddi_agp:pseudo", NULL, - TYPE_EXACT, ILEVEL_0, agp_process - }, - { "agp", "ddi_agp:target", NULL, - TYPE_EXACT, ILEVEL_0, agp_process - }, - { "agp", "ddi_agp:cpugart", NULL, - TYPE_EXACT, ILEVEL_0, agp_process - }, - { "agp", "ddi_agp:master", NULL, - TYPE_EXACT, ILEVEL_0, agp_process - }, - { "pseudo", "ddi_pseudo", NULL, - TYPE_EXACT, ILEVEL_0, xsvc - }, - { "pseudo", "ddi_pseudo", NULL, - TYPE_EXACT, ILEVEL_0, srn - }, - { "memory-controller", "ddi_mem_ctrl", NULL, - TYPE_EXACT, ILEVEL_0, mc_node - }, - { "pseudo", "ddi_pseudo", "ucode", - TYPE_EXACT | DRV_EXACT, ILEVEL_0, ucode, - }, - { "pseudo", "ddi_pseudo", "heci", - TYPE_EXACT | DRV_EXACT, ILEVEL_0, heci, - } -}; - -DEVFSADM_CREATE_INIT_V0(misc_cbt); - -static char *debug_mid = "misc_mid"; - -typedef enum { - DRIVER_AGPPSEUDO = 0, - DRIVER_AGPTARGET, - DRIVER_CPUGART, - DRIVER_AGPMASTER_DRM_I915, - DRIVER_AGPMASTER_DRM_RADEON, - DRIVER_AGPMASTER_VGATEXT, - DRIVER_UNKNOWN -} driver_defs_t; - -typedef struct { - char *driver_name; - int index; -} driver_name_table_entry_t; - -static driver_name_table_entry_t driver_name_table[] = { - { "agpgart", DRIVER_AGPPSEUDO }, - { "agptarget", DRIVER_AGPTARGET }, - { "amd64_gart", DRIVER_CPUGART }, - /* AGP master device managed by drm driver */ - { "i915", DRIVER_AGPMASTER_DRM_I915 }, - { "radeon", DRIVER_AGPMASTER_DRM_RADEON }, - { "vgatext", DRIVER_AGPMASTER_VGATEXT }, - { NULL, DRIVER_UNKNOWN } -}; - -static devfsadm_enumerate_t agptarget_rules[1] = - { "^agp$/^agptarget([0-9]+)$", 1, MATCH_ALL }; -static devfsadm_enumerate_t cpugart_rules[1] = - { "^agp$/^cpugart([0-9]+)$", 1, MATCH_ALL }; -static devfsadm_enumerate_t agpmaster_rules[1] = - { "^agp$/^agpmaster([0-9]+)$", 1, MATCH_ALL }; - -static devfsadm_remove_t misc_remove_cbt[] = { - { "vt", "vt[0-9][0-9]", RM_PRE|RM_ALWAYS, - ILEVEL_0, devfsadm_rm_all - }, - { "pseudo", "^ucode$", RM_ALWAYS | RM_PRE | RM_HOT, - ILEVEL_0, devfsadm_rm_all - }, - { "mouse", "^kdmouse$", RM_ALWAYS | RM_PRE, - ILEVEL_0, devfsadm_rm_all - }, - { "disk", "^(diskette|rdiskette)([0-9]*)$", - RM_ALWAYS | RM_PRE, ILEVEL_1, devfsadm_rm_all - }, - { "parallel", "^(lp|ecpp)([0-9]+)$", RM_ALWAYS | RM_PRE, - ILEVEL_1, devfsadm_rm_all - }, - { "serial", "^(tty|ttyd)([0-9]+)$", RM_ALWAYS | RM_PRE, - ILEVEL_1, devfsadm_rm_all - }, - { "serial", "^tty[a-z]$", RM_ALWAYS | RM_PRE, - ILEVEL_1, devfsadm_rm_all - } -}; - -DEVFSADM_REMOVE_INIT_V0(misc_remove_cbt); - -/* - * Handles minor node type "ddi_display", in addition to generic processing - * done by display(). - * - * This creates a /dev/vt00 link to /dev/fb, for backwards compatibility. - */ -/* ARGSUSED */ -int -vt00(di_minor_t minor, di_node_t node) -{ - (void) devfsadm_secondary_link("vt00", "fb", 0); - return (DEVFSADM_CONTINUE); -} - -/* - * type=ddi_block:diskette;addr=0,0;minor=c diskette - * type=ddi_block:diskette;addr=0,0;minor=c,raw rdiskette - * type=ddi_block:diskette;addr1=0;minor=c diskette\A2 - * type=ddi_block:diskette;addr1=0;minor=c,raw rdiskette\A2 - */ -static int -diskette(di_minor_t minor, di_node_t node) -{ - int flags = 0; - char *a2; - char link[PATH_MAX]; - char *addr = di_bus_addr(node); - char *mn = di_minor_name(minor); - - if (system_labeled) - flags = DA_ADD|DA_FLOPPY; - - if (strcmp(addr, "0,0") == 0) { - if (strcmp(mn, "c") == 0) { - (void) devfsadm_mklink("diskette", node, minor, flags); - } else if (strcmp(mn, "c,raw") == 0) { - (void) devfsadm_mklink("rdiskette", node, minor, flags); - } - - } - - if (addr[0] == '0') { - if ((a2 = strchr(addr, ',')) != NULL) { - a2++; - if (strcmp(mn, "c") == 0) { - (void) strcpy(link, "diskette"); - (void) strcat(link, a2); - (void) devfsadm_mklink(link, node, minor, - flags); - } else if (strcmp(mn, "c,raw") == 0) { - (void) strcpy(link, "rdiskette"); - (void) strcat(link, a2); - (void) devfsadm_mklink(link, node, minor, - flags); - } - } - } - - return (DEVFSADM_CONTINUE); -} - -/* - * type=ddi_printer;name=lp;addr=1,3bc lp0 - * type=ddi_printer;name=lp;addr=1,378 lp1 - * type=ddi_printer;name=lp;addr=1,278 lp2 - */ -static int -lp(di_minor_t minor, di_node_t node) -{ - char *addr = di_bus_addr(node); - char *buf; - char path[PATH_MAX + 1]; - devfsadm_enumerate_t rules[1] = {"^ecpp([0-9]+)$", 1, MATCH_ALL}; - - if (strcmp(addr, "1,3bc") == 0) { - (void) devfsadm_mklink("lp0", node, minor, 0); - - } else if (strcmp(addr, "1,378") == 0) { - (void) devfsadm_mklink("lp1", node, minor, 0); - - } else if (strcmp(addr, "1,278") == 0) { - (void) devfsadm_mklink("lp2", node, minor, 0); - } - - if (strcmp(di_driver_name(node), "ecpp") != 0) { - return (DEVFSADM_CONTINUE); - } - - if ((buf = di_devfs_path(node)) == NULL) { - return (DEVFSADM_CONTINUE); - } - - (void) snprintf(path, sizeof (path), "%s:%s", - buf, di_minor_name(minor)); - - di_devfs_path_free(buf); - - if (devfsadm_enumerate_int(path, 0, &buf, rules, 1)) { - return (DEVFSADM_CONTINUE); - } - - (void) snprintf(path, sizeof (path), "ecpp%s", buf); - free(buf); - (void) devfsadm_mklink(path, node, minor, 0); - return (DEVFSADM_CONTINUE); -} - -/* - * type=ddi_serial:mb;minor=a tty00 - * type=ddi_serial:mb;minor=b tty01 - * type=ddi_serial:mb;minor=c tty02 - * type=ddi_serial:mb;minor=d tty03 - */ -static int -serial(di_minor_t minor, di_node_t node) -{ - - char *mn = di_minor_name(minor); - char link[PATH_MAX]; - - (void) strcpy(link, "tty"); - (void) strcat(link, mn); - (void) devfsadm_mklink(link, node, minor, 0); - - if (strcmp(mn, "a") == 0) { - (void) devfsadm_mklink("tty00", node, minor, 0); - - } else if (strcmp(mn, "b") == 0) { - (void) devfsadm_mklink("tty01", node, minor, 0); - - } else if (strcmp(mn, "c") == 0) { - (void) devfsadm_mklink("tty02", node, minor, 0); - - } else if (strcmp(mn, "d") == 0) { - (void) devfsadm_mklink("tty03", node, minor, 0); - } - return (DEVFSADM_CONTINUE); -} - -/* - * type=ddi_serial:dialout,mb;minor=a,cu ttyd0 - * type=ddi_serial:dialout,mb;minor=b,cu ttyd1 - * type=ddi_serial:dialout,mb;minor=c,cu ttyd2 - * type=ddi_serial:dialout,mb;minor=d,cu ttyd3 - */ -static int -serial_dialout(di_minor_t minor, di_node_t node) -{ - char *mn = di_minor_name(minor); - - if (strcmp(mn, "a,cu") == 0) { - (void) devfsadm_mklink("ttyd0", node, minor, 0); - (void) devfsadm_mklink("cua0", node, minor, 0); - - } else if (strcmp(mn, "b,cu") == 0) { - (void) devfsadm_mklink("ttyd1", node, minor, 0); - (void) devfsadm_mklink("cua1", node, minor, 0); - - } else if (strcmp(mn, "c,cu") == 0) { - (void) devfsadm_mklink("ttyd2", node, minor, 0); - (void) devfsadm_mklink("cua2", node, minor, 0); - - } else if (strcmp(mn, "d,cu") == 0) { - (void) devfsadm_mklink("ttyd3", node, minor, 0); - (void) devfsadm_mklink("cua3", node, minor, 0); - } - return (DEVFSADM_CONTINUE); -} - -static int -kdmouse(di_minor_t minor, di_node_t node) -{ - (void) devfsadm_mklink("kdmouse", node, minor, 0); - return (DEVFSADM_CONTINUE); -} - -static int -ipmi(di_minor_t minor, di_node_t node) -{ - /* - * Follow convention from other systems, and include an instance#, - * even though there will only be one. - */ - (void) devfsadm_mklink("ipmi0", node, minor, 0); - return (DEVFSADM_CONTINUE); -} - -static int -smbios(di_minor_t minor, di_node_t node) -{ - (void) devfsadm_mklink("smbios", node, minor, 0); - return (DEVFSADM_CONTINUE); -} - -static int -agp_process(di_minor_t minor, di_node_t node) -{ - char *minor_nm, *drv_nm; - char *devfspath; - char *I_path, *p_path, *buf; - char *name = (char *)NULL; - int i, index; - devfsadm_enumerate_t rules[1]; - - minor_nm = di_minor_name(minor); - drv_nm = di_driver_name(node); - - if ((minor_nm == NULL) || (drv_nm == NULL)) { - return (DEVFSADM_CONTINUE); - } - - devfsadm_print(debug_mid, "agp_process: minor=%s node=%s\n", - minor_nm, di_node_name(node)); - - devfspath = di_devfs_path(node); - if (devfspath == NULL) { - devfsadm_print(debug_mid, "agp_process: devfspath is NULL\n"); - return (DEVFSADM_CONTINUE); - } - - I_path = (char *)malloc(PATH_MAX); - - if (I_path == NULL) { - di_devfs_path_free(devfspath); - devfsadm_print(debug_mid, "agp_process: malloc failed\n"); - return (DEVFSADM_CONTINUE); - } - - p_path = (char *)malloc(PATH_MAX); - - if (p_path == NULL) { - devfsadm_print(debug_mid, "agp_process: malloc failed\n"); - di_devfs_path_free(devfspath); - free(I_path); - return (DEVFSADM_CONTINUE); - } - - (void) strlcpy(p_path, devfspath, PATH_MAX); - (void) strlcat(p_path, ":", PATH_MAX); - (void) strlcat(p_path, minor_nm, PATH_MAX); - di_devfs_path_free(devfspath); - - devfsadm_print(debug_mid, "agp_process: path %s\n", p_path); - - for (i = 0; ; i++) { - if ((driver_name_table[i].driver_name == NULL) || - (strcmp(drv_nm, driver_name_table[i].driver_name) == 0)) { - index = driver_name_table[i].index; - break; - } - } - switch (index) { - case DRIVER_AGPPSEUDO: - devfsadm_print(debug_mid, - "agp_process: psdeudo driver name\n"); - name = "agpgart"; - (void) snprintf(I_path, PATH_MAX, "%s", name); - devfsadm_print(debug_mid, - "mklink %s -> %s\n", I_path, p_path); - - (void) devfsadm_mklink(I_path, node, minor, 0); - - free(I_path); - free(p_path); - return (DEVFSADM_CONTINUE); - case DRIVER_AGPTARGET: - devfsadm_print(debug_mid, - "agp_process: target driver name\n"); - rules[0] = agptarget_rules[0]; - name = "agptarget"; - break; - case DRIVER_CPUGART: - devfsadm_print(debug_mid, - "agp_process: cpugart driver name\n"); - rules[0] = cpugart_rules[0]; - name = "cpugart"; - break; - case DRIVER_AGPMASTER_DRM_I915: - case DRIVER_AGPMASTER_DRM_RADEON: - case DRIVER_AGPMASTER_VGATEXT: - devfsadm_print(debug_mid, - "agp_process: agpmaster driver name\n"); - rules[0] = agpmaster_rules[0]; - name = "agpmaster"; - break; - case DRIVER_UNKNOWN: - devfsadm_print(debug_mid, - "agp_process: unknown driver name=%s\n", drv_nm); - free(I_path); - free(p_path); - return (DEVFSADM_CONTINUE); - } - - if (devfsadm_enumerate_int(p_path, 0, &buf, rules, 1)) { - devfsadm_print(debug_mid, "agp_process: exit/coninue\n"); - free(I_path); - free(p_path); - return (DEVFSADM_CONTINUE); - } - - - (void) snprintf(I_path, PATH_MAX, "agp/%s%s", name, buf); - - devfsadm_print(debug_mid, "agp_process: p_path=%s buf=%s\n", - p_path, buf); - - free(buf); - - devfsadm_print(debug_mid, "mklink %s -> %s\n", I_path, p_path); - - (void) devfsadm_mklink(I_path, node, minor, 0); - - free(p_path); - free(I_path); - - return (DEVFSADM_CONTINUE); -} - -static int -drm_node(di_minor_t minor, di_node_t node) -{ - char *minor_nm, *drv_nm; - char *devfspath; - char *I_path, *p_path, *buf; - char *name = "card"; - - devfsadm_enumerate_t drm_rules[1] = {"^dri$/^card([0-9]+)$", 1, - MATCH_ALL }; - - - minor_nm = di_minor_name(minor); - drv_nm = di_driver_name(node); - if ((minor_nm == NULL) || (drv_nm == NULL)) { - return (DEVFSADM_CONTINUE); - } - - devfsadm_print(debug_mid, "drm_node: minor=%s node=%s type=%s\n", - minor_nm, di_node_name(node), di_minor_nodetype(minor)); - - devfspath = di_devfs_path(node); - if (devfspath == NULL) { - devfsadm_print(debug_mid, "drm_node: devfspath is NULL\n"); - return (DEVFSADM_CONTINUE); - } - - I_path = (char *)malloc(PATH_MAX); - - if (I_path == NULL) { - di_devfs_path_free(devfspath); - devfsadm_print(debug_mid, "drm_node: malloc failed\n"); - return (DEVFSADM_CONTINUE); - } - - p_path = (char *)malloc(PATH_MAX); - - if (p_path == NULL) { - devfsadm_print(debug_mid, "drm_node: malloc failed\n"); - di_devfs_path_free(devfspath); - free(I_path); - return (DEVFSADM_CONTINUE); - } - - (void) strlcpy(p_path, devfspath, PATH_MAX); - (void) strlcat(p_path, ":", PATH_MAX); - (void) strlcat(p_path, minor_nm, PATH_MAX); - di_devfs_path_free(devfspath); - - devfsadm_print(debug_mid, "drm_node: p_path %s\n", p_path); - - if (devfsadm_enumerate_int(p_path, 0, &buf, drm_rules, 1)) { - free(p_path); - devfsadm_print(debug_mid, "drm_node: exit/coninue\n"); - return (DEVFSADM_CONTINUE); - } - (void) snprintf(I_path, PATH_MAX, "dri/%s%s", name, buf); - - devfsadm_print(debug_mid, "drm_node: p_path=%s buf=%s\n", - p_path, buf); - - free(buf); - - devfsadm_print(debug_mid, "mklink %s -> %s\n", I_path, p_path); - (void) devfsadm_mklink(I_path, node, minor, 0); - - free(p_path); - free(I_path); - - return (0); -} - -/* - * /dev/mc/mc<chipid> -> /devices/.../pci1022,1102@<chipid+24>,2:mc-amd - */ -static int -mc_node(di_minor_t minor, di_node_t node) -{ - const char *minorname = di_minor_name(minor); - const char *busaddr = di_bus_addr(node); - char linkpath[PATH_MAX]; - int unitaddr; - char *c; - - if (minorname == NULL || busaddr == NULL) - return (DEVFSADM_CONTINUE); - - errno = 0; - unitaddr = strtol(busaddr, &c, 16); - - if (errno != 0) - return (DEVFSADM_CONTINUE); - - if (unitaddr == 0) { - (void) snprintf(linkpath, sizeof (linkpath), "mc/mc"); - } else if (unitaddr >= MC_AMD_DEV_OFFSET) { - (void) snprintf(linkpath, sizeof (linkpath), "mc/mc%u", - unitaddr - MC_AMD_DEV_OFFSET); - } else { - (void) snprintf(linkpath, sizeof (linkpath), "mc/mc%u", - minor->dev_minor); - } - (void) devfsadm_mklink(linkpath, node, minor, 0); - return (DEVFSADM_CONTINUE); -} - -/* - * Creates \M0 devlink for xsvc node - */ -static int -xsvc(di_minor_t minor, di_node_t node) -{ - char *mn; - - if (strcmp(di_node_name(node), "xsvc") != 0) - return (DEVFSADM_CONTINUE); - - mn = di_minor_name(minor); - if (mn == NULL) - return (DEVFSADM_CONTINUE); - - (void) devfsadm_mklink(mn, node, minor, 0); - return (DEVFSADM_CONTINUE); -} - -/* - * Creates \M0 devlink for srn device - */ -static int -srn(di_minor_t minor, di_node_t node) -{ - char *mn; - - if (strcmp(di_node_name(node), "srn") != 0) - return (DEVFSADM_CONTINUE); - - mn = di_minor_name(minor); - if (mn == NULL) - return (DEVFSADM_CONTINUE); - - (void) devfsadm_mklink(mn, node, minor, 0); - return (DEVFSADM_CONTINUE); -} - -/* - * /dev/ucode -> /devices/pseudo/ucode@0:ucode - */ -static int -ucode(di_minor_t minor, di_node_t node) -{ - (void) devfsadm_mklink("ucode", node, minor, 0); - return (DEVFSADM_CONTINUE); -} - -static int -heci(di_minor_t minor, di_node_t node) -{ - if (strcmp(di_minor_name(minor), "AMT") == 0) { - (void) devfsadm_mklink("heci", node, minor, 0); - } - return (DEVFSADM_CONTINUE); -} diff --git a/usr/src/cmd/devfsadm/mapfile-vers b/usr/src/cmd/devfsadm/mapfile-vers new file mode 100644 index 0000000..9c30e21 --- /dev/null +++ b/usr/src/cmd/devfsadm/mapfile-vers @@ -0,0 +1,64 @@ +# +# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# MAPFILE HEADER START +# +# WARNING: STOP NOW. DO NOT MODIFY THIS FILE. +# Object versioning must comply with the rules detailed in +# +# usr/src/lib/README.mapfiles +# +# You should not be making modifications here until you've read the most current +# copy of that file. If you need help, contact a gatekeeper for guidance. +# +# MAPFILE HEADER END +# +$mapfile_version 2 + +# External interface requirements +SYMBOL_SCOPE { + global: + devfsadm_devlink_cache { FLAGS = EXTERN }; + devfsadm_enumerate_char_start { FLAGS = EXTERN }; + devfsadm_enumerate_int { FLAGS = EXTERN }; + devfsadm_errprint { FLAGS = EXTERN }; + devfsadm_free_dev_names { FLAGS = EXTERN }; + devfsadm_have_reserved { FLAGS = EXTERN }; + devfsadm_is_reserved { FLAGS = EXTERN }; + devfsadm_link_valid { FLAGS = EXTERN }; + devfsadm_lookup_dev_names { FLAGS = EXTERN }; + devfsadm_mklink { FLAGS = EXTERN }; + devfsadm_noupdate { FLAGS = EXTERN }; + devfsadm_print { FLAGS = EXTERN }; + devfsadm_read_link { FLAGS = EXTERN }; + devfsadm_reserve_id_cache { FLAGS = EXTERN }; + devfsadm_rm_all { FLAGS = EXTERN }; + devfsadm_rm_link { FLAGS = EXTERN }; + devfsadm_rm_stale_links { FLAGS = EXTERN }; + devfsadm_root_path { FLAGS = EXTERN }; + devfsadm_secondary_link { FLAGS = EXTERN }; + disk_enumerate_int { FLAGS = EXTERN }; + s_strdup { FLAGS = EXTERN }; + system_labeled { FLAGS = EXTERN }; +}; diff --git a/usr/src/cmd/devfsadm/sparc/Makefile b/usr/src/cmd/devfsadm/sparc/Makefile new file mode 100644 index 0000000..7cc180f --- /dev/null +++ b/usr/src/cmd/devfsadm/sparc/Makefile @@ -0,0 +1,28 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# +# Copyright 2007 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# + +LINK_OBJS_sparc = + +include ../Makefile.com |