home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 7000-7999 / 7541 < prev    next >
Internet Message Format  |  1993-03-16  |  52KB

  1. Path: wupost!howland.reston.ans.net!bogus.sura.net!darwin.sura.net!sgiblab!bazooka!ti
  2. From: ti@bazooka.amb.org (Ti Kan)
  3. Newsgroups: alt.sources
  4. Subject: Cyrix 486DLC/SLC internal cache UNIX SVR3/SVR4 driver
  5. Keywords: Cyrix 486 DLC SLC cache UNIX SVR3 SVR4 driver
  6. Message-ID: <1294@bazooka.amb.org>
  7. Date: 16 Mar 93 06:41:55 GMT
  8. Reply-To: ti@bazooka.amb.org (Ti Kan)
  9. Organization: AMB Research Labs, Sunnyvale, CA.
  10. Lines: 2072
  11.  
  12.  
  13. UNIX(tm) System V/386 software to control the Cyrix(tm)
  14. Cx486DLC/SLC CPU internal cache
  15.  
  16. by Ti Kan
  17. -------------------------------------------------------------------
  18.  
  19. INTRODUCTION
  20.  
  21. This package includes all the source code components of the
  22. following:
  23. 1. A device driver (cx) for UNIX SVR3.2 and SVR4 for detecting a
  24.    Cyrix Cx486DLC or Cx486SLC microprocessor, and enabling/disabling
  25.    the on-chip internal cache memory, as well as configuring
  26.    the cache-control option registers.
  27. 2. A utility (cxctl) that allows a super-user to change the Cyrix
  28.    Cx486DLC/SLC microprocessor internal cache configuration
  29.    "on-the-fly".
  30.  
  31. I have compiled and tested this package on the following platforms:
  32.  
  33. USL UNIX System V/386 Release 4.2 (Destiny) version 1
  34. SCO UNIX System V/386 Release 3.2 version 2.0
  35. SCO UNIX System V/386 Release 3.2 version 4.0
  36.  
  37. Since this software was specifically written to be portable, I
  38. believe that it will compile and function correctly under other
  39. UNIX System V/386 environments, such as ISC SVR3.2/SVR4, Dell SVR4,
  40. etc.  If you have successfully build and used this software on a
  41. platform not listed above please inform me so that I can add to
  42. the list.  If you have to make modifications to make it run on
  43. a particular platform I would appreciate if you can send me the
  44. changes so I can incorporate it into a future release.
  45.  
  46. This software can be loaded on a non-Cyrix 386/486 system and it
  47. should have no adverse effects (See below).
  48.  
  49.  
  50. UNPACKING INSTRUCTIONS
  51.  
  52. 1. Make a directory named "cx" in which these source files are to
  53.    reside, and change to this directory.
  54. 2. Save the distribution shar-format file as "cx.shar".
  55. 3. Run the following command:
  56.  
  57.     sh cx.shar
  58.  
  59.    This will unbundle the package into the individual files.
  60.  
  61. BUILD/INSTALL/USE INSTRUCTIONS
  62.  
  63. Read the README.src file after unpacking the distribution.
  64.  
  65.  
  66. BINARY DISTRIBUTION
  67.  
  68. Binaries for SCO UNIX 3.2v2/3.2v4, as well as all current
  69. flavors of SVR4.2 (USL, Consensys, Univel UnixWare) are available
  70. for download at File Area 3 on the Bazooka BBS.  This source
  71. distribution, as well as an MS-DOS driver for the Cyrix Cx486DLC/SLC
  72. CPU are also available on Bazooka BBS.
  73.  
  74. Bazooka BBS:
  75. +1 408 736 0118 (Hayes V-Series Ultra V.32/V.32bis/V.42/V.42bis)
  76. +1 408 736 3071 (Telebit Worldblazer TPEP/PEP/V.32/V.32bis/V.42/V.42bis)
  77.  
  78. Log in as "bbs".  You will have access to the File Area 3 on your
  79. first call.  If you only need to download the Cyrix driver files
  80. and have no intention of otherwise using Bazooka BBS again, please
  81. leave a note to the Sysop stating so when logging out.
  82.  
  83. ----------------X cut here X-----------------
  84. #! /bin/sh
  85. # This is a shell archive.  Remove anything before this line, then unpack
  86. # it by saving it into a file and typing "sh file".  To overwrite existing
  87. # files, type "sh file -c".  You can also feed this as standard input via
  88. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  89. # will see the following message at the end:
  90. #        "End of shell archive."
  91. # Contents:  COPYRIGHT MANIFEST Makefile Master.ver0 Master.ver1 Node
  92. #   README.src Space.c System.ver0 System.ver1 cx.c cx.h cx_ml.s
  93. #   cxctl.c cxinstall.sh
  94. # Wrapped by ti@bazooka on Mon Mar 15 22:22:07 1993
  95. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  96. if test -f 'COPYRIGHT' -a "${1}" != "-c" ; then 
  97.   echo shar: Will not clobber existing file \"'COPYRIGHT'\"
  98. else
  99. echo shar: Extracting \"'COPYRIGHT'\" \(626 characters\)
  100. sed "s/^X//" >'COPYRIGHT' <<'END_OF_FILE'
  101. X#ident "@(#)COPYRIGHT    1.5 93/03/14"
  102. X/*
  103. X *    cx        UNIX(tm) System V/386 driver to control the Cyrix(tm)
  104. X *            Cx486DLC/SLC CPU internal cache.
  105. X *
  106. X *    by Ti Kan
  107. X *    E-mail:        Internet: ti@amb.org
  108. X *            UUCP: ...!decwrl!sgiblab!bazooka!ti
  109. X *                  ...!uunet!bazooka!ti
  110. X *
  111. X *    Copyright (c) Ti Kan 1993, All rights reserved.
  112. X *
  113. X *    This software can be distributed freely.  This software,
  114. X *    and software based on or that uses code from it cannot
  115. X *    be used for commercial purposes without consent of the
  116. X *    copyright holder.  This copyright notice must appear in
  117. X *    all products that is based on or uses code from this
  118. X *    software.
  119. X */
  120. X
  121. END_OF_FILE
  122. if test 626 -ne `wc -c <'COPYRIGHT'`; then
  123.     echo shar: \"'COPYRIGHT'\" unpacked with wrong size!
  124. fi
  125. # end of 'COPYRIGHT'
  126. fi
  127. if test -f 'MANIFEST' -a "${1}" != "-c" ; then 
  128.   echo shar: Will not clobber existing file \"'MANIFEST'\"
  129. else
  130. echo shar: Extracting \"'MANIFEST'\" \(778 characters\)
  131. sed "s/^X//" >'MANIFEST' <<'END_OF_FILE'
  132. X/* @(#)MANIFEST    1.2 93/03/15 */
  133. X
  134. XThis source distribution of CX version 1.1 should include the following:
  135. X
  136. XCOPYRIGHT    Copyright banner
  137. XMANIFEST    This file
  138. XMakefile    Makefile to build the source release
  139. XMaster.ver0    Driver Software Package component for SVR3.2 and SVR4.0
  140. XMaster.ver1    Driver Software Package component for SVR4.2
  141. XNode        Driver Software Package component
  142. XREADME.src    Build and install instructions
  143. XSpace.c        Driver Software Package component
  144. XSystem.ver0    Driver Software Package component for SVR3.2 and SVR4.0
  145. XSystem.ver1    Driver Software Package component for SVR4.2
  146. Xcx.c        Driver source file
  147. Xcx.h        Driver source file
  148. Xcx_ml.s        Driver source file
  149. Xcxctl.c        Utility source file
  150. Xcxinstall.sh    Install shell script
  151. X
  152. XYou must have all these files in order to build the package.
  153. X
  154. END_OF_FILE
  155. if test 778 -ne `wc -c <'MANIFEST'`; then
  156.     echo shar: \"'MANIFEST'\" unpacked with wrong size!
  157. fi
  158. # end of 'MANIFEST'
  159. fi
  160. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  161.   echo shar: Will not clobber existing file \"'Makefile'\"
  162. else
  163. echo shar: Extracting \"'Makefile'\" \(2426 characters\)
  164. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  165. X#ident "@(#)Makefile    1.10 93/03/14"
  166. X#
  167. X#    Makefile    UNIX(tm) System V/386 driver to control the Cyrix(tm)
  168. X#            Cx486DLC/SLC CPU internal cache.
  169. X#
  170. X#    by Ti Kan
  171. X#    E-mail:        Internet: ti@amb.org
  172. X#            UUCP: ...!decwrl!sgiblab!bazooka!ti
  173. X#                  ...!uunet!bazooka!ti
  174. X#
  175. X#    Copyright (c) Ti Kan 1993, All rights reserved.
  176. X#
  177. X#    This software can be distributed freely.  This software,
  178. X#    and software based on or that uses code from it cannot
  179. X#    be used for commercial purposes without consent of the
  180. X#    copyright holder.  This copyright notice must appear in
  181. X#    all products that is based on or uses code from this
  182. X#    software.
  183. X#
  184. X
  185. X#
  186. X# All but one of the following ARCH lines should be commented-out.
  187. X#
  188. XARCH = -DSVR3 -Dsco    # For SCO UNIX SVR3.2
  189. X#ARCH = -DSVR3        # For other UNIX SVR3.2
  190. X#ARCH = -DSVR4        # For most variants of SVR4
  191. X
  192. X#
  193. X# Uncomment the following for debugging purposes: causes debug output on
  194. X# the console, and makes static references global (So debuggers can
  195. X# do reasonable things).
  196. X#
  197. X#DEBUG = -DDEBUG -g
  198. X
  199. X#
  200. X# Uncomment the following to disallow changes to cache settings
  201. X# which can potentially cause a system crash.
  202. X#
  203. X#PARANOID = -DPARANOID
  204. X
  205. X#
  206. X# Other definitions
  207. X#
  208. XCC = cc
  209. X#CC = gcc -fpcc-struct-return
  210. XLD = ld
  211. XMCS = mcs
  212. XLN = ln -f
  213. XRM = rm -f
  214. XSHELL = /bin/sh
  215. X
  216. X#
  217. X# No modifications should be necessary below here
  218. X#
  219. XVERS = 1.1
  220. XSRC = cx.c cx_ml.s
  221. XOBJ = cx.o cx_ml.o
  222. XDRIVER = Driver.o
  223. XUSRC = cxctl.c
  224. XUTIL = cxctl
  225. XIDFILES = Driver.o Space.c Master.ver0 Master.ver1 System.ver0 System.ver1 Node
  226. XRELDIR = cxrelease
  227. X
  228. XCFLAGS = -O -I. -DVERS=\"$(VERS)\" $(DEBUG) $(PARANOID) $(ARCH)
  229. XLDFLAGS = -r
  230. X
  231. Xall: $(DRIVER) $(UTIL)
  232. X
  233. Xcx.o: cx.c
  234. X    @if [ ! -d sys ] ;\
  235. X    then \
  236. X        mkdir sys ;\
  237. X    fi
  238. X    @$(RM) sys/cx.h
  239. X    @$(LN) cx.h sys/cx.h
  240. X    $(CC) $(CFLAGS) -D_INKERNEL -c $<
  241. X
  242. Xcx_ml.o: cx_ml.s
  243. X    $(CC) $(CFLAGS) -D_INKERNEL -c $<
  244. X
  245. X$(DRIVER): $(OBJ)
  246. X    $(LD) $(LDFLAGS) $(OBJ) -o $@
  247. X    $(MCS) -da "@(#)cx v$(VERS) `date +%D`    (c) Ti Kan 1993" $@
  248. X
  249. X$(UTIL): $(USRC)
  250. X    $(CC) $(CFLAGS) -o $@ $(USRC)
  251. X    $(MCS) -da "@(#)cxctl v$(VERS) `date +%D`    (c) Ti Kan 1993" $@
  252. X
  253. Xclean:
  254. X    rm -rf $(OBJ) $(DRIVER) $(UTIL) sys
  255. X
  256. Xdelete: clean
  257. X    rm -rf $(RELDIR)
  258. X
  259. Xrelease: all
  260. X    @if [ ! -d $(RELDIR) ] ;\
  261. X    then \
  262. X        mkdir $(RELDIR) ;\
  263. X    fi
  264. X    @if [ ! -d $(RELDIR)/cx ] ;\
  265. X    then \
  266. X        mkdir $(RELDIR)/cx ;\
  267. X    fi
  268. X    rm -f $(RELDIR)/cx/* $(RELDIR)/cxctl $(RELDIR)/cx.h
  269. X    cp $(IDFILES) $(RELDIR)/cx
  270. X    cp $(UTIL) $(RELDIR)
  271. X    cp cx.h $(RELDIR)
  272. X    cp cxinstall.sh $(RELDIR)/cxinstall
  273. X    chmod 755 $(RELDIR)/cxinstall
  274. X
  275. END_OF_FILE
  276. if test 2426 -ne `wc -c <'Makefile'`; then
  277.     echo shar: \"'Makefile'\" unpacked with wrong size!
  278. fi
  279. # end of 'Makefile'
  280. fi
  281. if test -f 'Master.ver0' -a "${1}" != "-c" ; then 
  282.   echo shar: Will not clobber existing file \"'Master.ver0'\"
  283. else
  284. echo shar: Extracting \"'Master.ver0'\" \(26 characters\)
  285. sed "s/^X//" >'Master.ver0' <<'END_OF_FILE'
  286. Xcx    Ii    Hico    cx_    0    0    0    1    -1
  287. END_OF_FILE
  288. if test 26 -ne `wc -c <'Master.ver0'`; then
  289.     echo shar: \"'Master.ver0'\" unpacked with wrong size!
  290. fi
  291. # end of 'Master.ver0'
  292. fi
  293. if test -f 'Master.ver1' -a "${1}" != "-c" ; then 
  294.   echo shar: Will not clobber existing file \"'Master.ver1'\"
  295. else
  296. echo shar: Extracting \"'Master.ver1'\" \(85 characters\)
  297. sed "s/^X//" >'Master.ver1' <<'END_OF_FILE'
  298. X#ident "@(#)Master.ver1    1.2 93/03/14"
  299. X$version 1
  300. X$entry init ioctl
  301. Xcx    cx_    Hico    1    0    0
  302. END_OF_FILE
  303. if test 85 -ne `wc -c <'Master.ver1'`; then
  304.     echo shar: \"'Master.ver1'\" unpacked with wrong size!
  305. fi
  306. # end of 'Master.ver1'
  307. fi
  308. if test -f 'Node' -a "${1}" != "-c" ; then 
  309.   echo shar: Will not clobber existing file \"'Node'\"
  310. else
  311. echo shar: Extracting \"'Node'\" \(10 characters\)
  312. sed "s/^X//" >'Node' <<'END_OF_FILE'
  313. Xcx    cx    c    0
  314. END_OF_FILE
  315. if test 10 -ne `wc -c <'Node'`; then
  316.     echo shar: \"'Node'\" unpacked with wrong size!
  317. fi
  318. # end of 'Node'
  319. fi
  320. if test -f 'README.src' -a "${1}" != "-c" ; then 
  321.   echo shar: Will not clobber existing file \"'README.src'\"
  322. else
  323. echo shar: Extracting \"'README.src'\" \(7064 characters\)
  324. sed "s/^X//" >'README.src' <<'END_OF_FILE'
  325. X/* @(#)README.src    1.3 93/03/15 */
  326. X
  327. XUNIX(tm) System V/386 software to control the Cyrix(tm)
  328. XCx486DLC/SLC CPU internal cache
  329. X
  330. Xby Ti Kan
  331. X-------------------------------------------------------------------
  332. X
  333. XINTRODUCTION
  334. X
  335. XThis package includes all the source code components of the
  336. Xfollowing:
  337. X1. A device driver (cx) for UNIX SVR3.2 and SVR4 for detecting a
  338. X   Cyrix Cx486DLC or Cx486SLC microprocessor, and enabling/disabling
  339. X   the on-chip internal cache memory, as well as configuring
  340. X   the cache-control option registers.
  341. X2. A utility (cxctl) that allows a super-user to change the Cyrix
  342. X   Cx486DLC/SLC microprocessor internal cache configuration
  343. X   "on-the-fly".
  344. X
  345. XSee the "MANIFEST" file, which should be included in this distribution
  346. Xfor a list of all files in the package.
  347. X
  348. XI have compiled and tested this package on the following platforms:
  349. X
  350. XUSL UNIX System V/386 Release 4.2 (Destiny) version 1
  351. XSCO UNIX System V/386 Release 3.2 version 2.0
  352. XSCO UNIX System V/386 Release 3.2 version 4.0
  353. X
  354. XSince this software was specifically written to be portable, I
  355. Xbelieve that it will compile and function correctly under other
  356. XUNIX System V/386 environments, such as ISC SVR3.2/SVR4, Dell SVR4,
  357. Xetc.  If you have successfully build and used this software on a
  358. Xplatform not listed above please inform me so that I can add to
  359. Xthe list.  If you have to make modifications to make it run on
  360. Xa particular platform I would appreciate if you can send me the
  361. Xchanges so I can incorporate it into a future release.
  362. X
  363. XThis software can be loaded on a non-Cyrix 386/486 system and it
  364. Xshould have no adverse effects (See below).
  365. X
  366. X
  367. XUNPACKING INSTRUCTIONS
  368. X
  369. XIf your distribution is bundled in "shar" format, use the following
  370. Xsteps:
  371. X
  372. X1. Make a directory named "cx" in which these source files are to
  373. X   reside, and change to this directory.
  374. X2. Save the distribution shar-format file as "cx.shar".
  375. X3. Run the following command:
  376. X
  377. X    sh cx.shar
  378. X
  379. X   This will unbundle the package into the individual files.
  380. X
  381. XIf your distribution is bundled in compressed tar file format, use the
  382. Xthe following steps:
  383. X
  384. X1. Make a directory named "cx" in which these source files are to
  385. X   reside, and change to this directory.
  386. X2. Save the distribution compressed-tar-format file as "cx.tar.Z".
  387. X3. Run the following command:
  388. X
  389. X    uncompress cx.tar.Z
  390. X    tar xvf cx.tar
  391. X
  392. X   This will unbundle the package into the individual files.
  393. X
  394. X
  395. XBUILD INSTRUCTIONS
  396. X
  397. XYou must have the C software development package installed on your
  398. Xoperating system in order to compile these sources.  Some of the
  399. Xsource code in this package are in assembly language with as(1)
  400. Xsyntax.  Thus, your development package must be able to handle this.
  401. XThe target system where the binaries are to be loaded must have the
  402. Xkernel rebuild package installed (under /etc/conf).  SCO calls this
  403. Xenvironment the "Link Kit".
  404. X
  405. XYou can compile the sources as a non-privileged user, but you must
  406. Xbe the super-user on the target system to install it.
  407. X
  408. X1. Edit the Makefile and change the lines with "ARCH=", "CC=" and
  409. X   "PARANOID=" to suit your local environment.  See the comments in
  410. X   the Makefile for details.
  411. X
  412. X2. Type "make".  This should compile the source code and generate the
  413. X   "Driver.o" device driver binary as well as the "cxctl" utility
  414. X   executable binary.
  415. X
  416. X3. Type "make release" to copy all relevant release files to the
  417. X   cxrelease directory.
  418. X
  419. X4. Make a tar format diskette of the cxrelease directory, and
  420. X   install target systems with it:
  421. X
  422. X    tar cvf /dev/rfd0 cxrelease
  423. X
  424. X   Replace "/dev/rfd0" with the appropriate floppy device on your system.
  425. X
  426. X   Note: This diskette can only be used to install another system running
  427. X         the same operating system as the one you compiled the source code
  428. X     on.
  429. X
  430. X5. You may also make a tar format file, compressed and uuencoded, suitable
  431. X   for transmission over electronic mail:
  432. X
  433. X    tar cvf cx.tar cxrelease
  434. X    compress cx.tar
  435. X    uuencode cx.tar.Z cx.tar.Z > cx.uue
  436. X
  437. X   "cx.uue" is the distribution file.
  438. X
  439. X
  440. XINSTALL INSTRUCTIONS
  441. X
  442. X1. If your distribution is on a tar format floppy diskette (created using
  443. X   the BUILD INSTRUCTIONS above), on the target system, extract the
  444. X   diskette as follows:
  445. X
  446. X    cd /tmp
  447. X    tar xvf /dev/rfd0
  448. X
  449. X   Replace "/dev/rfd0" with the appropriate floppy device on your system.
  450. X
  451. X2. If the distrbution is in a uuencoded and compressed tar format file,
  452. X   unpack the distribution as follows (assuming that the distrbution file
  453. X   is named "cx.uue"):
  454. X
  455. X    mv cx.uue /tmp
  456. X    cd /tmp
  457. X    uudecode cx.uue
  458. X    uncompress cx.tar.Z
  459. X    tar xvf cx.tar
  460. X
  461. X3. Run the software installation script:
  462. X
  463. X    cd /tmp/cxrelease
  464. X    ./cxinstall
  465. X
  466. X4. You can clean up the directories after installation:
  467. X
  468. X    cd /tmp
  469. X    rm -rf cxrelease
  470. X
  471. X
  472. XUSE INSTRUCTIONS
  473. X
  474. XAfter installation, rebuilding the kernel, and rebooting the system, the
  475. XCX driver will attempt to detect a Cx486DLC/SLC processor when the UNIX
  476. Xkernel is initialized.  If a Cx486DLC/SLC chip is found, then its internal
  477. Xcache will be enabled by default, with the 640K-1M physical address region
  478. Xmade non-cacheable (this region is normally used as I/O space by controller
  479. Xboards on the PC architecture and should be non-cacheable).
  480. X
  481. XThe Cx486DLC/SLC internal cache can be disabled, or many of the cache
  482. Xconfiguration parameters can be modified at run time with the cxctl
  483. Xutility.  The utility is menu-driven and self-explanatory.  The function
  484. Xof most of these parameters require knowledge of the internal design of
  485. Xthe Cx486DLC/SLC chip.
  486. X
  487. XWARNING: changing some of these parameters may cause a system
  488. Xcrash due to cache incoherency or DMA problems.  The default setting
  489. Xshould work fine for most systems and changing the parameters is not
  490. Xrecommended.  Modifying these paramters should only be done on an
  491. Xexperimental basis by a knowledgeable individual, on a system in
  492. Xsingle-user mode.
  493. X
  494. X
  495. XCOPYRIGHT
  496. X
  497. XCopyright (C) 1993 Ti Kan.  All rights reserved.
  498. XThis software can be distributed freely.  This software, and software
  499. Xbased on or that uses code from it cannot be used for commercial purposes
  500. Xwithout consent of the copyright holder.  This copyright notice must
  501. Xappear in all products that is based on or uses code from this software.
  502. X
  503. X
  504. XWARRANTY
  505. X
  506. XThere is no warranty provided by the author for the usefulness or
  507. Xsuitability of purpose.  These is also no warranty provided for any
  508. Xconsequences as a result of the use or misuse of this software.
  509. XThis software is in no way associated with Cyrix Corporation, and
  510. XCyrix cannot be responsible for any support.
  511. X
  512. XIf you find a problem with this package your feedback to the author
  513. Xwill be apprciated.  Please provide a detailed description of the
  514. Xproblem, as well as the hardware and software configuration.  If the
  515. Xproblem can be traceable to a bug in the software provided in this
  516. Xpackage, the author will attempt to provide a fix in a future release.
  517. X
  518. X
  519. XACKNOWLEGEMENTS
  520. X
  521. XUNIX and USL are registered trademarks of UNIX System Laboratories
  522. XCyrix is a registered trademark of Cyrix Corporation
  523. XSCO is a registered trademark of The Santa Cruz Operation, Inc.
  524. XISC is a trademark of Sunsoft, Inc.
  525. XDell is a trademark of Dell Coporation.
  526. X
  527. END_OF_FILE
  528. if test 7064 -ne `wc -c <'README.src'`; then
  529.     echo shar: \"'README.src'\" unpacked with wrong size!
  530. fi
  531. # end of 'README.src'
  532. fi
  533. if test -f 'Space.c' -a "${1}" != "-c" ; then 
  534.   echo shar: Will not clobber existing file \"'Space.c'\"
  535. else
  536. echo shar: Extracting \"'Space.c'\" \(1518 characters\)
  537. sed "s/^X//" >'Space.c' <<'END_OF_FILE'
  538. X/*
  539. X *    Space.c        UNIX(tm) System V/386 driver to control the Cyrix(tm)
  540. X *            Cx486DLC/SLC CPU internal cache.
  541. X *
  542. X *    by Ti Kan
  543. X *    E-mail:        Internet: ti@amb.org
  544. X *            UUCP: ...!decwrl!sgiblab!bazooka!ti
  545. X *                  ...!uunet!bazooka!ti
  546. X *
  547. X *    Copyright (c) Ti Kan 1993, All rights reserved.
  548. X *
  549. X *    This software can be distributed freely.  This software,
  550. X *    and software based on or that uses code from it cannot
  551. X *    be used for commercial purposes without consent of the
  552. X *    copyright holder.  This copyright notice must appear in
  553. X *    all products that is based on or uses code from this
  554. X *    software.
  555. X */
  556. X#ident "@(#)Space.c    1.9 93/03/14"
  557. X
  558. X#include "sys/types.h"
  559. X#include "sys/cx.h"
  560. X#include "config.h"
  561. X
  562. X/* Cache control register I/O port address base */
  563. Xint    cx_base = 0x22;
  564. X
  565. X/* Default cache control parameters - see <sys/cx.h> */
  566. Xcxparms_t    cx_dfltparms = {
  567. X    /*** Cache mode ***/
  568. X    {
  569. X        CX_ENABLE    /* mode */
  570. X    },
  571. X
  572. X    /*** Cache control register 0 ***/
  573. X    {
  574. X        0,        /* nc0 */
  575. X        1,        /* nc1 */
  576. X        0,        /* a20m */
  577. X        0,        /* ken */
  578. X        0,        /* flush */
  579. X        1,        /* barb */
  580. X        0,        /* co */
  581. X        0        /* susp */
  582. X    },
  583. X
  584. X    /*** Cache control register 1 ***/
  585. X    {
  586. X        0,        /* rpl */
  587. X        0        /* reserved: must be 0 */
  588. X    },
  589. X
  590. X    /*** Non-cacheable regions ***/
  591. X    {
  592. X        /* region 0 */
  593. X        {
  594. X            0xa0000,    /* addr */
  595. X            NCREG_128KB    /* offset */
  596. X        },
  597. X
  598. X        /* region 1 */
  599. X        {
  600. X            0xc0000,    /* addr */
  601. X            NCREG_256KB    /* offset */
  602. X        },
  603. X
  604. X        /* region 2 */
  605. X        {
  606. X            0x0,        /* addr */
  607. X            NCREG_DISABLE    /* offset */
  608. X        },
  609. X
  610. X        /* region 3 */
  611. X        {
  612. X            0x0,        /* addr */
  613. X            NCREG_DISABLE    /* offset */
  614. X        }
  615. X    }
  616. X};
  617. X
  618. END_OF_FILE
  619. if test 1518 -ne `wc -c <'Space.c'`; then
  620.     echo shar: \"'Space.c'\" unpacked with wrong size!
  621. fi
  622. # end of 'Space.c'
  623. fi
  624. if test -f 'System.ver0' -a "${1}" != "-c" ; then 
  625.   echo shar: Will not clobber existing file \"'System.ver0'\"
  626. else
  627. echo shar: Extracting \"'System.ver0'\" \(21 characters\)
  628. sed "s/^X//" >'System.ver0' <<'END_OF_FILE'
  629. Xcx    Y    1    0    0    0    0    0    0    0
  630. END_OF_FILE
  631. if test 21 -ne `wc -c <'System.ver0'`; then
  632.     echo shar: \"'System.ver0'\" unpacked with wrong size!
  633. fi
  634. # end of 'System.ver0'
  635. fi
  636. if test -f 'System.ver1' -a "${1}" != "-c" ; then 
  637.   echo shar: Will not clobber existing file \"'System.ver1'\"
  638. else
  639. echo shar: Extracting \"'System.ver1'\" \(72 characters\)
  640. sed "s/^X//" >'System.ver1' <<'END_OF_FILE'
  641. X#ident "@(#)System.4_2    1.1 92/12/01"
  642. X$version 1
  643. Xcx    Y    1    0    0    0    0    0    0    0    -1
  644. END_OF_FILE
  645. if test 72 -ne `wc -c <'System.ver1'`; then
  646.     echo shar: \"'System.ver1'\" unpacked with wrong size!
  647. fi
  648. # end of 'System.ver1'
  649. fi
  650. if test -f 'cx.c' -a "${1}" != "-c" ; then 
  651.   echo shar: Will not clobber existing file \"'cx.c'\"
  652. else
  653. echo shar: Extracting \"'cx.c'\" \(5731 characters\)
  654. sed "s/^X//" >'cx.c' <<'END_OF_FILE'
  655. X/*
  656. X *    cx.c        UNIX(tm) System V/386 driver to control the Cyrix(tm)
  657. X *            Cx486DLC/SLC CPU internal cache.
  658. X *
  659. X *    by Ti Kan
  660. X *    E-mail:        Internet: ti@amb.org
  661. X *            UUCP: ...!decwrl!sgiblab!bazooka!ti
  662. X *                  ...!uunet!bazooka!ti
  663. X *
  664. X *    Copyright (c) Ti Kan 1993, All rights reserved.
  665. X *
  666. X *    This software can be distributed freely.  This software,
  667. X *    and software based on or that uses code from it cannot
  668. X *    be used for commercial purposes without consent of the
  669. X *    copyright holder.  This copyright notice must appear in
  670. X *    all products that is based on or uses code from this
  671. X *    software.
  672. X */
  673. X#ident "@(#)cx.c    1.16 93/03/14"
  674. X
  675. X#include "sys/types.h"
  676. X#include "sys/param.h"
  677. X#include "sys/cmn_err.h"
  678. X#include "sys/errno.h"
  679. X#include "sys/dir.h"
  680. X#include "sys/user.h"
  681. X#ifdef SVR4
  682. X#include "sys/cred.h"
  683. X#include "sys/file.h"
  684. X#include "sys/conf.h"
  685. X#include "sys/ddi.h"
  686. X#endif
  687. X#include "sys/cx.h"
  688. X
  689. X#ifdef DEBUG
  690. X#define STATIC
  691. X#define DPRINTF(f,a)    cmn_err(CE_NOTE,(f),(a))
  692. X#else
  693. X#define STATIC        static
  694. X#define DPRINTF(f,a)
  695. X#endif
  696. X
  697. X#ifndef VERS
  698. X#define VERS        "undef"
  699. X#endif
  700. X
  701. X#ifdef SVR4
  702. Xint            cx_devflag = 0;        /* DDI/DKI compliance */
  703. X#endif
  704. X
  705. Xextern void        cx_i486cacheon(void),
  706. X            cx_i486cacheoff(void);
  707. Xextern int        cx_i486cachemode(void),
  708. X            cx_iscyrix(void);
  709. X
  710. Xextern int        cx_base;
  711. Xextern cxparms_t    cx_dfltparms;
  712. X
  713. Xint            cx_found = 0;
  714. Xcxparms_t        cx_savparms;
  715. X
  716. X
  717. X/*
  718. X * Internal Routines
  719. X */
  720. X
  721. XSTATIC void
  722. Xcx_setcachectl(cxparms_t *ctl_p)
  723. X{
  724. X    int    i;
  725. X    u_char    *cp,
  726. X        buf0,
  727. X        buf1,
  728. X        buf2;
  729. X
  730. X    /*
  731. X     * The following sets cache control attributes
  732. X     */
  733. X
  734. X    /* Cache config register 0: C0 */
  735. X    cp = (u_char *) &ctl_p->reg0;
  736. X    outb(cx_base, 0xc0);
  737. X    outb(cx_base + 1, *cp);
  738. X
  739. X    /* Cache config register 1: C1 */
  740. X    cp = (u_char *) &ctl_p->reg1;
  741. X    outb(cx_base, 0xc1);
  742. X    outb(cx_base + 1, *cp);
  743. X
  744. X    /*
  745. X     * The following sets cacheable regions
  746. X     */
  747. X
  748. X    for (i = 0; i < NNCREGS; i++) {
  749. X        buf0 = (ctl_p->noncache[i].addr >> 24) & 0xff;
  750. X        buf1 = (ctl_p->noncache[i].addr >> 16) & 0xff;
  751. X        buf2 = ((ctl_p->noncache[i].addr >> 8) & 0xf0) |
  752. X               (ctl_p->noncache[i].offset & 0x0f);
  753. X
  754. X        /* registers C4, C7, CA, CD */
  755. X        outb(cx_base, 0xc4 + i);
  756. X        outb(cx_base + 1, buf0);
  757. X
  758. X        /* registers C5, C8, CB, CE */
  759. X        outb(cx_base, 0xc5 + i);
  760. X        outb(cx_base + 1, buf1);
  761. X
  762. X        /* registers C6, C9, CC, CF */
  763. X        outb(cx_base, 0xc6 + i);
  764. X        outb(cx_base + 1, buf2);
  765. X    }
  766. X
  767. X    /* Save a copy of the current configuration */
  768. X    bcopy((caddr_t) ctl_p, (caddr_t) &cx_savparms, sizeof(cxparms_t));
  769. X}
  770. X
  771. X
  772. XSTATIC void
  773. Xcx_getcachectl(cxparms_t *ctl_p)
  774. X{
  775. X    u_char    *cp,
  776. X        buf0,
  777. X        buf1,
  778. X        buf2;
  779. X
  780. X
  781. X    /* Set the parameters to the saved version */
  782. X    bcopy((caddr_t) &cx_savparms, (caddr_t) ctl_p, sizeof(cxparms_t));
  783. X
  784. X    /*
  785. X     * The following gets cache control attributes.  We rely on
  786. X     * the saved version of the noncacheable region parameters
  787. X     * because the C4-CF registers are write-only.  We could just
  788. X     * use the saved parameters for everything else as well,
  789. X     * but why not query the hardware when we can?
  790. X     */
  791. X
  792. X    /* Cache config register 0: C0 */
  793. X    cp = (u_char *) &ctl_p->reg0;
  794. X    outb(cx_base, 0xc0);
  795. X    *cp = inb(cx_base + 1);
  796. X
  797. X    /* Cache config register 1: C1 */
  798. X    cp = (u_char *) &ctl_p->reg1;
  799. X    outb(cx_base, 0xc1);
  800. X    *cp = inb(cx_base + 1);
  801. X
  802. X    /* Cache mode */
  803. X    ctl_p->mode = cx_i486cachemode();
  804. X}
  805. X
  806. X
  807. XSTATIC int
  808. Xcx_do_ioctl(int cmd, void *arg, int priv)
  809. X{
  810. X    int        i, ospl;
  811. X    cxparms_t    curparms,
  812. X            *cp;
  813. X
  814. X    if (!cx_found)
  815. X        return(ENODEV);
  816. X
  817. X    switch (cmd) {
  818. X    case CX_SETPARM:
  819. X        if (!priv)
  820. X            return(EPERM);
  821. X
  822. X        /* Check parameters in the NC region for validity */
  823. X        cp = (cxparms_t *) arg;
  824. X#ifdef PARANOID
  825. X        cx_getcachectl(&curparms);
  826. X
  827. X        /* Changing these parameters on-the-fly will likely
  828. X         * be risky...
  829. X         */
  830. X        if (cp->reg0.co != curparms.reg0.co ||
  831. X            cp->reg0.a20m != curparms.reg0.a20m ||
  832. X            cp->reg0.ken != curparms.reg0.ken ||
  833. X            cp->reg0.flush != curparms.reg0.flush ||
  834. X            cp->reg0.susp != curparms.reg0.susp ||
  835. X            cp->reg1.rpl != curparms.reg1.rpl) {
  836. X            return(EACCES);
  837. X        }
  838. X#endif
  839. X        for (i = 0; i < NNCREGS; i++) {
  840. X            if ((cp->noncache[i].addr & 0x0fff) ||
  841. X                (cp->noncache[i].offset & 0xf0))
  842. X            return(EINVAL);
  843. X        }
  844. X
  845. X        if (copyin(arg, (caddr_t) &curparms, sizeof(cxparms_t)) < 0)
  846. X            return(EFAULT);
  847. X
  848. X        ospl = splhi();
  849. X        cx_i486cacheoff();
  850. X        cx_setcachectl(&curparms);
  851. X        if (curparms.mode == CX_ENABLE)
  852. X            cx_i486cacheon();
  853. X        splx(ospl);
  854. X        break;
  855. X
  856. X    case CX_GETPARM:
  857. X        ospl = splhi();
  858. X        cx_getcachectl(&curparms);
  859. X        splx(ospl);
  860. X
  861. X        if (copyout((caddr_t) &curparms, arg, sizeof(cxparms_t)) < 0)
  862. X            return(EFAULT);
  863. X        break;
  864. X
  865. X    case CX_SETDFLT:
  866. X        if (!priv)
  867. X            return(EPERM);
  868. X
  869. X        ospl = splhi();
  870. X        cx_i486cacheoff();
  871. X        cx_setcachectl(&cx_dfltparms);
  872. X        if (cx_dfltparms.mode == CX_ENABLE)
  873. X            cx_i486cacheon();
  874. X        splx(ospl);
  875. X        break;
  876. X
  877. X    case CX_GETDFLT:
  878. X        if (copyout((caddr_t) &cx_dfltparms, arg,
  879. X                sizeof(cxparms_t)) < 0)
  880. X            return(EFAULT);
  881. X        break;
  882. X
  883. X    default:
  884. X        return(EINVAL);
  885. X    }
  886. X
  887. X    return(0);
  888. X}
  889. X
  890. X
  891. X/*
  892. X * Public Routines
  893. X */
  894. X
  895. Xvoid
  896. Xcx_init(void)
  897. X{
  898. X    if ((cx_found = cx_iscyrix()) == 1) {
  899. X        cx_i486cacheoff();
  900. X        cx_setcachectl(&cx_dfltparms);
  901. X        if (cx_dfltparms.mode == CX_ENABLE)
  902. X            cx_i486cacheon();
  903. X#if defined(SVR3) && defined(sco)
  904. X        printcfg("cx", cx_base, 1, -1, -1, "vers=%s type=Cx486DLC/SLC",
  905. X            VERS);
  906. X#else    /* sco */
  907. X        DPRINTF("cx %s: Running on Cx486DLC/SLC CPU.", VERS);
  908. X#endif    /* sco */
  909. X    }
  910. X
  911. X    /* Copy the default parameters into the save buffer */
  912. X    bcopy((caddr_t) &cx_dfltparms, (caddr_t) &cx_savparms,
  913. X          sizeof(cxparms_t));
  914. X}
  915. X
  916. X
  917. X#ifdef SVR4
  918. Xint
  919. Xcx_ioctl(dev_t dev, int cmd, void *arg, int mode, cred_t *crp, int *rvalp)
  920. X#else
  921. Xvoid
  922. Xcx_ioctl(dev_t dev, int cmd, void *arg, int mode)
  923. X#endif
  924. X{
  925. X    int    priv = 0,
  926. X        ret;
  927. X
  928. X#ifdef SVR4
  929. X    if (drv_priv(crp) == 0)
  930. X#else
  931. X    if (suser())
  932. X#endif
  933. X        priv = 1;
  934. X
  935. X    ret = cx_do_ioctl(cmd, arg, priv);
  936. X
  937. X#ifdef SVR4
  938. X    return(ret);
  939. X#else
  940. X    u.u_error = ret;
  941. X#endif
  942. X}
  943. X
  944. END_OF_FILE
  945. if test 5731 -ne `wc -c <'cx.c'`; then
  946.     echo shar: \"'cx.c'\" unpacked with wrong size!
  947. fi
  948. # end of 'cx.c'
  949. fi
  950. if test -f 'cx.h' -a "${1}" != "-c" ; then 
  951.   echo shar: Will not clobber existing file \"'cx.h'\"
  952. else
  953. echo shar: Extracting \"'cx.h'\" \(3058 characters\)
  954. sed "s/^X//" >'cx.h' <<'END_OF_FILE'
  955. X/*
  956. X *    cx.h        UNIX(tm) System V/386 driver to control the Cyrix(tm)
  957. X *            Cx486DLC/SLC CPU internal cache.
  958. X *
  959. X *    by Ti Kan
  960. X *    E-mail:        Internet: ti@amb.org
  961. X *            UUCP: ...!decwrl!sgiblab!bazooka!ti
  962. X *                  ...!uunet!bazooka!ti
  963. X *
  964. X *    Copyright (c) Ti Kan 1993, All rights reserved.
  965. X *
  966. X *    This software can be distributed freely.  This software,
  967. X *    and software based on or that uses code from it cannot
  968. X *    be used for commercial purposes without consent of the
  969. X *    copyright holder.  This copyright notice must appear in
  970. X *    all products that is based on or uses code from this
  971. X *    software.
  972. X */
  973. X
  974. X#ifndef _SYS_CX_H_
  975. X#define _SYS_CX_H_
  976. X
  977. X#ident "@(#)cx.h    1.9 93/03/14"
  978. X
  979. X/* Used for ioctl */
  980. X#define CX_PREFIX    ('c'<<16|'x'<<8)
  981. X#define CX_SETPARM    (CX_PREFIX|1)    /* Set cache parameters */
  982. X#define CX_GETPARM    (CX_PREFIX|2)    /* Get current cache parameters */
  983. X#define CX_SETDFLT    (CX_PREFIX|3)    /* Set cache parameters to default */
  984. X#define CX_GETDFLT    (CX_PREFIX|4)    /* Get default cache parameters */
  985. X
  986. X#define CX_DISABLE    0    /* Cache disable */
  987. X#define CX_ENABLE    1    /* Cache enable */
  988. X
  989. X#define NNCREGS        4    /* Max non-cacheable regions */
  990. X
  991. X/* Non-cacheable region size code macros */
  992. X#define NCREG_DISABLE    0x00    /* Disabled */
  993. X#define NCREG_4KB    0x01    /* 4KB */
  994. X#define NCREG_8KB    0x02    /* 8KB */
  995. X#define NCREG_16KB    0x03    /* 16KB */
  996. X#define NCREG_32KB    0x04    /* 32KB */
  997. X#define NCREG_64KB    0x05    /* 64KB */
  998. X#define NCREG_128KB    0x06    /* 128KB */
  999. X#define NCREG_256KB    0x07    /* 256KB */
  1000. X#define NCREG_512KB    0x08    /* 512KB */
  1001. X#define NCREG_1MB    0x09    /* 1MB */
  1002. X#define NCREG_2MB    0x0a    /* 2MB */
  1003. X#define NCREG_4MB    0x0b    /* 4MB */
  1004. X#define NCREG_8MB    0x0c    /* 8MB */
  1005. X#define NCREG_16MB    0x0d    /* 16MB */
  1006. X#define NCREG_32MB    0x0e    /* 32MB */
  1007. X#define NCREG_4GB    0x0f    /* 4GB */
  1008. X
  1009. X
  1010. X/* Non-cacheable regions parameters */
  1011. Xtypedef struct {
  1012. X    ulong    addr;        /* Starting address */
  1013. X    u_char    offset;        /* Region size code: use macros above */
  1014. X} ncreg_t;
  1015. X
  1016. X
  1017. X/* Cache configuration register 0 */
  1018. Xtypedef struct {
  1019. X    u_char    nc0:1;        /* Set first 64KB of every 1MB boundary non-
  1020. X                 * cacheable, when operating in real or v86
  1021. X                 * mode.
  1022. X                 */
  1023. X
  1024. X    u_char    nc1:1;        /* Set the 640K-1M region as non-cacheable */
  1025. X
  1026. X    u_char    a20m:1;        /* Enable A20M# input pin */
  1027. X
  1028. X    u_char    ken:1;        /* Enable KEN# input pin */
  1029. X
  1030. X    u_char    flush:1;    /* Enable KEN# input pin */
  1031. X
  1032. X    u_char    barb:1;        /* Flush internal cache when hold state
  1033. X                 * entered.
  1034. X                 */
  1035. X
  1036. X    u_char    co:1;        /* cache organization:
  1037. X                 * 0: 2-way set associative
  1038. X                 * 1: direct mapped
  1039. X                 */
  1040. X    u_char    susp:1;        /* Enable SUSP# input and SUSPA# output pins */
  1041. X} cxreg0_t;
  1042. X
  1043. X
  1044. X/* Cache configuration register 1 */
  1045. Xtypedef struct {
  1046. X    u_char    rpl:1;        /* Enable output pins RPLSET and RPLVAL#.  If
  1047. X                 * not enabled, both output pins will float.
  1048. X                 */
  1049. X
  1050. X    u_char    reserved:7;    /* Reserved */
  1051. X} cxreg1_t;
  1052. X
  1053. X
  1054. X/* Cache control parameters */
  1055. Xtypedef struct cxparms {
  1056. X    int        mode;    /* Cache on/off: CX_ENABLE, CX_DISABLE */
  1057. X    cxreg0_t    reg0;    /* Cache config register 0 */
  1058. X    cxreg1_t    reg1;    /* Cache config register 1 */
  1059. X    ncreg_t        noncache[NNCREGS];    /* Non-cacheable regions */
  1060. X} cxparms_t;
  1061. X
  1062. X#endif /* _SYS_CX_H_ */
  1063. END_OF_FILE
  1064. if test 3058 -ne `wc -c <'cx.h'`; then
  1065.     echo shar: \"'cx.h'\" unpacked with wrong size!
  1066. fi
  1067. # end of 'cx.h'
  1068. fi
  1069. if test -f 'cx_ml.s' -a "${1}" != "-c" ; then 
  1070.   echo shar: Will not clobber existing file \"'cx_ml.s'\"
  1071. else
  1072. echo shar: Extracting \"'cx_ml.s'\" \(4660 characters\)
  1073. sed "s/^X//" >'cx_ml.s' <<'END_OF_FILE'
  1074. X/
  1075. X/    cx_ml.s        UNIX(tm) System V/386 driver to control the Cyrix(tm)
  1076. X/            Cx486DLC/SLC CPU internal cache.
  1077. X/
  1078. X/    by Ti Kan
  1079. X/    E-mail:        Internet: ti@amb.org
  1080. X/            UUCP: ...!decwrl!sgiblab!bazooka!ti
  1081. X/                  ...!uunet!bazooka!ti
  1082. X/
  1083. X/    This file contains some code fragments adapted from the public
  1084. X/    domain.
  1085. X/
  1086. X/    Copyright (c) Ti Kan 1993, All rights reserved.
  1087. X/
  1088. X/    This software can be distributed freely.  This software,
  1089. X/    and software based on or that uses code from it cannot
  1090. X/    be used for commercial purposes without consent of the
  1091. X/    copyright holder.  This copyright notice must appear in
  1092. X/    all products that is based on or uses code from this
  1093. X/    software.
  1094. X/
  1095. X    .ident "@(#)cx_ml.s    1.7 93/03/14"
  1096. X
  1097. X    .data                / Data section
  1098. X
  1099. X    .align    4
  1100. Xcx_flags_mask:        .long    0x08d5    / Mask to isolate the undefined bits
  1101. X                    / masks all but OF, SF, ZF, AF, PF, CF
  1102. Xcx_flags_before:    .long    0    / Flags before div
  1103. Xcx_flags_after:        .long    0    / Flags after div
  1104. Xcx_dividend:        .long    0xffff    / Dividend
  1105. Xcx_divisor:        .long    0x4    / Divisor
  1106. Xcx_result:        .long    0    / Results of flags compare
  1107. X                    / 0=different (Intel), 1=same (Cyrix)
  1108. X
  1109. X    .text                / Text section
  1110. X
  1111. X    .set    CR0_CD_ENB, 0xbfffffff    / Enable cache with CR0
  1112. X    .set    CR0_NW_ENB, 0xdfffffff    / Enable writethru with CR0
  1113. X    .set    CR0_CD_DIS, 0x40000000    / Disable cache with CR0
  1114. X    .set    CR0_NW_DIS, 0x20000000    / Disable writethru with CR0
  1115. X                    / Actually, the NW bit on hardwired
  1116. X                    / to 0 at all times on the Cyrix,
  1117. X                    / but we set and clear it anyway...
  1118. X
  1119. X/
  1120. X/    void cx_i486cacheon(void)
  1121. X/
  1122. X/    This routine flushes and enables the i486 internal cache.
  1123. X/
  1124. X    .align    4
  1125. X    .globl    cx_i486cacheon
  1126. Xcx_i486cacheon:
  1127. X    pushl    %ebp
  1128. X    movl    %esp, %ebp
  1129. X    movl    cx_found, %eax        / Are we running on a Cyrix?
  1130. X    orl    %eax, %eax
  1131. X    jz    cx_cacheon_done        / Not Cyrix: just return
  1132. X    .byte    0x0f            / INVD instruction:
  1133. X    .byte    0x08            / Flush i486 cache
  1134. X    .byte    0x0f            / WBINVD instruction:
  1135. X    .byte    0x09            / Flush i486 cache with write back
  1136. X    jmp    cx_postinvd1        / jmp to next to force queue flush
  1137. Xcx_postinvd1:
  1138. X    movl    %cr0, %eax              / cr0 -> eax
  1139. X    andl    $CR0_CD_ENB, %eax    / Turn "on" CD bit
  1140. X    andl    $CR0_NW_ENB, %eax    / Turn "on" NW bit
  1141. X    movl    %eax, %cr0              / eax -> cr0
  1142. Xcx_cacheon_done:
  1143. X    popl    %ebp
  1144. X    ret
  1145. X
  1146. X/
  1147. X/    void cx_i486cacheoff(void)
  1148. X/
  1149. X/    This routine disables and flushes the i486 internal cache.
  1150. X/
  1151. X    .align    4
  1152. X    .globl    cx_i486cacheoff
  1153. Xcx_i486cacheoff:
  1154. X    pushl    %ebp
  1155. X    movl    %esp, %ebp
  1156. X    movl    cx_found, %eax        / Are we running on a Cyrix?
  1157. X    orl    %eax, %eax
  1158. X    jz    cx_cacheoff_done    / Not Cyrix: just return
  1159. X    movl    %cr0, %eax              / cr0 -> eax
  1160. X    orl    $CR0_CD_DIS, %eax    / Turn "off" CD bit
  1161. X    orl    $CR0_NW_DIS, %eax    / Turn "off" CD bit
  1162. X    movl    %eax, %cr0              / eax -> cr0
  1163. X    .byte    0x0f            / INVD instruction:
  1164. X    .byte    0x08            / Flush i486 cache
  1165. X    .byte    0x0f            / WBINVD instruction:
  1166. X    .byte    0x09            / Flush i486 cache with write back
  1167. X    jmp    cx_postinvd2        / Jmp to next to force queue flush
  1168. Xcx_postinvd2:
  1169. Xcx_cacheoff_done:
  1170. X    popl    %ebp
  1171. X    ret
  1172. X
  1173. X/
  1174. X/    int cx_iscyrix(void)
  1175. X/
  1176. X/    This routine returns 1 if we are running on a 486DLC/SLC CPU.
  1177. X/    Otherwise, it returns 0.
  1178. X/
  1179. X    .align    4
  1180. X    .globl    cx_iscyrix
  1181. Xcx_iscyrix:
  1182. X    pushl    %ebp
  1183. X    movl    %esp, %ebp
  1184. X
  1185. X    pushal                / Save processor state
  1186. X    pushfl
  1187. X
  1188. X    movl    $0, %eax        / Set flags to known state    
  1189. X    cmpl    %eax, %eax
  1190. X
  1191. X    pushfl                / Load flags into eax
  1192. X    popl    %eax
  1193. X    movl    %eax, cx_flags_before    / Save flags to mem
  1194. X
  1195. X    / Do a div instruction so that the signature of the undefined flags
  1196. X    / can be observed
  1197. X    movl    cx_dividend, %eax
  1198. X    movl    $0, %edx
  1199. X    movl    cx_divisor, %ebx
  1200. X    divl    %ebx
  1201. X
  1202. X    pushfl                / Load flags into eax
  1203. X    popl    %eax
  1204. X
  1205. X    movl    %eax, cx_flags_after    / Save flags to mem
  1206. X
  1207. X    / Recall cx_flags_before and clear unwanted bits
  1208. X    movl    cx_flags_mask, %eax
  1209. X    andl    cx_flags_before, %eax
  1210. X
  1211. X    / Recall cx_flags_after and clear unwanted bits
  1212. X    movl    cx_flags_mask, %ebx
  1213. X    andl    cx_flags_after, %ebx
  1214. X
  1215. X    / Compare the signature of the undefined bits before and after
  1216. X    cmpl    %ebx, %eax
  1217. X    jnz    cx_not_cyrix
  1218. X    movl    $1, cx_result        / Set if flag bits are unchanged
  1219. X                    / Cyrix part found
  1220. X    jmp    cx_detect_done
  1221. Xcx_not_cyrix:
  1222. X    movl    $0, cx_result        / Clear if flag bits are changed
  1223. X                    / Cyrix part not found
  1224. Xcx_detect_done:
  1225. X    popfl                / Restore processor state
  1226. X    popal
  1227. X
  1228. X    movl    cx_result, %eax        / Return value
  1229. X
  1230. X    popl    %ebp
  1231. X    ret
  1232. X
  1233. X/
  1234. X/    int cx_i486cachemode(void)
  1235. X/
  1236. X/    This routine returns 1 if we the i486 cache is enabled.
  1237. X/    Otherwise, it returns 0.
  1238. X/
  1239. X    .align    4
  1240. X    .globl    cx_i486cachemode
  1241. Xcx_i486cachemode:
  1242. X    pushl    %ebp
  1243. X    movl    %esp, %ebp
  1244. X
  1245. X    movl    %cr0, %eax              / cr0 -> eax
  1246. X    andl    $CR0_CD_DIS, %eax    / Test if CD bit "on"
  1247. X    orl    %eax, %eax
  1248. X    jnz    cx_cacheisoff
  1249. X
  1250. X    movl    $1, %eax        / Cache is on: set return value
  1251. X    jmp    cx_mode_done
  1252. X
  1253. Xcx_cacheisoff:
  1254. X    movl    $0, %eax        / Cache is off: set return value
  1255. X
  1256. Xcx_mode_done:
  1257. X
  1258. X    popl    %ebp
  1259. X    ret
  1260. X
  1261. END_OF_FILE
  1262. if test 4660 -ne `wc -c <'cx_ml.s'`; then
  1263.     echo shar: \"'cx_ml.s'\" unpacked with wrong size!
  1264. fi
  1265. # end of 'cx_ml.s'
  1266. fi
  1267. if test -f 'cxctl.c' -a "${1}" != "-c" ; then 
  1268.   echo shar: Will not clobber existing file \"'cxctl.c'\"
  1269. else
  1270. echo shar: Extracting \"'cxctl.c'\" \(11523 characters\)
  1271. sed "s/^X//" >'cxctl.c' <<'END_OF_FILE'
  1272. X/*
  1273. X *    cxctl.c        UNIX(tm) System V/386 utility to control the Cyrix(tm)
  1274. X *            Cx486DLC/SLC CPU internal cache.
  1275. X *
  1276. X *    The utility can be used only on systems installed with the
  1277. X *    Cyrix cache device driver (cx).
  1278. X *
  1279. X *    Warning: Changing some of the cache parameters on a live system
  1280. X *         can lead to a system crash or data corruption.  Compile
  1281. X *         with -DPARANOID to prevent this from happening.
  1282. X *
  1283. X *    by Ti Kan
  1284. X *    E-mail:        Internet: ti@amb.org
  1285. X *            UUCP: ...!decwrl!sgiblab!bazooka!ti
  1286. X *                  ...!uunet!bazooka!ti
  1287. X *
  1288. X *    Copyright (c) Ti Kan 1993, All rights reserved.
  1289. X *
  1290. X *    This software can be distributed freely.  This software,
  1291. X *    and software based on or that uses code from it cannot
  1292. X *    be used for commercial purposes without consent of the
  1293. X *    copyright holder.  This copyright notice must appear in
  1294. X *    all products that is based on or uses code from this
  1295. X *    software.
  1296. X */
  1297. X#ident "@(#)cxctl.c    1.15 93/03/15"
  1298. X
  1299. X#include <stdio.h>
  1300. X#include <sys/types.h>
  1301. X#include <ctype.h>
  1302. X#include <fcntl.h>
  1303. X#include <errno.h>
  1304. X#include "sys/cx.h"
  1305. X
  1306. X#ifndef VERS
  1307. X#define VERS    "undef"
  1308. X#endif
  1309. X
  1310. X
  1311. Xextern int    opterr,
  1312. X        optind;
  1313. Xextern char    *optarg;
  1314. X
  1315. Xint        changed = 0;    /* Flag to indicate change to parameters */
  1316. X
  1317. X
  1318. Xint
  1319. Xdo_ioctl(int fd, cxparms_t *pp, int cmd)
  1320. X{
  1321. X    if (ioctl(fd, cmd, pp) < 0) {
  1322. X        perror("ioctl error");
  1323. X
  1324. X        switch (errno) {
  1325. X        case EACCES:
  1326. X            fprintf(stderr,
  1327. X                "Attempt to change parameters that are disallowed.\n");
  1328. X            break;
  1329. X        case EPERM:
  1330. X            fprintf(stderr,
  1331. X                "You must be the super user to effect change.\n");
  1332. X            break;
  1333. X        default:
  1334. X            break;
  1335. X        }
  1336. X
  1337. X        return(0);
  1338. X    }
  1339. X    return(1);
  1340. X}
  1341. X
  1342. X
  1343. Xchar *
  1344. Xoffset_str(u_char offset)
  1345. X{
  1346. X    static char    buf[10];
  1347. X
  1348. X    switch (offset) {
  1349. X    case NCREG_4KB:
  1350. X        strcpy(buf, "4KB");
  1351. X        break;
  1352. X    case NCREG_8KB:
  1353. X        strcpy(buf, "8KB");
  1354. X        break;
  1355. X    case NCREG_16KB:
  1356. X        strcpy(buf, "16KB");
  1357. X        break;
  1358. X    case NCREG_32KB:
  1359. X        strcpy(buf, "32KB");
  1360. X        break;
  1361. X    case NCREG_64KB:
  1362. X        strcpy(buf, "64KB");
  1363. X        break;
  1364. X    case NCREG_128KB:
  1365. X        strcpy(buf, "128KB");
  1366. X        break;
  1367. X    case NCREG_256KB:
  1368. X        strcpy(buf, "256KB");
  1369. X        break;
  1370. X    case NCREG_512KB:
  1371. X        strcpy(buf, "512KB");
  1372. X        break;
  1373. X    case NCREG_1MB:
  1374. X        strcpy(buf, "1MB");
  1375. X        break;
  1376. X    case NCREG_2MB:
  1377. X        strcpy(buf, "2MB");
  1378. X        break;
  1379. X    case NCREG_4MB:
  1380. X        strcpy(buf, "4MB");
  1381. X        break;
  1382. X    case NCREG_8MB:
  1383. X        strcpy(buf, "8MB");
  1384. X        break;
  1385. X    case NCREG_16MB:
  1386. X        strcpy(buf, "16MB");
  1387. X        break;
  1388. X    case NCREG_32MB:
  1389. X        strcpy(buf, "32MB");
  1390. X        break;
  1391. X    case NCREG_4GB:
  1392. X        strcpy(buf, "4GB");
  1393. X        break;
  1394. X    }
  1395. X
  1396. X    return(buf);
  1397. X}
  1398. X
  1399. X
  1400. Xvoid
  1401. Xshow_parms(cxparms_t *pp)
  1402. X{
  1403. X    int    i;
  1404. X
  1405. X    printf("Cache:\t\t\t%s\n",
  1406. X        (pp->mode == CX_ENABLE) ? "Enable" : "Disable");
  1407. X
  1408. X    printf("Config register 0:");
  1409. X    printf("\tNC0=%d NC1=%d A20M=%d KEN=%d FLUSH=%d BARB=%d CO=%d SUSP=%d\n",
  1410. X        pp->reg0.nc0,
  1411. X        pp->reg0.nc1,
  1412. X        pp->reg0.a20m,
  1413. X        pp->reg0.ken,
  1414. X        pp->reg0.flush,
  1415. X        pp->reg0.barb,
  1416. X        pp->reg0.co,
  1417. X        pp->reg0.susp);
  1418. X
  1419. X    printf("Config register 1:");
  1420. X    printf("\tRPL=%d\n", pp->reg1.rpl);
  1421. X
  1422. X    for (i = 0; i < NNCREGS; i++) {
  1423. X        printf("Non-cacheable region %d:\t", i);
  1424. X        if (pp->noncache[i].offset == NCREG_DISABLE)
  1425. X            printf("Disable\n");
  1426. X        else
  1427. X            printf("addr=0x%lx offset=%s\n",
  1428. X                pp->noncache[i].addr,
  1429. X                offset_str(pp->noncache[i].offset));
  1430. X    }
  1431. X}
  1432. X
  1433. X
  1434. Xvoid
  1435. Xshow_help(void)
  1436. X{
  1437. X    printf("Valid commands are:\n%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
  1438. X        "\tc\tEnable/Disable cache\n",
  1439. X        "\t1\tToggle Cache Config Register 0 - bit NC0\n",
  1440. X        "\t2\tToggle Cache Config Register 0 - bit NC1\n",
  1441. X        "\t3\tToggle Cache Config Register 0 - bit A20M\n",
  1442. X        "\t4\tToggle Cache Config Register 0 - bit KEN\n",
  1443. X        "\t5\tToggle Cache Config Register 0 - bit FLUSH\n",
  1444. X        "\t6\tToggle Cache Config Register 0 - bit BARB\n",
  1445. X        "\t7\tToggle Cache Config Register 0 - bit CO \n",
  1446. X        "\t8\tToggle Cache Config Register 0 - bit SUSP\n",
  1447. X        "\t9\tToggle Cache Config Register 1 - bit RPL\n",
  1448. X        "\tn\tConfigure Non-cacheable Region\n",
  1449. X        "\ts\tShow current parameters\n",
  1450. X        "\td\tShow default parameters\n",
  1451. X        "\tD\tChange to default parameters\n",
  1452. X        "\te\tSet hardware to current parameters\n",
  1453. X        "\t?\tDisplay this help information\n",
  1454. X        "\tq\tQuit\n");
  1455. X}
  1456. X
  1457. X
  1458. Xchar
  1459. Xget_yn(char *msg)
  1460. X{
  1461. X    char    buf[5];
  1462. X
  1463. X    while (1) {
  1464. X        printf(msg);
  1465. X        if (fgets(buf, sizeof(buf), stdin) == NULL)
  1466. X            continue;
  1467. X        if (buf[0] == 'y' || buf[0] == 'n' ||
  1468. X            buf[0] == 'Y' || buf[0] == 'N')
  1469. X            break;
  1470. X        printf("Please answer 'y' or 'n'.\n");
  1471. X    }
  1472. X    return(tolower(buf[0]));
  1473. X}
  1474. X
  1475. X
  1476. Xint
  1477. Xget_dec(char *msg)
  1478. X{
  1479. X    char    buf[40];
  1480. X
  1481. X    while (1) {
  1482. X        printf(msg);
  1483. X        if (fgets(buf, sizeof(buf), stdin) == NULL)
  1484. X            continue;
  1485. X        if (isdigit(buf[0]))
  1486. X            break;
  1487. X        printf("Invalid value entered.\n");
  1488. X    }
  1489. X    return(atoi(buf));
  1490. X}
  1491. X
  1492. X
  1493. Xulong
  1494. Xget_hex(char *msg)
  1495. X{
  1496. X    char    buf[40];
  1497. X    ulong    result;
  1498. X
  1499. X    while (1) {
  1500. X        printf(msg);
  1501. X        if (fgets(buf, sizeof(buf), stdin) == NULL)
  1502. X            continue;
  1503. X        if (sscanf(buf, "%lx\n", &result) >= 1 ||
  1504. X            sscanf(buf, "%lX\n", &result) >= 1)
  1505. X            break;
  1506. X        printf("Invalid value entered.\n");
  1507. X    }
  1508. X    return(result);
  1509. X}
  1510. X
  1511. X
  1512. Xvoid
  1513. Xncreg_config(cxparms_t *pp)
  1514. X{
  1515. X    int    ncregion;
  1516. X    ulong    addr, offset;
  1517. X    char    msg[256];
  1518. X
  1519. X    sprintf(msg, "Region number? [0-%d] ", NNCREGS - 1);
  1520. X
  1521. X    do {
  1522. X        if ((ncregion = get_dec(msg)) >= NNCREGS || ncregion < 0)
  1523. X            printf("Invalid region number.\n");
  1524. X        else
  1525. X            break;
  1526. X    } while (1);
  1527. X
  1528. X    sprintf(msg,
  1529. X        "\n%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\nChoose Region %d size: ",
  1530. X        "\t0\tDisable\n",
  1531. X        "\t1\t  4KB\n",
  1532. X        "\t2\t  8KB\n",
  1533. X        "\t3\t 16KB\n",
  1534. X        "\t4\t 32KB\n",
  1535. X        "\t5\t 64KB\n",
  1536. X        "\t6\t128KB\n",
  1537. X        "\t7\t256KB\n",
  1538. X        "\t8\t512KB\n",
  1539. X        "\t9\t  1MB\n",
  1540. X        "\ta\t  2MB\n",
  1541. X        "\tb\t  4MB\n",
  1542. X        "\tc\t  8MB\n",
  1543. X        "\td\t 16MB\n",
  1544. X        "\te\t 32MB\n",
  1545. X        "\tf\t  4GB\n",
  1546. X        ncregion);
  1547. X
  1548. X    do {
  1549. X        if ((offset = get_hex(msg)) & 0xf0)
  1550. X            printf("Invalid selection.\n");
  1551. X        else
  1552. X            break;
  1553. X    } while (1);
  1554. X
  1555. X    if (offset > 0) {
  1556. X        sprintf(msg,
  1557. X            "\nRegion %d starting address? (4KB boundaries) 0x",
  1558. X            ncregion);
  1559. X
  1560. X        do {
  1561. X            if ((addr = get_hex(msg)) & 0x0fff)
  1562. X                printf("Address is not on 4KB boundary.\n");
  1563. X            else
  1564. X                break;
  1565. X        } while (1);
  1566. X    }
  1567. X    else
  1568. X        addr = 0L;
  1569. X    
  1570. X    pp->noncache[ncregion].addr = addr;
  1571. X    pp->noncache[ncregion].offset = (u_char) offset;
  1572. X
  1573. X    printf("Non-cacheable Region %d set to ", ncregion);
  1574. X    if (offset > 0)
  1575. X        printf("addr=0x%lx offset=%s\n",
  1576. X            addr, offset_str((u_char) offset));
  1577. X    else
  1578. X        printf("Disable\n");
  1579. X}
  1580. X
  1581. X
  1582. Xchar
  1583. Xget_cmd(void)
  1584. X{
  1585. X    char    buf[5];
  1586. X
  1587. X    do {
  1588. X        printf("\ncx> ");
  1589. X    } while (fgets(buf, sizeof(buf), stdin) == NULL || buf[0] == '\n');
  1590. X
  1591. X    return(buf[0]);
  1592. X}
  1593. X
  1594. X
  1595. Xint
  1596. Xprocess_cmd(int fd, char cmd, cxparms_t *pp)
  1597. X{
  1598. X    static cxparms_t    tmp;
  1599. X
  1600. X    switch (cmd) {
  1601. X    case 'c':
  1602. X        if (pp->mode == CX_ENABLE)
  1603. X            pp->mode = CX_DISABLE;
  1604. X        else
  1605. X            pp->mode = CX_ENABLE;
  1606. X        changed = 1;
  1607. X        printf("Cache mode set to %s\n",
  1608. X            (pp->mode == CX_ENABLE) ? "Enable" : "Disable");
  1609. X        break;
  1610. X    case '1':
  1611. X        pp->reg0.nc0 = !pp->reg0.nc0;
  1612. X        changed = 1;
  1613. X        printf("Control register 0 - NC0 set to %d\n",
  1614. X            pp->reg0.nc0);
  1615. X        break;
  1616. X    case '2':
  1617. X        pp->reg0.nc1 = !pp->reg0.nc1;
  1618. X        changed = 1;
  1619. X        printf("Control register 0 - NC1 set to %d\n",
  1620. X            pp->reg0.nc1);
  1621. X        break;
  1622. X    case '3':
  1623. X#ifdef PARANOID
  1624. X        printf("The A20M bit cannot be changed in this version.\n");
  1625. X#else
  1626. X        printf("\nChanging the A20M bit is not recommended.\n");
  1627. X        if (get_yn("Proceed? [ny] ") == 'y') {
  1628. X            pp->reg0.a20m = !pp->reg0.a20m;
  1629. X            changed = 1;
  1630. X            printf("Control register 0 - A20M set to %d\n",
  1631. X                pp->reg0.a20m);
  1632. X        }
  1633. X        else
  1634. X            printf("The A20M bit is not changed.\n");
  1635. X#endif
  1636. X        break;
  1637. X    case '4':
  1638. X#ifdef PARANOID
  1639. X        printf("The KEN bit cannot be changed in this version.\n");
  1640. X#else
  1641. X        printf("\nChanging the KEN bit is not recommended.\n");
  1642. X        if (get_yn("Proceed? [ny] ") == 'y') {
  1643. X            pp->reg0.ken = !pp->reg0.ken;
  1644. X            changed = 1;
  1645. X            printf("Control register 0 - KEN set to %d\n",
  1646. X                pp->reg0.ken);
  1647. X        }
  1648. X        else
  1649. X            printf("The KEN bit is not changed.\n");
  1650. X#endif
  1651. X        break;
  1652. X    case '5':
  1653. X#ifdef PARANOID
  1654. X        printf("The FLUSH bit cannot be changed in this version.\n");
  1655. X#else
  1656. X        printf("\nChanging the FLUSH bit is not recommended.\n");
  1657. X        if (get_yn("Proceed? [ny] ") == 'y') {
  1658. X            pp->reg0.flush = !pp->reg0.flush;
  1659. X            changed = 1;
  1660. X            printf("Control register 0 - FLUSH set to %d\n",
  1661. X                pp->reg0.flush);
  1662. X        }
  1663. X        else
  1664. X            printf("The FLUSH bit is not changed.\n");
  1665. X#endif
  1666. X        break;
  1667. X    case '6':
  1668. X        pp->reg0.barb = !pp->reg0.barb;
  1669. X        changed = 1;
  1670. X        printf("Control register 0 - BARB set to %d\n",
  1671. X            pp->reg0.barb);
  1672. X        break;
  1673. X    case '7':
  1674. X#ifdef PARANOID
  1675. X        printf("The CO bit cannot be changed in this version.\n");
  1676. X#else
  1677. X        printf("\nChanging the CO bit is not recommended.\n");
  1678. X        if (get_yn("Proceed? [ny] ") == 'y') {
  1679. X            pp->reg0.co = !pp->reg0.co;
  1680. X            changed = 1;
  1681. X            printf("Control register 0 - CO set to %d\n",
  1682. X                pp->reg0.co);
  1683. X        }
  1684. X        else
  1685. X            printf("The CO bit is not changed.\n");
  1686. X#endif
  1687. X        break;
  1688. X    case '8':
  1689. X#ifdef PARANOID
  1690. X        printf("The SUSP bit cannot be changed in this version.\n");
  1691. X#else
  1692. X        printf("\nChanging the SUSP bit is not recommended.\n");
  1693. X        if (get_yn("Proceed? [ny] ") == 'y') {
  1694. X            pp->reg0.susp = !pp->reg0.susp;
  1695. X            changed = 1;
  1696. X            printf("Control register 0 - SUSP set to %d\n",
  1697. X                pp->reg0.susp);
  1698. X        }
  1699. X        else
  1700. X            printf("The SUSP bit is not changed.\n");
  1701. X#endif
  1702. X        break;
  1703. X    case '9':
  1704. X#ifdef PARANOID
  1705. X        printf("The RPL bit cannot be changed in this version.\n");
  1706. X#else
  1707. X        printf("\nChanging the RPL bit is not recommended.\n");
  1708. X        if (get_yn("Proceed? [ny] ") == 'y') {
  1709. X            pp->reg1.rpl = !pp->reg1.rpl;
  1710. X            changed = 1;
  1711. X            printf("Control register 1 - RPL set to %d\n",
  1712. X                pp->reg1.rpl);
  1713. X        }
  1714. X        else
  1715. X            printf("The RPL bit is not changed.\n");
  1716. X#endif
  1717. X        break;
  1718. X    case 'n':
  1719. X        ncreg_config(pp);
  1720. X        changed = 1;
  1721. X        break;
  1722. X    case 's':
  1723. X        printf("Current cache control parameters:\n\n");
  1724. X        show_parms(pp);
  1725. X        break;
  1726. X    case 'd':
  1727. X        if (!do_ioctl(fd, &tmp, CX_GETDFLT))
  1728. X            printf("Cannot get default parameters.\n");
  1729. X        else {
  1730. X            printf("Default cache control parameters:\n\n");
  1731. X            show_parms(&tmp);
  1732. X        }
  1733. X        break;
  1734. X    case 'D':
  1735. X        if (!do_ioctl(fd, pp, CX_GETDFLT))
  1736. X            printf("Cannot set parameters to default values.\n");
  1737. X        else
  1738. X            printf("All parameters set to default values.\n");
  1739. X        break;
  1740. X    case 'e':
  1741. X        if (!do_ioctl(fd, pp, CX_SETPARM))
  1742. X            printf("Unable to set hardware.\n");
  1743. X        else {
  1744. X            printf("Hardware set to specified parameters.\n");
  1745. X            changed = 0;
  1746. X        }
  1747. X        break;
  1748. X    case '\n':
  1749. X    case '\0':
  1750. X        break;
  1751. X    case 'q':
  1752. X        return(0);
  1753. X    case '?':
  1754. X        show_help();
  1755. X        break;
  1756. X    default:
  1757. X        printf("Invalid command.\n");
  1758. X        show_help();
  1759. X        break;
  1760. X    }
  1761. X
  1762. X    return(1);
  1763. X}
  1764. X
  1765. X
  1766. Xvoid
  1767. Xusage(char *progname)
  1768. X{
  1769. X    fprintf(stderr, "Usage: %s [-d]\n", progname);
  1770. X}
  1771. X
  1772. X
  1773. Xint
  1774. Xdone(int fd, int exit_status)
  1775. X{
  1776. X    if (fd >= 0)
  1777. X        close(fd);
  1778. X    exit(exit_status);
  1779. X}
  1780. X
  1781. X
  1782. Xint
  1783. Xmain(int argc, char **argv)
  1784. X{
  1785. X    char        c,
  1786. X            cmd;
  1787. X    int        fd = -1,
  1788. X            displayonly = 0,
  1789. X            quit = 0;
  1790. X    cxparms_t    cxparms;
  1791. X    
  1792. X    /* Parse command line arguments */
  1793. X    opterr = 0;
  1794. X    while ((c = getopt(argc, argv, "d")) != EOF) {
  1795. X        switch (c) {
  1796. X        case 'd':
  1797. X            displayonly = 1;
  1798. X            break;
  1799. X        default:
  1800. X            usage(argv[0]);
  1801. X            done(fd, 1);
  1802. X        }
  1803. X    }
  1804. X
  1805. X#ifdef DEBUG
  1806. X    setbuf(stdout, NULL);
  1807. X#endif
  1808. X
  1809. X    printf("%s v%s\n%s\n%s\n",
  1810. X        "Cx486DLC/SLC Internal Cache Configuration Utility",
  1811. X        VERS,
  1812. X        "Copyright (c) Ti Kan 1993",
  1813. X        "------------------------------------------------------------");
  1814. X
  1815. X    /* Open device node for ioctls */
  1816. X    if ((fd = open("/dev/cx", O_RDWR)) < 0) {
  1817. X        perror("Cannot open /dev/cx");
  1818. X        done(fd, 2);
  1819. X    }
  1820. X
  1821. X    /* Get current cache configuration */
  1822. X    if (!do_ioctl(fd, &cxparms, CX_GETPARM))
  1823. X        done(fd, 3);
  1824. X
  1825. X    if (!displayonly)
  1826. X        printf("Type '?' for a list of valid commands.\n\n");
  1827. X
  1828. X    /* Show current cache configuration */
  1829. X    show_parms(&cxparms);
  1830. X
  1831. X    if (displayonly)
  1832. X        done(fd, 0);
  1833. X
  1834. X    /* Enter configuration editor */
  1835. X    do {
  1836. X        if (!process_cmd(fd, get_cmd(), &cxparms))
  1837. X            quit = 1;
  1838. X
  1839. X        if (quit && changed &&
  1840. X            get_yn("\nQuit without setting hardware? [ny] ") != 'y')
  1841. X            quit = 0;
  1842. X    } while (!quit);
  1843. X
  1844. X    done(fd, 0);
  1845. X}
  1846. X
  1847. X
  1848. END_OF_FILE
  1849. if test 11523 -ne `wc -c <'cxctl.c'`; then
  1850.     echo shar: \"'cxctl.c'\" unpacked with wrong size!
  1851. fi
  1852. # end of 'cxctl.c'
  1853. fi
  1854. if test -f 'cxinstall.sh' -a "${1}" != "-c" ; then 
  1855.   echo shar: Will not clobber existing file \"'cxinstall.sh'\"
  1856. else
  1857. echo shar: Extracting \"'cxinstall.sh'\" \(3806 characters\)
  1858. sed "s/^X//" >'cxinstall.sh' <<'END_OF_FILE'
  1859. X#!/bin/sh
  1860. X
  1861. X#
  1862. X#    cxinstall    UNIX(tm) System V/386 driver to control the Cyrix(tm)
  1863. X#            Cx486DLC/SLC CPU internal cache.
  1864. X#
  1865. X#    by Ti Kan
  1866. X#    E-mail:        Internet: ti@amb.org
  1867. X#            UUCP: ...!decwrl!sgiblab!bazooka!ti
  1868. X#                  ...!uunet!bazooka!ti
  1869. X#
  1870. X#    Copyright (c) Ti Kan 1993, All rights reserved.
  1871. X#
  1872. X#    This software can be distributed freely.  This software,
  1873. X#    and software based on or that uses code from it cannot
  1874. X#    be used for commercial purposes without consent of the
  1875. X#    copyright holder.  This copyright notice must appear in
  1876. X#    all products that is based on or uses code from this
  1877. X#    software.
  1878. X#
  1879. X#ident "@(#)cxinstall.sh    1.4 93/03/15"
  1880. X
  1881. XOK=0
  1882. XFAIL=1
  1883. XPATH=/bin:/usr/bin:/etc; export PATH
  1884. X
  1885. X
  1886. Xgetyn() {
  1887. X    echo "$* [yn] \c"
  1888. X    while :
  1889. X    do
  1890. X        read ANS
  1891. X        case "$ANS" in
  1892. X        y|Y)
  1893. X            return $OK
  1894. X            ;;
  1895. X        n|N)
  1896. X            return $FAIL
  1897. X            ;;
  1898. X        *)
  1899. X            echo "Please type y or n."
  1900. X            ;;
  1901. X        esac
  1902. X    done
  1903. X}
  1904. X
  1905. X
  1906. Xsys_type() {
  1907. X    if [ ! -d $ROOT/etc/conf ]
  1908. X    then
  1909. X        echo "Kernel configuration directory /etc/conf not present."
  1910. X        echo "Aborting..."
  1911. X        return $FAIL
  1912. X    fi
  1913. X
  1914. X    # The following is a pretty crude way to figure out the UNIX flavor,
  1915. X    # for for our purposes it should suffice...
  1916. X
  1917. X    KERNFILE=
  1918. X    if [ -r /stand/unix ]
  1919. X    then
  1920. X        KERNFILE=/stand/unix
  1921. X    elif [ -r /unix ]
  1922. X    then
  1923. X        KERNFILE=/unix
  1924. X    fi
  1925. X
  1926. X    if [ -n "$KERNFILE" ]
  1927. X    then
  1928. X        if (file $KERNFILE | fgrep ELF) >/dev/null 2>&1 
  1929. X        then
  1930. X            if [ -d $ROOT/etc/conf/mdevice.d ] && \
  1931. X                (fgrep "version 1" $ROOT/etc/conf/mdevice.d/*) \
  1932. X                >/dev/null 2>&1
  1933. X            then
  1934. X                echo SVR42
  1935. X            else
  1936. X                echo SVR4
  1937. X            fi
  1938. X        else
  1939. X            echo SVR3
  1940. X        fi
  1941. X
  1942. X        return $OK
  1943. X    fi
  1944. X
  1945. X    echo "Unknown system type.  Aborting..."
  1946. X    return $FAIL
  1947. X}
  1948. X
  1949. X
  1950. X
  1951. X# Main starts here
  1952. X
  1953. XRELDIR=`pwd`
  1954. X
  1955. Xif (id | fgrep uid=0) >/dev/null 2>&1
  1956. Xthen
  1957. X    if [ -z "$ROOT" ]
  1958. X    then
  1959. X        root=/
  1960. X    else
  1961. X        if [ -n "$ROOT" ]
  1962. X        then
  1963. X            echo "The ROOT environment variable is currently set"
  1964. X            echo "to $ROOT.  Installation of the driver will use"
  1965. X            echo "$ROOT/etc/conf."
  1966. X            if getyn "Proceed?"
  1967. X            then
  1968. X                break
  1969. X            else
  1970. X                echo "Installation aborted."
  1971. X                exit $FAIL
  1972. X            fi
  1973. X        fi
  1974. X        root=$ROOT
  1975. X    fi
  1976. X    echo "CX driver installation: ROOT is $root"
  1977. Xelse
  1978. X    echo "You must be the super-user ro install the CX driver."
  1979. X    exit $FAIL
  1980. Xfi
  1981. Xecho ""
  1982. X
  1983. XSYSTYPE=`sys_type`
  1984. Xif [ $? -ne 0 ]
  1985. Xthen
  1986. X    exit 1
  1987. Xfi
  1988. X
  1989. Xif [ ! -d cx ]
  1990. Xthen
  1991. X    echo "Cannot find the cx directory."
  1992. X    echo "You must run this install script from the directory where"
  1993. X    echo "the binary distribution is unpacked.  Aborting..."
  1994. X    exit $FAIL
  1995. Xfi
  1996. X
  1997. Xcd cx
  1998. Xcase "$SYSTYPE" in
  1999. XSVR3)
  2000. X    cp Master.ver0 Master
  2001. X    cp System.ver0 System
  2002. X    ;;
  2003. XSVR4)
  2004. X    cp Master.ver0 Master
  2005. X    cp System.ver0 System
  2006. X    ;;
  2007. XSVR42)
  2008. X    cp Master.ver1 Master
  2009. X    cp System.ver1 System
  2010. X    ;;
  2011. X*)
  2012. X    echo "Unknown system type.  Aborting..."
  2013. X    exit $FAIL
  2014. X    ;;
  2015. Xesac
  2016. X
  2017. Xif [ -f $ROOT/etc/conf/sdevice.d/cx ]
  2018. Xthen
  2019. X    $ROOT/etc/conf/bin/idinstall -d cx >/dev/null 2>&1
  2020. Xfi
  2021. X
  2022. X$ROOT/etc/conf/bin/idinstall -a cx
  2023. Xif [ $? -eq 0 ]
  2024. Xthen
  2025. X    echo "The CX driver has been installed."
  2026. Xelse
  2027. X    echo "idinstall failed."
  2028. X    exit $FAIL
  2029. Xfi
  2030. X
  2031. Xcd $RELDIR
  2032. X
  2033. Xcp cx.h /usr/include/sys/cx.h
  2034. Xchown bin /usr/include/sys/cx.h
  2035. Xchgrp bin /usr/include/sys/cx.h
  2036. Xchmod 444 /usr/include/sys/cx.h
  2037. Xecho "The header file has been installed as /usr/include/sys/cx.h."
  2038. X
  2039. Xcp cxctl /etc/cxctl
  2040. Xchown root /etc/cxctl
  2041. Xchgrp root /etc/cxctl
  2042. Xchmod 700 /etc/cxctl
  2043. Xecho "The cache control utility has been installed as /etc/cxctl."
  2044. Xecho ""
  2045. X
  2046. Xcase "$SYSTYPE" in
  2047. XSVR3|SVR4)
  2048. X    echo "The kernel must be rebuilt to enable the CX driver."
  2049. X    if getyn "Do you want to rebuild the kernel now?"
  2050. X    then
  2051. X        $ROOT/etc/conf/bin/idbuild
  2052. X        echo "\nYou must now reboot the system to enable the CX driver."
  2053. X    else
  2054. X        echo ""
  2055. X        echo "The kernel will not be rebuilt now."
  2056. X        echo "To rebuild the kernel, you must invoke the command"
  2057. X        echo "$ROOT/etc/conf/bin/idbuild"
  2058. X        exit $OK
  2059. X    fi
  2060. X    ;;
  2061. XSVR42)
  2062. X    $ROOT/etc/conf/bin/idbuild
  2063. X    echo "\nYou must now reboot the system to enable the CX driver."
  2064. X    ;;
  2065. Xesac
  2066. X
  2067. Xexit $OK
  2068. X
  2069. END_OF_FILE
  2070. if test 3806 -ne `wc -c <'cxinstall.sh'`; then
  2071.     echo shar: \"'cxinstall.sh'\" unpacked with wrong size!
  2072. fi
  2073. # end of 'cxinstall.sh'
  2074. fi
  2075. echo shar: End of shell archive.
  2076. exit 0
  2077.  
  2078. -- 
  2079.     ///  Ti Kan                vorsprung durch technik
  2080.    ///   AMB Research Laboratories, Sunnyvale, CA. USA
  2081.   ///    ti@amb.org
  2082.  //////  ...!{decwrl,synopsys,tandem,tsoft,ultra}!sgiblab!bazooka!ti
  2083. ///      ...!{uunet,sun,apple,sco}!altos!bazooka!ti
  2084.