summaryrefslogtreecommitdiff
path: root/usr/src/cmd/devfsadm
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/devfsadm')
-rw-r--r--usr/src/cmd/devfsadm/Makefile24
-rw-r--r--usr/src/cmd/devfsadm/Makefile.com145
-rw-r--r--usr/src/cmd/devfsadm/devfsadm.h5
-rw-r--r--usr/src/cmd/devfsadm/drm_link_i386.c318
-rw-r--r--usr/src/cmd/devfsadm/i386/Makefile6
-rw-r--r--usr/src/cmd/devfsadm/i386/misc_link_i386.c656
-rw-r--r--usr/src/cmd/devfsadm/mapfile-vers64
-rw-r--r--usr/src/cmd/devfsadm/sparc/Makefile28
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