home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / armlinux / kernel_src / LINUX-1_000 / linux-1.3.35pl3.diff
Encoding:
Text File  |  1996-03-28  |  196.3 KB  |  7,345 lines

  1. diff -urN linux.store/linux/Makefile linux/Makefile
  2. --- linux.store/linux/Makefile    Wed Mar 13 23:54:56 1996
  3. +++ linux/Makefile    Wed Mar 27 10:22:38 1996
  4. @@ -251,7 +251,7 @@
  5.      rm -f .tmp* drivers/sound/configure
  6.      rm -fr modules/*
  7.  
  8. -mrproper: clean
  9. +mrproper:: clean
  10.      rm -f include/linux/autoconf.h include/linux/version.h
  11.      rm -f drivers/sound/local.h
  12.      rm -f drivers/scsi/aic7xxx_asm drivers/scsi/aic7xxx_seq.h
  13. diff -urN linux.store/linux/README.arm linux/README.arm
  14. --- linux.store/linux/README.arm    Wed Mar 13 23:54:56 1996
  15. +++ linux/README.arm    Thu Mar 28 14:12:36 1996
  16. @@ -33,3 +33,26 @@
  17.  Name: Ian Jeffray
  18.  Mail: ian_jeffray@MENTORG.COM
  19.  Desc: A3/4/5xx serial and parrallel port code maintainer.
  20. +
  21. +
  22. +Notes
  23. +-----
  24. +ST506 hard drives
  25. +-----------------
  26. +The ST506 hard drive controllers seem to be working fine (if
  27. +a bit slowly).  At the moment they will only work off the
  28. +controllers on an A4x0's motherboard, but for it to work
  29. +off a Podule just requires someone with a podule to add the
  30. +addresses for the IRQ mask and the HDC base to the source.
  31. +
  32. +Oh yes - the drive busy light seems to stay on all the time;
  33. +suggestions welcome!
  34. +
  35. +1772 Floppy
  36. +-----------
  37. +This also seems to work OK, but hasn't been stressed much lately.
  38. +It hasn't got any code for disc change detection in there at the
  39. +moment which could be a bit of a problem!  Suggestions on the
  40. +correct way to do this are welcome.
  41. +
  42. +
  43. diff -urN linux.store/linux/arch/arm/Makefile linux/arch/arm/Makefile
  44. --- linux.store/linux/arch/arm/Makefile    Wed Mar 13 23:54:57 1996
  45. +++ linux/arch/arm/Makefile    Thu Mar 28 11:58:22 1996
  46. @@ -14,7 +14,7 @@
  47.  #
  48.  # Since we are going multi-computer, I think that this ought to reflect it...
  49.  #
  50. -# THIS IS MY PATCHLEVEL:  PATCHLEVEL2
  51. +# THIS IS MY PATCHLEVEL:  PATCHLEVEL3
  52.  
  53.  # MACHINE can be: arc a5k rpc
  54.  # PROCESSOR can be: arm2 arm3 arm6
  55. @@ -84,6 +84,10 @@
  56.      rm -f include/asm-arm/arch include/asm-arm/proc
  57.      (cd include/asm-arm; ln -sf arch-$(MACHINE) arch; ln -sf proc-$(PROCESSOR) proc)
  58.  
  59. +mrproper::
  60. +    rm -f include/asm-arm/arch include/asm-arm/proc
  61. +    @$(MAKE) -C arch/$(ARCH)/drivers mrproper
  62. +
  63.  install:
  64.      @$(MAKEBOOT) install
  65.  
  66. @@ -95,11 +99,6 @@
  67.  
  68.  archclean:
  69.      @$(MAKEBOOT) clean
  70. -    @$(MAKE) -C arch/$(ARCH)/drivers/block LINKCLEAN
  71. -    @$(MAKE) -C arch/$(ARCH)/drivers/char LINKCLEAN
  72. -    @$(MAKE) -C arch/$(ARCH)/drivers/net LINKCLEAN
  73. -    @$(MAKE) -C arch/$(ARCH)/drivers/scsi LINKCLEAN
  74. -    rm -f include/asm-arm/arch include/asm-arm/proc
  75.  
  76.  archdep:
  77.      @$(MAKEBOOT) dep
  78. diff -urN linux.store/linux/arch/arm/drivers/Makefile linux/arch/arm/drivers/Makefile
  79. --- linux.store/linux/arch/arm/drivers/Makefile    Sun Feb 11 09:32:13 1996
  80. +++ linux/arch/arm/drivers/Makefile    Thu Mar 28 11:51:08 1996
  81. @@ -31,3 +31,7 @@
  82.  endif
  83.  
  84.  include $(TOPDIR)/Rules.make
  85. +
  86. +mrproper:
  87. +    set -e; for i in $(ALL_SUB_DIRS); do $(MAKE) -C $$i mrproper; done
  88. +
  89. diff -urN linux.store/linux/arch/arm/drivers/block/Makefile linux/arch/arm/drivers/block/Makefile
  90. --- linux.store/linux/arch/arm/drivers/block/Makefile    Wed Mar 13 23:54:58 1996
  91. +++ linux/arch/arm/drivers/block/Makefile    Thu Mar 28 11:52:14 1996
  92. @@ -65,9 +65,12 @@
  93.      done
  94.      touch links
  95.  
  96. -LINKCLEAN:
  97. +mrproper:
  98.      -@for f in $(LK); do \
  99. -        if [ -L $$f ]; then rm -f $$f; fi; \
  100. +        if [ -L $$f ]; then \
  101. +            echo $(RM) $$f; \
  102. +            $(RM) $$f; \
  103. +        fi; \
  104.      done
  105. -    rm -f links
  106. +    $(RM) links
  107.  
  108. diff -urN linux.store/linux/arch/arm/drivers/block/blk.h linux/arch/arm/drivers/block/blk.h
  109. --- linux.store/linux/arch/arm/drivers/block/blk.h    Thu Jan  1 01:00:00 1970
  110. +++ linux/arch/arm/drivers/block/blk.h    Thu Mar 28 15:06:37 1996
  111. @@ -0,0 +1,402 @@
  112. +#ifndef _BLK_H
  113. +#define _BLK_H
  114. +
  115. +#include <linux/blkdev.h>
  116. +#include <linux/locks.h>
  117. +#include <linux/config.h>
  118. +
  119. +/*
  120. + * NR_REQUEST is the number of entries in the request-queue.
  121. + * NOTE that writes may use only the low 2/3 of these: reads
  122. + * take precedence.
  123. + */
  124. +#define NR_REQUEST    64
  125. +
  126. +/*
  127. + * This is used in the elevator algorithm: Note that
  128. + * reads always go before writes. This is natural: reads
  129. + * are much more time-critical than writes.
  130. + */
  131. +#define IN_ORDER(s1,s2) \
  132. +((s1)->cmd < (s2)->cmd || ((s1)->cmd == (s2)->cmd && \
  133. +((s1)->rq_dev < (s2)->rq_dev || (((s1)->rq_dev == (s2)->rq_dev && \
  134. +(s1)->sector < (s2)->sector)))))
  135. +
  136. +/*
  137. + * These will have to be changed to be aware of different buffer
  138. + * sizes etc.. It actually needs a major cleanup.
  139. + */
  140. +#ifdef IDE_DRIVER
  141. +#define SECTOR_MASK ((BLOCK_SIZE >> 9) - 1)
  142. +#else
  143. +#define SECTOR_MASK (blksize_size[MAJOR_NR] &&     \
  144. +    blksize_size[MAJOR_NR][MINOR(CURRENT->rq_dev)] ? \
  145. +    ((blksize_size[MAJOR_NR][MINOR(CURRENT->rq_dev)] >> 9) - 1) :  \
  146. +    ((BLOCK_SIZE >> 9)  -  1))
  147. +#endif /* IDE_DRIVER */
  148. +
  149. +#define SUBSECTOR(block) (CURRENT->current_nr_sectors > 0)
  150. +
  151. +#ifdef CONFIG_CDU31A
  152. +extern int cdu31a_init(void);
  153. +#endif CONFIG_CDU31A
  154. +#ifdef CONFIG_MCD
  155. +extern int mcd_init(void);
  156. +#endif CONFIG_MCD
  157. +#ifdef CONFIG_MCDX
  158. +extern int mcdx_init(void);
  159. +#endif CONFIG_MCDX
  160. +#ifdef CONFIG_SBPCD
  161. +extern int sbpcd_init(void);
  162. +#endif CONFIG_SBPCD
  163. +#ifdef CONFIG_AZTCD
  164. +extern int aztcd_init(void);
  165. +#endif CONFIG_AZTCD
  166. +#ifdef CONFIG_CDU535
  167. +extern int sony535_init(void);
  168. +#endif CONFIG_CDU535
  169. +#ifdef CONFIG_GSCD
  170. +extern int gscd_init(void);
  171. +#endif CONFIG_GSCD
  172. +#ifdef CONFIG_CM206
  173. +extern int cm206_init(void);
  174. +#endif CONFIG_CM206
  175. +#ifdef CONFIG_OPTCD
  176. +extern int optcd_init(void);
  177. +#endif CONFIG_OPTCD
  178. +#ifdef CONFIG_SJCD
  179. +extern int sjcd_init(void);
  180. +#endif CONFIG_SJCD
  181. +#ifdef CONFIG_BLK_DEV_HD
  182. +extern int hd_init(void);
  183. +#endif
  184. +#ifdef CONFIG_BLK_DEV_IDE
  185. +extern int ide_init(void);
  186. +#endif
  187. +#ifdef CONFIG_BLK_DEV_XD
  188. +extern int xd_init(void);
  189. +#endif
  190. +
  191. +extern void set_device_ro(kdev_t dev,int flag);
  192. +
  193. +extern int floppy_init(void);
  194. +extern void rd_load(void);
  195. +extern long rd_init(long mem_start, int length);
  196. +extern int ramdisk_size;
  197. +
  198. +#define RO_IOCTLS(dev,where) \
  199. +  case BLKROSET: if (!suser()) return -EACCES; \
  200. +         set_device_ro((dev),get_fs_long((long *) (where))); return 0; \
  201. +  case BLKROGET: { int __err = verify_area(VERIFY_WRITE, (void *) (where), sizeof(long)); \
  202. +           if (!__err) put_fs_long(0!=is_read_only(dev),(long *) (where)); return __err; }
  203. +         
  204. +#if defined(MAJOR_NR) || defined(IDE_DRIVER)
  205. +
  206. +/*
  207. + * Add entries as needed.
  208. + */
  209. +
  210. +#ifdef IDE_DRIVER
  211. +
  212. +#define DEVICE_NR(device)    (MINOR(device) >> PARTN_BITS)
  213. +#define DEVICE_ON(device)    /* nothing */
  214. +#define DEVICE_OFF(device)    /* nothing */
  215. +
  216. +#elif (MAJOR_NR == MEM_MAJOR)
  217. +
  218. +/* ram disk */
  219. +#define DEVICE_NAME "ramdisk"
  220. +#define DEVICE_REQUEST do_rd_request
  221. +#define DEVICE_NR(device) (MINOR(device) & 7)
  222. +#define DEVICE_ON(device) 
  223. +#define DEVICE_OFF(device)
  224. +
  225. +#elif (MAJOR_NR == FLOPPY_MAJOR)
  226. +
  227. +static void floppy_off(unsigned int nr);
  228. +
  229. +#define DEVICE_NAME "floppy"
  230. +#define DEVICE_INTR do_floppy
  231. +#define DEVICE_REQUEST do_fd_request
  232. +#define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 ))
  233. +#define DEVICE_ON(device)
  234. +#define DEVICE_OFF(device) floppy_off(DEVICE_NR(device))
  235. +
  236. +#elif (MAJOR_NR == HD_MAJOR)
  237. +
  238. +/* harddisk: timeout is 6 seconds.. */
  239. +#define DEVICE_NAME "harddisk"
  240. +#define DEVICE_INTR do_hd
  241. +#define DEVICE_TIMEOUT HD_TIMER
  242. +#define TIMEOUT_VALUE (6*HZ)
  243. +#define DEVICE_REQUEST do_hd_request
  244. +#define DEVICE_NR(device) (MINOR(device)>>6)
  245. +#define DEVICE_ON(device)
  246. +#define DEVICE_OFF(device)
  247. +
  248. +#elif (MAJOR_NR == SCSI_DISK_MAJOR)
  249. +
  250. +#define DEVICE_NAME "scsidisk"
  251. +#define DEVICE_INTR do_sd  
  252. +#define TIMEOUT_VALUE (2*HZ)
  253. +#define DEVICE_REQUEST do_sd_request
  254. +#define DEVICE_NR(device) (MINOR(device) >> 4)
  255. +#define DEVICE_ON(device)
  256. +#define DEVICE_OFF(device)
  257. +
  258. +#elif (MAJOR_NR == SCSI_TAPE_MAJOR)
  259. +
  260. +#define DEVICE_NAME "scsitape"
  261. +#define DEVICE_INTR do_st  
  262. +#define DEVICE_NR(device) (MINOR(device) & 0x7f)
  263. +#define DEVICE_ON(device)
  264. +#define DEVICE_OFF(device)
  265. +
  266. +#elif (MAJOR_NR == SCSI_CDROM_MAJOR)
  267. +
  268. +#define DEVICE_NAME "CD-ROM"
  269. +#define DEVICE_INTR do_sr
  270. +#define DEVICE_REQUEST do_sr_request
  271. +#define DEVICE_NR(device) (MINOR(device))
  272. +#define DEVICE_ON(device)
  273. +#define DEVICE_OFF(device)
  274. +
  275. +#elif (MAJOR_NR == XT_DISK_MAJOR)
  276. +
  277. +#define DEVICE_NAME "xt disk"
  278. +#define DEVICE_REQUEST do_xd_request
  279. +#define DEVICE_NR(device) (MINOR(device) >> 6)
  280. +#define DEVICE_ON(device)
  281. +#define DEVICE_OFF(device)
  282. +
  283. +#elif defined(MFM_DISK_MAJOR) && (MAJOR_NR == MFM_DISK_MAJOR)
  284. +
  285. +#define DEVICE_NAME "mfm disk"
  286. +#define DEVICE_INTR do_mfm
  287. +#define DEVICE_REQUEST do_mfm_request
  288. +#define DEVICE_NR(device) (MINOR(device) >> 6)
  289. +#define DEVICE_ON(device)
  290. +#define DEVICE_OFF(device)
  291. +
  292. +#elif (MAJOR_NR == CDU31A_CDROM_MAJOR)
  293. +
  294. +#define DEVICE_NAME "CDU31A"
  295. +#define DEVICE_REQUEST do_cdu31a_request
  296. +#define DEVICE_NR(device) (MINOR(device))
  297. +#define DEVICE_ON(device)
  298. +#define DEVICE_OFF(device)
  299. +
  300. +#elif (MAJOR_NR == MITSUMI_CDROM_MAJOR)
  301. +
  302. +#define DEVICE_NAME "Mitsumi CD-ROM"
  303. +/* #define DEVICE_INTR do_mcd */
  304. +#define DEVICE_REQUEST do_mcd_request
  305. +#define DEVICE_NR(device) (MINOR(device))
  306. +#define DEVICE_ON(device)
  307. +#define DEVICE_OFF(device)
  308. +
  309. +#elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR)
  310. +
  311. +#define DEVICE_NAME "Mitsumi CD-ROM"
  312. +/* #define DEVICE_INTR do_mcdx */
  313. +#define DEVICE_REQUEST do_mcdx_request
  314. +#define DEVICE_NR(device) (MINOR(device))
  315. +#define DEVICE_ON(device)
  316. +#define DEVICE_OFF(device)
  317. +
  318. +#elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR)
  319. +
  320. +#define DEVICE_NAME "Matsushita CD-ROM controller #1"
  321. +#define DEVICE_REQUEST do_sbpcd_request
  322. +#define DEVICE_NR(device) (MINOR(device))
  323. +#define DEVICE_ON(device)
  324. +#define DEVICE_OFF(device)
  325. +
  326. +#elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR)
  327. +
  328. +#define DEVICE_NAME "Matsushita CD-ROM controller #2"
  329. +#define DEVICE_REQUEST do_sbpcd2_request
  330. +#define DEVICE_NR(device) (MINOR(device))
  331. +#define DEVICE_ON(device)
  332. +#define DEVICE_OFF(device)
  333. +
  334. +#elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR)
  335. +
  336. +#define DEVICE_NAME "Matsushita CD-ROM controller #3"
  337. +#define DEVICE_REQUEST do_sbpcd3_request
  338. +#define DEVICE_NR(device) (MINOR(device))
  339. +#define DEVICE_ON(device)
  340. +#define DEVICE_OFF(device)
  341. +
  342. +#elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR)
  343. +
  344. +#define DEVICE_NAME "Matsushita CD-ROM controller #4"
  345. +#define DEVICE_REQUEST do_sbpcd4_request
  346. +#define DEVICE_NR(device) (MINOR(device))
  347. +#define DEVICE_ON(device)
  348. +#define DEVICE_OFF(device)
  349. +
  350. +#elif (MAJOR_NR == AZTECH_CDROM_MAJOR)
  351. +
  352. +#define DEVICE_NAME "Aztech CD-ROM"
  353. +#define DEVICE_REQUEST do_aztcd_request
  354. +#define DEVICE_NR(device) (MINOR(device))
  355. +#define DEVICE_ON(device)
  356. +#define DEVICE_OFF(device)
  357. +
  358. +#elif (MAJOR_NR == CDU535_CDROM_MAJOR)
  359. +
  360. +#define DEVICE_NAME "SONY-CDU535"
  361. +#define DEVICE_INTR do_cdu535
  362. +#define DEVICE_REQUEST do_cdu535_request
  363. +#define DEVICE_NR(device) (MINOR(device))
  364. +#define DEVICE_ON(device)
  365. +#define DEVICE_OFF(device)
  366. +
  367. +#elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR)
  368. +
  369. +#define DEVICE_NAME "Goldstar R420"
  370. +#define DEVICE_REQUEST do_gscd_request
  371. +#define DEVICE_NR(device) (MINOR(device))
  372. +#define DEVICE_ON(device)
  373. +#define DEVICE_OFF(device)
  374. +
  375. +#elif (MAJOR_NR == CM206_CDROM_MAJOR)
  376. +#define DEVICE_NAME "Philips/LMS cd-rom cm206"
  377. +#define DEVICE_REQUEST do_cm206_request
  378. +#define DEVICE_NR(device) (MINOR(device))
  379. +#define DEVICE_ON(device)
  380. +#define DEVICE_OFF(device)
  381. +
  382. +#elif (MAJOR_NR == OPTICS_CDROM_MAJOR)
  383. +
  384. +#define DEVICE_NAME "DOLPHIN 8000AT CD-ROM"
  385. +#define DEVICE_REQUEST do_optcd_request
  386. +#define DEVICE_NR(device) (MINOR(device))
  387. +#define DEVICE_ON(device)
  388. +#define DEVICE_OFF(device)
  389. +
  390. +#elif (MAJOR_NR == SANYO_CDROM_MAJOR)
  391. +
  392. +#define DEVICE_NAME "Sanyo H94A CD-ROM"
  393. +#define DEVICE_REQUEST do_sjcd_request
  394. +#define DEVICE_NR(device) (MINOR(device))
  395. +#define DEVICE_ON(device)
  396. +#define DEVICE_OFF(device)
  397. +
  398. +#endif /* MAJOR_NR == whatever */
  399. +
  400. +#if (MAJOR_NR != SCSI_TAPE_MAJOR) && !defined(IDE_DRIVER)
  401. +
  402. +#ifndef CURRENT
  403. +#define CURRENT (blk_dev[MAJOR_NR].current_request)
  404. +#endif
  405. +
  406. +#define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev)
  407. +
  408. +#ifdef DEVICE_INTR
  409. +void (*DEVICE_INTR)(void) = NULL;
  410. +#endif
  411. +#ifdef DEVICE_TIMEOUT
  412. +
  413. +#define SET_TIMER \
  414. +((timer_table[DEVICE_TIMEOUT].expires = jiffies + TIMEOUT_VALUE), \
  415. +(timer_active |= 1<<DEVICE_TIMEOUT))
  416. +
  417. +#define CLEAR_TIMER \
  418. +timer_active &= ~(1<<DEVICE_TIMEOUT)
  419. +
  420. +#define SET_INTR(x) \
  421. +if ((DEVICE_INTR = (x)) != NULL) \
  422. +    SET_TIMER; \
  423. +else \
  424. +    CLEAR_TIMER;
  425. +
  426. +#else
  427. +
  428. +#define SET_INTR(x) (DEVICE_INTR = (x))
  429. +
  430. +#endif /* DEVICE_TIMEOUT */
  431. +
  432. +static void (DEVICE_REQUEST)(void);
  433. +
  434. +#ifdef DEVICE_INTR
  435. +#define CLEAR_INTR SET_INTR(NULL)
  436. +#else
  437. +#define CLEAR_INTR
  438. +#endif
  439. +
  440. +#define INIT_REQUEST \
  441. +    if (!CURRENT) {\
  442. +        CLEAR_INTR; \
  443. +        return; \
  444. +    } \
  445. +    if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \
  446. +        panic(DEVICE_NAME ": request list destroyed"); \
  447. +    if (CURRENT->bh) { \
  448. +        if (!CURRENT->bh->b_lock) \
  449. +            panic(DEVICE_NAME ": block not locked"); \
  450. +    }
  451. +
  452. +#endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) && !defined(IDE_DRIVER) */
  453. +
  454. +/* end_request() - SCSI devices have their own version */
  455. +/*               - IDE drivers have their own copy too */
  456. +
  457. +#if ! SCSI_MAJOR(MAJOR_NR)
  458. +
  459. +#if defined(_IDE_CD_C) || defined(_TRITON_C) /* shares copy with ide.c */
  460. +void ide_end_request(byte uptodate, ide_hwgroup_t *hwgroup);
  461. +#else
  462. +
  463. +#ifdef IDE_DRIVER
  464. +void ide_end_request(byte uptodate, ide_hwgroup_t *hwgroup) {
  465. +    struct request *req = hwgroup->rq;
  466. +#else
  467. +static void end_request(int uptodate) {
  468. +    struct request *req = CURRENT;
  469. +#endif /* IDE_DRIVER */
  470. +    struct buffer_head * bh;
  471. +
  472. +    req->errors = 0;
  473. +    if (!uptodate) {
  474. +        printk("end_request: I/O error, dev %s, sector %lu\n",
  475. +            kdevname(req->rq_dev), req->sector);
  476. +        req->nr_sectors--;
  477. +        req->nr_sectors &= ~SECTOR_MASK;
  478. +        req->sector += (BLOCK_SIZE / 512);
  479. +        req->sector &= ~SECTOR_MASK;        
  480. +    }
  481. +
  482. +    if ((bh = req->bh) != NULL) {
  483. +        req->bh = bh->b_reqnext;
  484. +        bh->b_reqnext = NULL;
  485. +        bh->b_uptodate = uptodate;        
  486. +        unlock_buffer(bh);
  487. +        if ((bh = req->bh) != NULL) {
  488. +            req->current_nr_sectors = bh->b_size >> 9;
  489. +            if (req->nr_sectors < req->current_nr_sectors) {
  490. +                req->nr_sectors = req->current_nr_sectors;
  491. +                printk("end_request: buffer-list destroyed\n");
  492. +            }
  493. +            req->buffer = bh->b_data;
  494. +            return;
  495. +        }
  496. +    }
  497. +#ifdef IDE_DRIVER
  498. +    hwgroup->rq = NULL;
  499. +#else
  500. +    DEVICE_OFF(req->rq_dev);
  501. +    CURRENT = req->next;
  502. +#endif /* IDE_DRIVER */
  503. +    if (req->sem != NULL)
  504. +        up(req->sem);
  505. +    req->rq_status = RQ_INACTIVE;
  506. +    wake_up(&wait_for_request);
  507. +}
  508. +#endif /* ndef _IDE_CD_C */
  509. +#endif /* ! SCSI_MAJOR(MAJOR_NR) */
  510. +
  511. +#endif /* defined(MAJOR_NR) || defined(IDE_DRIVER) */
  512. +
  513. +#endif /* _BLK_H */
  514. diff -urN linux.store/linux/arch/arm/drivers/block/fd1772.c linux/arch/arm/drivers/block/fd1772.c
  515. --- linux.store/linux/arch/arm/drivers/block/fd1772.c    Wed Mar 13 23:54:58 1996
  516. +++ linux/arch/arm/drivers/block/fd1772.c    Thu Mar 28 14:12:36 1996
  517. @@ -95,7 +95,7 @@
  518.  #include <linux/delay.h>
  519.  #include <linux/mm.h>
  520.  
  521. -#include <asm/machdeps.h>
  522. +#include <asm/arch/oldlatches.h>
  523.  #include <asm/system.h>
  524.  #include <asm/bitops.h>
  525.  #include <asm/dma.h>
  526. @@ -1387,8 +1387,8 @@
  527.  };
  528.  
  529.  
  530. -void
  531. -fd1772_init (void)
  532. +int
  533. +floppy_init (void)
  534.  
  535.  {    int i;
  536.  
  537. @@ -1444,5 +1444,10 @@
  538.  
  539.      config_types();
  540.  
  541. -    return ;
  542. +    return 0;
  543. +}
  544. +
  545. +/* Just a dummy at the moment */
  546. +void floppy_setup(char *str, int *ints)
  547. +{
  548.  }
  549. diff -urN linux.store/linux/arch/arm/drivers/block/genhd.c linux/arch/arm/drivers/block/genhd.c
  550. --- linux.store/linux/arch/arm/drivers/block/genhd.c    Sun Mar  3 12:22:14 1996
  551. +++ linux/arch/arm/drivers/block/genhd.c    Tue Mar 26 23:19:47 1996
  552. @@ -416,6 +416,12 @@
  553.      printk(" ");
  554.      print_minor_name(hd, MINOR(dev));
  555.  
  556. +    /*
  557. +     * Currently there is a problem with ADFS disks having been
  558. +     * formatted as a DOS disk.  This leaves the old DOS partition
  559. +     * behind.
  560. +     */
  561. +
  562.  #ifdef CONFIG_MSDOS_PARTITION
  563.      if (msdos_partition(hd, dev, first_sector))
  564.          return;
  565. @@ -426,15 +432,18 @@
  566.      printk(" unknown partition table\n");
  567.  }
  568.  
  569. -/* This function is used to re-read partition tables for removable disks.
  570. -   Much of the cleanup from the old partition tables should have already been
  571. -   done */
  572. -
  573. -/* This function will re-read the partition tables for a given device,
  574. -and set things back up again.  There are some important caveats,
  575. -however.  You must ensure that no one is using the device, and no one
  576. -can start using the device while this function is being executed. */
  577. +/*
  578. + * This function is used to re-read partition tables for removable disks.
  579. + * Much of the cleanup from the old partition tables should have already been
  580. + * done
  581. + */
  582.  
  583. +/*
  584. + * This function will re-read the partition tables for a given device,
  585. + * and set things back up again.  There are some important caveats,
  586. + * however.  You must ensure that no one is using the device, and no one
  587. + * can start using the device while this function is being executed.
  588. + */
  589.  void resetup_one_dev(struct gendisk *dev, int drive)
  590.  {
  591.      int i;
  592. diff -urN linux.store/linux/arch/arm/drivers/block/hd.c linux/arch/arm/drivers/block/hd.c
  593. --- linux.store/linux/arch/arm/drivers/block/hd.c    Thu Mar 14 11:45:05 1996
  594. +++ linux/arch/arm/drivers/block/hd.c    Fri Mar 22 23:51:58 1996
  595. @@ -26,7 +26,7 @@
  596.   */
  597.  
  598.  /* This is the maximum number of fragments accessed in one go */
  599. -int no_hds;
  600. +extern int number_ide_drives;
  601.  #define MAX_FRAGS    16
  602.  static unsigned long frag_start[MAX_FRAGS];    /* Start of fragments */
  603.  static unsigned long frag_len[MAX_FRAGS];    /* Fragment length */
  604. @@ -827,7 +827,7 @@
  605.  int issue_request(int dev, unsigned int block, unsigned int nsect, struct request *current_req)
  606.  {
  607.      unsigned int sec, track, head, cyl;
  608. -    int d = dev;
  609. +
  610.      dev >>= 6;
  611.      if (special_op[dev]) {
  612.          if (do_special_op(dev))
  613. @@ -1111,7 +1111,7 @@
  614.       * We only set this to the one that the host OS gave us
  615.       * if the user has not defined any types.
  616.       */
  617. -    NR_HD = no_hds;
  618. +    NR_HD = number_ide_drives;
  619.      }
  620.  
  621.      i = NR_HD;
  622. diff -urN linux.store/linux/arch/arm/drivers/block/hdsrch.c linux/arch/arm/drivers/block/hdsrch.c
  623. --- linux.store/linux/arch/arm/drivers/block/hdsrch.c    Wed Mar 13 23:54:59 1996
  624. +++ linux/arch/arm/drivers/block/hdsrch.c    Thu Mar 28 14:19:13 1996
  625. @@ -17,8 +17,9 @@
  626.  #include <linux/string.h>
  627.  #include <linux/genhd.h>
  628.  
  629. -#define RECSIZE 60
  630. +#define DEBUG_UNINIT
  631.  
  632. +#define RECSIZE 60
  633.  #define MAX_BLK_FRAGS 64
  634.  
  635.  struct boot_block
  636. @@ -89,7 +90,7 @@
  637.  #endif
  638.  
  639.  #ifdef CONFIG_BLK_DEV_XD
  640. -    case XD_MAJOR:
  641. +    case XT_DISK_MAJOR:
  642.      xd_set_geometry (dev, sectspertrack, heads, disksize, sectorsize);
  643.      break;
  644.  #endif
  645. @@ -408,8 +409,17 @@
  646.  #define MAX_HD_IMAGES    8
  647.  #define MAX_HD_BITS    128
  648.  
  649. +#ifdef DEBUG_UNINIT
  650. +static unsigned long __magic_1 = 0xf8149512;
  651. +#endif
  652.  static int initialised[MAX_HD_IMAGES];
  653. +#ifdef DEBUG_UNINIT
  654. +static unsigned long __magic_2 = 0x15f73b2c;
  655. +#endif
  656.  static int maxblock[MAX_HD_IMAGES];
  657. +#ifdef DEBUG_UNINIT
  658. +static unsigned long __magic_3 = 0x9bd4a56e;
  659. +#endif
  660.  static unsigned long startchk[MAX_HD_IMAGES],lengthchk[MAX_HD_IMAGES];
  661.  #ifndef NOT_YET_TESTED
  662.  static unsigned long startaddr[MAX_HD_IMAGES][MAX_HD_BITS],
  663. @@ -418,7 +428,6 @@
  664.  static unsigned long *startaddr[MAX_HD_IMAGES],
  665.                      *lengthaddr[MAX_HD_IMAGES];
  666.  #endif
  667. -
  668.  /* --------------------------------------------------------------------------------- */
  669.  /*  Externally visible functions/variables
  670.   * --------------------------------------------------------------------------------- */
  671. @@ -444,7 +453,7 @@
  672.  #ifdef CONFIG_BLK_DEV_HD
  673.      case HD_MAJOR:    /* IDE drives */
  674.  #elif defined(CONFIG_BLK_DEV_XD)
  675. -    case XD_MAJOR:    /* ST506 drives (map onto IDE at the moment) */
  676. +    case XT_DISK_MAJOR:    /* ST506 drives (map onto IDE at the moment) */
  677.  #endif
  678.      if ((MINOR(dev) & 0x3f) < 1 || (MINOR(dev) & 0x3f) > 0x14) {
  679.          printk ("%s: bad device %s\n", where, kdevname (dev));
  680. @@ -476,7 +485,7 @@
  681.  #ifdef CONFIG_BLK_DEV_HD
  682.      case HD_MAJOR:    /* IDE drives */
  683.  #elif defined(CONFIG_BLK_DEV_XD)
  684. -    case XD_MAJOR:    /* ST506 drives (map onto IDE at the moment) */
  685. +    case XT_DISK_MAJOR:    /* ST506 drives (map onto IDE at the moment) */
  686.  #endif    
  687.      switch (MINOR(dev) & 0xc0) {
  688.      case 0x00:
  689. @@ -521,8 +530,10 @@
  690.      if (maxblock[devno] > MAX_HD_BITS)
  691.      panic ("image_allocate_list: image file is too fragmented\n");
  692.  
  693. -    if (!maxblock[devno])
  694. +    if (!maxblock[devno]) {
  695. +        printk ("image_allocate_list: zero length image file\n");
  696.      return 0;
  697. +    }
  698.  
  699.      for (i = 0; i < maxblock[devno]; i++) {
  700.      /* convert to blocks & calculate checksums */
  701. @@ -583,8 +594,27 @@
  702.      return 0;
  703.  
  704.      if (!initialised[internal_dev]) {
  705. -    printk ("hd%c%d: %s of uninitialised image file.\n",
  706. -        (dev >> 6) + 'a', dev & 0x3f, cmd == WRITE ? "write" : "read");
  707. +    printk ("\n%s: %s of uninitialised image file.\n",
  708. +        kdevname (dev), cmd == WRITE ? "write" : "read");
  709. +#ifdef DEBUG_UNINIT
  710. +    {
  711. +        printk ("(id=%d", internal_dev);
  712. +        for (i = 0; i < 8; i++)
  713. +            printk (" init[%d]=%d", i, initialised[i]);
  714. +        printk (")\n");
  715. +        printk ("__magic_1 = 0x%08lx ", __magic_1);
  716. +        if (__magic_1 != 0xf8149512)
  717. +        printk ("(bad)");
  718. +        printk ("\n__magic_2 = 0x%08lx ", __magic_2);
  719. +        if (__magic_2 != 0x15f73b2c)
  720. +        printk ("(bad)");
  721. +        printk ("\n__magic_3 = 0x%08lx ", __magic_3);
  722. +        if (__magic_3 != 0x9bd4a56e)
  723. +            printk ("(bad)");
  724. +        printk ("\n");
  725. +    }
  726. +    while (1);
  727. +#endif
  728.      return 0;
  729.      }
  730.  
  731. @@ -598,8 +628,8 @@
  732.          chk2 ^= lengthaddr[internal_dev][i];
  733.      }
  734.      if (chk1 != startchk[internal_dev] || chk2 != lengthchk[internal_dev]) {
  735. -        printk ("hda%c%d: mapping tables corrupted on write.",
  736. -            (dev >> 6) + 'a', dev & 0x3f);
  737. +        printk ("%s: mapping tables corrupted on write.",
  738. +            kdevname (dev));
  739.          return 0;
  740.      }
  741.      }
  742. @@ -644,8 +674,8 @@
  743.      num++;
  744.      }
  745.  
  746. -    printk ("hd%c%d: attempted read for sector %ld past end if image file at %ld.\n",
  747. -    (dev >> 6) + 'a', dev & 0x3f, blk, totlen);
  748. +    printk ("%s: attempted read for sector %ld past end if image file at %ld.\n",
  749. +    kdevname (dev), blk, totlen);
  750.      /* Should never happen! */
  751.      return 0;
  752.  }
  753. @@ -655,9 +685,9 @@
  754.  #if 0
  755.  static inline int check_bb(unsigned char *ptr)
  756.  {
  757. -    unsigned int result;
  758. +    unsigned int result;
  759.      
  760. -    __asm__("
  761. +    __asm__("
  762.      adds    %3, %2, %3
  763.      sub    %3, %3, #1
  764.      b    LC02
  765. @@ -667,8 +697,8 @@
  766.      mov    %0, %0, lsr #24
  767.  LC02:    teqs    %2, %3
  768.      bne    LC01
  769. -    " : "=r" (result) : "0" (0), "r" (ptr), "r" (512), "r" (256));
  770. -    return result != ptr[511];
  771. +    " : "=r" (result) : "0" (0), "r" (ptr), "r" (512), "r" (256));
  772. +    return result != ptr[511];
  773.  }
  774.  
  775.  static struct bootblock *bb;
  776. @@ -680,13 +710,15 @@
  777.  
  778.      current_minor = minor;
  779.  
  780. +    /*
  781. +     * read disk address &C00 for ADFS boot sectors
  782. +     */
  783.      if (!(bh = bread (dev, 3, 1024))) {
  784.      printk (" unable to read boot sectors\n");
  785.      return -1;
  786.      }
  787.  
  788. -    if (check_bb (bh->b_data))
  789. -    {
  790. +    if (check_bb (bh->b_data)) {
  791.      brelse (bh);
  792.      return 0;
  793.      }
  794. @@ -700,10 +732,7 @@
  795.      mapaddr    = ((bb->nzones >> 1) * zonesize - ((bb->nzones > 1)? RECSIZE*8 : 0)) << bb->log2bpmb;
  796.      maplen     = bb->nzones << bb->log2secsize;
  797.  
  798. -    
  799. -
  800.      brelse (bh);
  801.      return 1;
  802.  }
  803.  #endif
  804. -
  805. diff -urN linux.store/linux/arch/arm/drivers/block/mfmhd.c linux/arch/arm/drivers/block/mfmhd.c
  806. --- linux.store/linux/arch/arm/drivers/block/mfmhd.c    Wed Mar 13 23:55:00 1996
  807. +++ linux/arch/arm/drivers/block/mfmhd.c    Thu Mar 28 15:05:27 1996
  808. @@ -18,7 +18,7 @@
  809.   *              Took interrupt handlers off task queue lists and called
  810.   *                directly - not sure of implications.
  811.   *
  812. - *  18/2/96:DAG: Well its reading OK I think, well enough for image file code
  813. + * 18/2/96:DAG: Well its reading OK I think, well enough for image file code
  814.   *              to find the image file; but now I've discovered that I actually
  815.   *              have to put some code in for image files.
  816.   *
  817. @@ -36,6 +36,7 @@
  818.  #include <linux/config.h>
  819.  #include <linux/sched.h>
  820.  #include <linux/fs.h>
  821. +#include <linux/interrupt.h>
  822.  #include <linux/kernel.h>
  823.  #include <linux/timer.h>
  824.  #include <linux/tqueue.h>
  825. @@ -61,6 +62,7 @@
  826.  static int frag_count;                             /* Number of fragments to go */
  827.  static int frag_pos;                               /* Position in fragment arrays */
  828.  static unsigned int frag_sectors;
  829. +static unsigned Busy;                              /* We're busy if this is true */
  830.  
  831.  static unsigned int PartFragRead;   /* The number of sectors which have been read
  832.                                         during a partial read split over two
  833. @@ -91,9 +93,9 @@
  834.  static void mfm_interrupt_handler (int, struct pt_regs *);
  835.  static void mfm_seek (void);
  836.  static void mfm_unexpected_interrupt (void);
  837. +static void mfm_rerequest (void);
  838.  static void mfm_request (void);
  839.  static int  mfm_reread_partitions (int dev);
  840. -static void mfm_request (void);
  841.  static void mfm_specify (void);
  842.  
  843.  #define mfm_init xd_init
  844. @@ -111,7 +113,6 @@
  845.  static char mfm_IRQMask;    /* AND with *mfm_IRQPollLoc to find if there is an interrupt */
  846.  static int mfm_drives = 0;    /* drives available */
  847.  static int mfm_status = 0;    /* interrupt status */
  848. -static char mfm_busy = 0;    /* mfm busy */
  849.  static int *errors;
  850.  
  851.  static struct rawcmd
  852. @@ -223,6 +224,27 @@
  853.  #define STAT_POL    0x0200        /* Polling */
  854.  
  855.  /* ------------------------------------------------------------------------------------------ */
  856. +static void console_printf(const char *fmt, ...) {
  857. +  static buffer[2048]; /* Arbitary! */
  858. +  extern void console_print(const char *);
  859. +  va_list ap;
  860. +  int flags;
  861. +
  862. +  save_flags(flags);
  863. +  cli();
  864. +
  865. +  va_start(ap,fmt);
  866. +
  867. +  vsprintf(buffer,fmt,ap);
  868. +
  869. +  console_print(buffer);
  870. +
  871. +  va_end(fmt);
  872. +  
  873. +  restore_flags(flags);
  874. +}; /* console_printf */
  875. +
  876. +/* ------------------------------------------------------------------------------------------ */
  877.  
  878.  static struct gendisk mfm_gendisk = {
  879.      MAJOR_NR,    /* Major number */
  880. @@ -261,7 +283,8 @@
  881.  /* DAG */
  882.  #ifdef CONFIG_MFM_ONMAINBOARD
  883.    mfm_irq = IRQ_HARDDISK;
  884. -  mfm_addr=(0x3250000>>2); /* Motherboard HDC address  - thats probably slow - what should it be? */
  885. +  mfm_addr=(0x32d0000>>2); /* Motherboard HDC address  - thats medium (as RiscOS)
  886. +                              used to be slow */
  887.    mfm_IRQPollLoc=ioc+0x20;
  888.    mfm_IRQMask=0x08; /* IL3 pin */
  889.  #else
  890. @@ -305,11 +328,13 @@
  891.      gendisk_head = & mfm_gendisk;
  892.  #endif
  893.  
  894. +  Busy=0;
  895. +
  896.      return 0;
  897.  }
  898.  
  899.  /* DAG: Gets called by the genhd code to set up the number of sectors etc. */
  900. -void xt_set_geometry(int dev,unsigned char secsptrack,unsigned char heads,
  901. +void xd_set_geometry(int dev,unsigned char secsptrack,unsigned char heads,
  902.                     unsigned long discsize, unsigned int secsize)
  903.  {
  904.    dev=MINOR(dev);
  905. @@ -329,18 +354,18 @@
  906.      printk("mfm%c: %d cylinders, %d heads, %d sectors secsize=%d (%ld total)\n",'a'+(dev>>6),
  907.          mfm_info[dev>>6].cylinders, heads, secsptrack, secsize, discsize);
  908.      /* Should probably do a specify command here....*/
  909. -    printk("mfm: at end of set_hdinfo: About to do a specify\n");
  910. +    console_printf("mfm: at end of set_hdinfo: About to do a specify\n");
  911.      if ((heads<1) || (mfm_drive_param[dev>>6].nocylinders>1024)) {
  912.        /* Shouldn't be a panic - but easiest for initial debug */
  913.        panic("xt_set_hdinfo: Invalid heads/cylinders count\n"); 
  914.      };
  915.      mfm_specify();
  916. -    printk("mfm: set_hdinfo after the specify\n");
  917. +    console_printf("mfm: set_hdinfo after the specify\n");
  918.    };
  919.  
  920.    mfm[dev].start_sect=0;
  921.    mfm[dev].nr_sects=(discsize/secsize)/2; /* This is 512 byte sectors - I want 256 but where does this get set for image files? */
  922. -  printk("mfm set_hdinfo: mfm[%d].nr_sects=%ld\n",dev,mfm[dev].nr_sects);
  923. +  console_printf("mfm set_hdinfo: mfm[%d].nr_sects=%ld\n",dev,mfm[dev].nr_sects);
  924.  
  925.  }
  926.      
  927. @@ -363,14 +388,14 @@
  928.          printk("mfm%d: heads = %d, cylinders = %d, sectors = %d\n", i,
  929.               mfm_info[i].heads, mfm_info[i].cylinders, mfm_info[i].sectors);
  930.  
  931. -  /*printk("mfm: Before irq register\n");*/
  932. +  /*console_printf("mfm: Before irq register\n");*/
  933.      if(request_irq(mfm_irq, mfm_interrupt_handler, SA_INTERRUPT, "MFM harddisk"))
  934.          printk("mfm: unable to get IRQ%d\n", mfm_irq);
  935.  
  936. -  /*printk("mfm: Before wierd write\n"); */
  937. +  /*console_printf("mfm: Before wierd write\n"); */
  938.      /*outw(0x80, mfm_addr + (0x1000 >> 2)); *//* Pardon? DAG */
  939.  
  940. -  /*printk("mfm: Before data init\n");*/
  941. +  /*console_printf("mfm: Before data init\n");*/
  942.      for(i = 0; i < mfm_drives; i++) {
  943.          mfm[i << 6].nr_sects = mfm_info[i].heads * mfm_info[i].cylinders *
  944.                  mfm_info[i].sectors;
  945. @@ -379,11 +404,11 @@
  946.      }
  947.      mfm_gendisk.nr_real = mfm_drives;
  948.  
  949. -  /*printk("mfm: Before init blocksizes\n");*/
  950. +  /*console_printf("mfm: Before init blocksizes\n");*/
  951.      for(i=0; i<(XD_MAXDRIVES << 6); i++)
  952.          mfm_blocksizes[i] = 1024;
  953.      blksize_size[MAJOR_NR] = mfm_blocksizes;
  954. -  /*printk("mfm: End of init\n");*/
  955. +  /*console_printf("mfm: End of init\n");*/
  956.  }
  957.  
  958.  static int mfm_open (struct inode *inode,struct file *file)
  959. @@ -552,16 +577,16 @@
  960.      int status;
  961.  #ifdef DEBUG
  962.      int i;
  963. -    printk("issue_command: %02X: ",command);
  964. +    console_printf("issue_command: %02X: ",command);
  965.      for(i=0; i<len; i++)
  966. -      printk("%02X ", cmdb[i]);
  967. -    printk("\n");
  968. +      console_printf("%02X ", cmdb[i]);
  969. +    console_printf("\n");
  970.  #endif
  971.  
  972.      do {
  973.          status = inw(MFM_STATUS);
  974.      } while(status & (STAT_BSY|STAT_POL));
  975. -  /*printk("issue_command: status after pol/bsy loop: %02X:\n ",status>>8); */
  976. +  /*console_printf("issue_command: status after pol/bsy loop: %02X:\n ",status>>8); */
  977.      if(status & (STAT_CPR|STAT_CED|STAT_SED|STAT_DER|STAT_ABN))
  978.      {
  979.          outw(CMD_RCAL, MFM_COMMAND);
  980. @@ -569,7 +594,7 @@
  981.      }
  982.  
  983.      status = inw(MFM_STATUS);
  984. -  /*printk("issue_command: status before parameter issue: %02X:\n ",status>>8);*/
  985. +  /*console_printf("issue_command: status before parameter issue: %02X:\n ",status>>8);*/
  986.      while(len > 0)
  987.      {
  988.          outw(cmdb[1] | (cmdb[0] << 8), MFM_DATAOUT);
  989. @@ -577,11 +602,11 @@
  990.          cmdb += 2;
  991.      }
  992.      status = inw(MFM_STATUS);
  993. -  /*printk("issue_command: status before command issue: %02X:\n ",status>>8);*/
  994. +  /*console_printf("issue_command: status before command issue: %02X:\n ",status>>8);*/
  995.      outw(command, MFM_COMMAND);
  996.      status = inw(MFM_STATUS);
  997. -  /*printk("issue_command: status immediatly after command issue: %02X:\n ",status>>8);*/
  998. -  udelay(20);
  999. +  /*console_printf("issue_command: status immediatly after command issue: %02X:\n ",status>>8);*/
  1000. +  /*udelay(20);*/
  1001.  }
  1002.  
  1003.  static void wait_for_completion (void)
  1004. @@ -593,8 +618,9 @@
  1005.  
  1006.  static void mfm_rw_intr (void)
  1007.  {
  1008. +  int old_status; /* Holds status on entry, we read to see if the command just finished */
  1009.  #ifdef DEBUG
  1010. -    printk("mfm_rw_intr...dataleft=%d\n",hdc63463_dataleft);
  1011. +    console_printf("mfm_rw_intr...dataleft=%d\n",hdc63463_dataleft);
  1012.    print_status();
  1013.  #endif
  1014.  
  1015. @@ -602,6 +628,9 @@
  1016.      /* Something has gone wrong - lets try that again */
  1017.      outw(CMD_RCAL, MFM_COMMAND);    /* Clear interrupt condition */
  1018.      if (cont) {
  1019. +#ifdef DEBUG
  1020. +      console_printf("mfm_rw_intr: DER/ABN err\n");
  1021. +#endif
  1022.        cont->error();
  1023.        cont->redo();
  1024.      };
  1025. @@ -633,20 +662,39 @@
  1026.        };
  1027.        return;
  1028.      };
  1029. -    /*printk("Going to try read dma..............status=0x%x\n",mfm_status); */
  1030. +    /*console_printf("Going to try read dma..............status=0x%x\n",mfm_status); */
  1031.      hdc63463_readdma();
  1032.    }; /* Read */
  1033.  
  1034. +  old_status=mfm_status;
  1035.      mfm_status = inw(MFM_STATUS);
  1036.    if (mfm_status & (STAT_DER | STAT_ABN)) {
  1037.      /* Something has gone wrong - lets try that again */
  1038.      if (cont) {
  1039. +#ifdef DEBUG
  1040. +      console_printf("mfm_rw_intr: DER/ABN error\n");
  1041. +#endif
  1042.        cont->error();
  1043.        cont->redo();
  1044.      };
  1045.      return;
  1046.    };
  1047.  
  1048. +  /* If this code wasn't entered due to command_end but there is
  1049. +  now a command end we must read the command results out. If it was
  1050. +  entered like this then mfm_interrupt_handler would have done the
  1051. +  job. */
  1052. +  if ((!((old_status & (STAT_CPR|STAT_BSY)) == STAT_CPR)) &&
  1053. +      ((mfm_status & (STAT_CPR|STAT_BSY)) == STAT_CPR)) {
  1054. +    int len=0;
  1055. +    while(len<16)
  1056. +    {
  1057. +      int in;
  1058. +      in = inw(MFM_DATAIN);
  1059. +      result[len++] = in>>8;
  1060. +      result[len++] = in;
  1061. +    };
  1062. +  }; /* Result read */
  1063.    /* If end of command move on */
  1064.    if (mfm_status & (STAT_CED)) {
  1065.      outw(CMD_RCAL, MFM_COMMAND);    /* Clear interrupt condition */
  1066. @@ -657,7 +705,7 @@
  1067.      }
  1068.      /*mfm_request(); - DAG - took out because we might not have finished the whole command */
  1069.  #ifdef DEBUG
  1070. -    printk("mfm_rw_intr: returned from cont->done\n");
  1071. +    console_printf("mfm_rw_intr: returned from cont->done\n");
  1072.  #endif
  1073.    } else {
  1074.      /* Its going to generate another interrupt */
  1075. @@ -668,7 +716,7 @@
  1076.  static void mfm_setup_rw (void)
  1077.  {
  1078.  #ifdef DEBUG
  1079. -    printk("setting up for rw...\n");
  1080. +    console_printf("setting up for rw...\n");
  1081.  #endif
  1082.  #if 1
  1083.      SET_INTR(mfm_rw_intr);
  1084. @@ -685,7 +733,7 @@
  1085.  static void mfm_recal_intr (void)
  1086.  {
  1087.  #ifdef DEBUG
  1088. -    printk("recal intr - status = ");
  1089. +    console_printf("recal intr - status = ");
  1090.      print_status();
  1091.  #endif
  1092.    outw(CMD_RCAL, MFM_COMMAND);    /* Clear interrupt condition */
  1093. @@ -719,7 +767,7 @@
  1094.  static void mfm_seek_intr (void)
  1095.  {
  1096.  #ifdef DEBUG
  1097. -    printk("seek intr - status = ");
  1098. +    console_printf("seek intr - status = ");
  1099.      print_status();  
  1100.  #endif
  1101.    outw(CMD_RCAL, MFM_COMMAND);    /* Clear interrupt condition */
  1102. @@ -753,7 +801,7 @@
  1103.    disc to - on its SECOND call to specify! */
  1104.  #define IDEA2
  1105.      unsigned char cmdb[16];
  1106. -    printk("specify...\n");
  1107. +    console_printf("specify...\n");
  1108.      cmdb[0] = 0x1F; /* OM0 - !SECT,!MOD,!DIF,PADP,ECD,CRCP,CRCI,ACOR */
  1109.      cmdb[1] = 0xC3; /* OM1 - DTM,BRST,!CEDM,!SEDM,!DERM,0,AMEX,PSK */
  1110.  #ifndef IDEA2
  1111. @@ -788,14 +836,14 @@
  1112.  {
  1113.      unsigned char cmdb[4];
  1114.  #ifdef DEBUG
  1115. -    printk("seeking...\n");
  1116. +    console_printf("seeking...\n");
  1117.  #endif
  1118.      if(MFM_DRV_PARAM.cylinder < 0) {
  1119.          cmdb[0] = raw_cmd.dev + 1;
  1120.          cmdb[1] = raw_cmd.head;
  1121.  
  1122.          SET_INTR(mfm_recal_intr);
  1123. -    printk("mfm_seek: about to call specify\n");
  1124. +    console_printf("mfm_seek: about to call specify\n");
  1125.      mfm_specify(); /* DAG added this */
  1126.          issue_command(CMD_RCLB, cmdb, 2);
  1127.          return;
  1128. @@ -818,7 +866,7 @@
  1129.  static void mfm_initialise (void)
  1130.  {
  1131.  #ifdef DEBUG
  1132. -    printk("init...\n");
  1133. +    console_printf("init...\n");
  1134.  #endif
  1135.      if(raw_cmd.flags & NEED_SEEK)
  1136.          mfm_seek();
  1137. @@ -831,14 +879,15 @@
  1138.  static void request_done(int uptodate)
  1139.  {
  1140.      if(!CURRENT) {
  1141. -        printk("mfm: request list destroyed\n");
  1142. +        console_printf("mfm: request list destroyed\n");
  1143.          return;
  1144.      }
  1145.      if(uptodate) {
  1146.      /* Apparently worked - lets check bytes left to DMA */
  1147.      if (hdc63463_dataleft!=(PartFragRead_SectorsLeft*256)) {
  1148. -      printk("mfm: request_done - dataleft=%d - should be %d\n",hdc63463_dataleft,PartFragRead_SectorsLeft*256);
  1149. +      console_printf("mfm: request_done - dataleft=%d - should be %d\n",hdc63463_dataleft,PartFragRead_SectorsLeft*256);
  1150.        end_request (0);
  1151. +      Busy=0;
  1152.      } else {
  1153.        /* Potentially this means that we've done; but we might be doing
  1154.           a partial access, (over two cylinders) or we may have a number
  1155. @@ -864,7 +913,9 @@
  1156.          unsigned int dev,block,nsect;
  1157.          dev=MINOR(CURRENT->rq_dev);
  1158.  
  1159. -        printk("mfm: Now about to issue fragment %d\n",frag_pos+1);
  1160. +#ifdef DEBUG
  1161. +        console_printf("mfm: Now about to issue fragment %d\n",frag_pos+1);
  1162. +#endif
  1163.          /* OK - time to issue another fragment */
  1164.          /* Increment the place where we are going to store the data */
  1165.          /* Move onto the next fragment */
  1166. @@ -874,13 +925,14 @@
  1167.             ask for some more fragments */
  1168.          if (frag_pos>=MAX_FRAGS)
  1169.          {
  1170. -          printk("mfm: Getting another block of fragments\n");
  1171. +          console_printf("mfm: Getting another block of fragments\n");
  1172.            block=CURRENT->sector*2;
  1173.            block+=mfm[dev].start_sect;
  1174.            nsect=CURRENT->nr_sectors*2;
  1175.            if (!image_file_check(CURRENT->rq_dev,CURRENT->cmd))
  1176.            {
  1177.              end_request(0);
  1178. +            Busy=0;
  1179.              /* Should I initiate another request here? */
  1180.              return;
  1181.            }
  1182. @@ -888,6 +940,7 @@
  1183.            if (!frag_count)
  1184.            {
  1185.              end_request(0);
  1186. +            Busy=0;
  1187.              /* Should I initiate another request here? */
  1188.              return;
  1189.            };
  1190. @@ -902,27 +955,29 @@
  1191.        } else {
  1192.          /* No - its the end of the line */
  1193.          end_request (1);
  1194. +        Busy=0;
  1195.  
  1196.  #ifdef DEBUG
  1197. -        printk("request_done: About to mfm_request\n");
  1198. +        console_printf("request_done: About to mfm_request\n");
  1199.  #endif
  1200.          /* Next one please */
  1201.          mfm_request(); /* Moved from mfm_rw_intr */
  1202.  #ifdef DEBUG
  1203. -        printk("request_done: returned from mfm_request\n");
  1204. +        console_printf("request_done: returned from mfm_request\n");
  1205.  #endif
  1206.        }; 
  1207.      };
  1208.      }
  1209.      else {
  1210.          end_request (0);
  1211. +    Busy=0;
  1212.      }
  1213.  }
  1214.  
  1215.  static void error_handler (void)
  1216.  {
  1217.      int i;
  1218. -    printk("error detected... status = ");
  1219. +    console_printf("error detected... status = ");
  1220.      print_status();
  1221.    /*panic("mfm error");*/ /* DAG tmp */
  1222.      (*errors) ++;
  1223. @@ -934,13 +989,13 @@
  1224.  
  1225.  static void rw_interrupt(void)
  1226.  {
  1227. -  printk("rw_interrupt\n");
  1228. +  console_printf("rw_interrupt\n");
  1229.  }
  1230.  
  1231.  static struct cont rw_cont ={
  1232.      rw_interrupt,
  1233.      error_handler,
  1234. -    mfm_request,
  1235. +    mfm_rerequest,
  1236.      request_done
  1237.  };
  1238.  
  1239. @@ -967,7 +1022,7 @@
  1240.      sectors_to_next_cyl+=(mfm_info[dev].sectors-start_sector);
  1241.  
  1242.  #ifdef DEBUG
  1243. -    printk("issue_request: mfm_info[dev].sectors=%d track=%d\n",mfm_info[dev].sectors,track);
  1244. +    console_printf("issue_request: mfm_info[dev].sectors=%d track=%d\n",mfm_info[dev].sectors,track);
  1245.  #endif
  1246.  
  1247.          raw_cmd.flags        = NEED_SEEK;
  1248. @@ -1003,7 +1058,7 @@
  1249.  
  1250.  
  1251.  #ifdef DEBUG
  1252. -        printk("mfm%c: %sing: CHS=%d/%d/%d, sectors=%d, buffer=0x%08lx (%p)\n",
  1253. +        console_printf("mfm%c: %sing: CHS=%d/%d/%d, sectors=%d, buffer=0x%08lx (%p)\n",
  1254.              raw_cmd.dev+'a', (CURRENT->cmd == READ)?"read":"writ",
  1255.              raw_cmd.cylinder,
  1256.              raw_cmd.head,
  1257. @@ -1012,41 +1067,69 @@
  1258.          cont = &rw_cont;
  1259.          errors = &(CURRENT->errors);
  1260.          mfm_tq.routine = (void (*)(void *))mfm_initialise;
  1261. -        queue_task(&mfm_tq, &tq_timer);
  1262. +        queue_task(&mfm_tq, &tq_immediate);
  1263. +    mark_bh(IMMEDIATE_BH);
  1264.  }; /* issue_request */
  1265.  
  1266. +static void mfm_rerequest (void)
  1267. +{
  1268. +  /* Called when an error has just happened - need to trick mfm_request
  1269. +     into thinking we weren't busy */
  1270. +  /* Turn off ints - mfm_request expects no interrupts anyway */
  1271. +#ifdef DEBUG
  1272. +  console_printf("mfm_rerequest\n");
  1273. +#endif
  1274. +  cli();
  1275. +  Busy=0;
  1276. +  mfm_request();
  1277. +};
  1278. +
  1279.  static void mfm_request (void)
  1280.  {
  1281.      unsigned int dev, block, nsect;
  1282.  
  1283.  #ifdef DEBUG
  1284. -  printk("mfm_request CURRENT=%p\n",CURRENT);
  1285. +  console_printf("mfm_request CURRENT=%p Busy=%d\n",CURRENT,Busy);
  1286.  #endif
  1287. +  if (!CURRENT) return;
  1288. +  /* If we are still processing then return; we will get called again */
  1289. +  if (Busy) return;
  1290. +  Busy=1;
  1291. +
  1292.      if(CURRENT && CURRENT->rq_dev < 0) {
  1293. -    printk("mfm_request: exit due to (CURRENT && CURRENT->rq_dev < 0)\n");
  1294. +    console_printf("mfm_request: exit due to (CURRENT && CURRENT->rq_dev < 0)\n");
  1295. +    Busy=0;
  1296.          return;
  1297.    };
  1298.  
  1299.      while(1){
  1300.  #ifdef DEBUG
  1301. -    printk("mfm_request: loop start\n");
  1302. +    console_printf("mfm_request: loop start\n");
  1303.  #endif
  1304.      /* DAG: I wonder if there wshould be a store flags here? */
  1305.          sti();
  1306.  
  1307.  #ifdef DEBUG
  1308. -    printk("mfm_request: before INIT_REQUEST\n");
  1309. +    console_printf("mfm_request: before INIT_REQUEST\n");
  1310.  #endif
  1311.          INIT_REQUEST;
  1312. +
  1313. +    /* DAG: Should this be here - e.g. if we run out of valid requests */
  1314. +    if (!CURRENT) {
  1315. +      console_printf("mfm_request: Exiting due to !CURRENT\n");
  1316. +      Busy=0;
  1317. +      return;
  1318. +    };
  1319. +
  1320.  #ifdef DEBUG
  1321. -    printk("mfm_request: before arg extraction\n");
  1322. +    console_printf("mfm_request: before arg extraction\n");
  1323.  #endif
  1324.          dev = MINOR(CURRENT->rq_dev);
  1325.          block = CURRENT->sector;
  1326.          nsect = CURRENT->nr_sectors;
  1327.  
  1328.  #ifdef DEBUG
  1329. -    printk("mfm_request: raw vals: dev=%d block=%d nsect=%d\n",dev,block,nsect);
  1330. +    console_printf("mfm_request: raw vals: dev=%d block=%d nsect=%d\n",dev,block,nsect);
  1331.  #endif
  1332.  
  1333.      /* DAG: Linux doesn't cope with this - even though it has an array telling
  1334. @@ -1064,6 +1147,7 @@
  1335.                  printk("mfm%c: bad access: block=%d, count=%d\n", (dev>>6)+'a',
  1336.                      block, nsect);
  1337.              end_request(0);
  1338. +      Busy=0;
  1339.              continue;
  1340.          }
  1341.          block += mfm[dev].start_sect;
  1342. @@ -1081,6 +1165,12 @@
  1343.        block=frag_start[0]*2;
  1344.        frag_sectors=nsect=frag_len[0]*2;
  1345.        frag_pos=0;
  1346. +#ifdef DEBUG
  1347. +      if (frag_count>1) {
  1348. +        console_printf("Multiple fragments rq_dev=%d block=%d nsect=%d frag_start[0]=%d frag_len[0]=%d\n",
  1349. +               CURRENT->rq_dev,block,nsect,frag_start[0],frag_len[0]);
  1350. +      };
  1351. +#endif
  1352.      } else {
  1353.        /* OK - its not an image file - lets just push it through */
  1354.        frag_pos=0;
  1355. @@ -1092,17 +1182,19 @@
  1356.           /* Stop writing to the raw drive */
  1357.           printk("mfm%d: attempted write on protected drive\n",dev);
  1358.           end_request(0);
  1359. +         Busy=0;
  1360.           continue;
  1361.        };
  1362.      }; /* image file/normal if */
  1363.  #ifdef DEBUG
  1364. -    printk("mfm_request: block after offset=%d\n",block);
  1365. +    console_printf("mfm_request: block after offset=%d\n",block);
  1366.  #endif
  1367.  
  1368.          if(CURRENT->cmd != READ && CURRENT->cmd != WRITE)
  1369.          {
  1370.              printk("unknown mfm-command %d\n", CURRENT->cmd);
  1371.              end_request(0);
  1372. +      Busy=0;
  1373.              continue;
  1374.          }
  1375.  
  1376. @@ -1111,14 +1203,14 @@
  1377.          break;
  1378.      }
  1379.  #ifdef DEBUG
  1380. -  printk("mfm_request: Dropping out bottom\n");
  1381. +  console_printf("mfm_request: Dropping out bottom\n");
  1382.  #endif
  1383.  }
  1384.  
  1385.  static void do_mfm_request (void)
  1386.  {
  1387.  #ifdef DEBUG
  1388. -  printk("do_mfm_request: about to mfm_request\n");
  1389. +  console_printf("do_mfm_request: about to mfm_request\n");
  1390.  #endif
  1391.      mfm_request();
  1392.  }
  1393. @@ -1136,7 +1228,7 @@
  1394.      void (*handler)(void) = DEVICE_INTR;
  1395.  
  1396.  #ifdef DEBUG
  1397. -  printk("mfm_interrupt_handler (handler=0x%p)\n",handler);
  1398. +  console_printf("mfm_interrupt_handler (handler=0x%p)\n",handler);
  1399.  #endif
  1400.      CLEAR_INTR;
  1401.      mfm_status = inw(MFM_STATUS);
  1402. @@ -1161,8 +1253,6 @@
  1403.          mfm_unexpected_interrupt();
  1404.          return;
  1405.      }
  1406. -    /*mfm_tq.routine = (void (*)(void *))handler;
  1407. -    queue_task_irq(&mfm_tq, &tq_timer); */
  1408.    handler();
  1409.  }
  1410.  
  1411. diff -urN linux.store/linux/arch/arm/drivers/char/Makefile linux/arch/arm/drivers/char/Makefile
  1412. --- linux.store/linux/arch/arm/drivers/char/Makefile    Wed Mar 13 23:55:00 1996
  1413. +++ linux/arch/arm/drivers/char/Makefile    Thu Mar 28 14:16:17 1996
  1414. @@ -93,8 +93,12 @@
  1415.      done
  1416.      touch links
  1417.  
  1418. -LINKCLEAN:
  1419. +mrproper:
  1420.      -@for f in $(LK); do \
  1421. -        if [ -L $$f ]; then rm -f $$f; fi; \
  1422. +        if [ -L $$f ]; then \
  1423. +            echo $(RM) $$f; \
  1424. +            $(RM) $$f; \
  1425. +        fi; \
  1426.      done
  1427. -    rm -f links
  1428. +    $(RM) links
  1429. +    $(RM) conmakehash
  1430. diff -urN linux.store/linux/arch/arm/drivers/char/console.c linux/arch/arm/drivers/char/console.c
  1431. --- linux.store/linux/arch/arm/drivers/char/console.c    Wed Mar 13 23:55:01 1996
  1432. +++ linux/arch/arm/drivers/char/console.c    Thu Mar 28 14:21:29 1996
  1433. @@ -1818,7 +1818,7 @@
  1434.      }
  1435.  }
  1436.  
  1437. -static void console_print(const char *b)
  1438. +void console_print(const char *b)
  1439.  {
  1440.      int currcons = fg_console;
  1441.      unsigned char c;
  1442. diff -urN linux.store/linux/arch/arm/drivers/char/iic.c linux/arch/arm/drivers/char/iic.c
  1443. --- linux.store/linux/arch/arm/drivers/char/iic.c    Sun Mar  3 12:33:06 1996
  1444. +++ linux/arch/arm/drivers/char/iic.c    Fri Mar 22 21:53:55 1996
  1445. @@ -9,8 +9,7 @@
  1446.  #include <asm/system.h>
  1447.  #include <asm/delay.h>
  1448.  #include <asm/io.h>
  1449. -
  1450. -extern unsigned char volatile *const ioc;
  1451. +#include <asm/hardware.h>
  1452.  
  1453.  #define DELAY udelay(10)
  1454.  
  1455. @@ -18,12 +17,12 @@
  1456.  {
  1457.      unsigned char out;
  1458.  
  1459. -    out = ioc[0] | 0xc2;
  1460. +    out = IOC_CONTROL | 0xc2;
  1461.  
  1462. -    ioc[0] = out;
  1463. +    IOC_CONTROL = out;
  1464.      DELAY;
  1465.  
  1466. -    ioc[0] = out ^ 1;
  1467. +    IOC_CONTROL = out ^ 1;
  1468.      DELAY;
  1469.  }
  1470.  
  1471. @@ -31,13 +30,13 @@
  1472.  {
  1473.      unsigned char out;
  1474.  
  1475. -    out = ioc[0] | 0xc3;
  1476. +    out = IOC_CONTROL | 0xc3;
  1477.  
  1478.      DELAY;
  1479. -    ioc[0] = out ^ 1;
  1480. +    IOC_CONTROL = out ^ 1;
  1481.  
  1482.      DELAY;
  1483. -    ioc[0] = out;
  1484. +    IOC_CONTROL = out;
  1485.  }
  1486.  
  1487.  static int iic_sendbyte (unsigned char b)
  1488. @@ -45,30 +44,30 @@
  1489.      unsigned char out, in;
  1490.      int i;
  1491.  
  1492. -    out = (ioc[0] & 0xFC) | 0xC0;
  1493. +    out = (IOC_CONTROL & 0xFC) | 0xC0;
  1494.  
  1495. -    ioc[0] = out;
  1496. +    IOC_CONTROL = out;
  1497.      for (i = 7; i >= 0; i--) {
  1498. -    ioc[0] = out | ((b & (1 << i)) ? 1 : 0);
  1499. +    IOC_CONTROL = out | ((b & (1 << i)) ? 1 : 0);
  1500.      DELAY;
  1501.  
  1502. -    ioc[0] = out | ((b & (1 << i)) ? 1 : 0) | 2;
  1503. +    IOC_CONTROL = out | ((b & (1 << i)) ? 1 : 0) | 2;
  1504.      DELAY;
  1505.  
  1506. -    ioc[0] = out | ((b & (1 << i)) ? 1 : 0);
  1507. +    IOC_CONTROL = out | ((b & (1 << i)) ? 1 : 0);
  1508.      }
  1509. -    ioc[0] = out | 1;
  1510. +    IOC_CONTROL = out | 1;
  1511.      DELAY;
  1512.  
  1513. -    ioc[0] = out | 3;
  1514. +    IOC_CONTROL = out | 3;
  1515.      DELAY;
  1516.  
  1517. -    in = ioc[0] & 1;
  1518. +    in = IOC_CONTROL & 1;
  1519.  
  1520. -    ioc[0] = out | 1;
  1521. +    IOC_CONTROL = out | 1;
  1522.      DELAY;
  1523.  
  1524. -    ioc[0] = out;
  1525. +    IOC_CONTROL = out;
  1526.      DELAY;
  1527.  
  1528.      if(in) {
  1529. @@ -83,25 +82,25 @@
  1530.      unsigned char out, in;
  1531.      int i;
  1532.  
  1533. -    out = (ioc[0] & 0xFC) | 0xC0;
  1534. +    out = (IOC_CONTROL & 0xFC) | 0xC0;
  1535.  
  1536. -    ioc[0] = out;
  1537. +    IOC_CONTROL = out;
  1538.      in = 0;
  1539.      for (i = 7; i >= 0; i--) {
  1540. -    ioc[0] = out | 1;
  1541. +    IOC_CONTROL = out | 1;
  1542.      DELAY;
  1543.  
  1544. -    ioc[0] = out | 3;
  1545. +    IOC_CONTROL = out | 3;
  1546.      DELAY;
  1547.  
  1548. -    in = (in << 1) | (ioc[0] & 1);
  1549. -    ioc[0] = out | 1;
  1550. +    in = (in << 1) | (IOC_CONTROL & 1);
  1551. +    IOC_CONTROL = out | 1;
  1552.      DELAY;
  1553.      }
  1554. -    ioc[0] = out;
  1555. +    IOC_CONTROL = out;
  1556.      DELAY;
  1557.  
  1558. -    ioc[0] = out | 2;
  1559. +    IOC_CONTROL = out | 2;
  1560.      DELAY;
  1561.  
  1562.      return in;
  1563. diff -urN linux.store/linux/arch/arm/drivers/char/keyboard.c linux/arch/arm/drivers/char/keyboard.c
  1564. --- linux.store/linux/arch/arm/drivers/char/keyboard.c    Wed Mar 13 23:55:03 1996
  1565. +++ linux/arch/arm/drivers/char/keyboard.c    Fri Mar 22 21:59:21 1996
  1566. @@ -37,6 +37,7 @@
  1567.  
  1568.  #include <asm/bitops.h>
  1569.  #include <asm/irq.h>
  1570. +#include <asm/hardware.h>
  1571.  
  1572.  #include "kbd_kern.h"
  1573.  #include "diacr.h"
  1574. @@ -216,8 +217,7 @@
  1575.  static unsigned char    kbd_sendptri;
  1576.  static unsigned char    kbd_sendptro;
  1577.  static unsigned char    ledstate = 0xff;
  1578. -static unsigned char getleds(void);
  1579. -extern unsigned char    *ioc;
  1580. +static unsigned char    getleds(void);
  1581.  
  1582.  /*
  1583.   * This array converts the scancode that we get from the keyboard to the
  1584. @@ -533,7 +533,7 @@
  1585.  
  1586.      pt_regs = regs;
  1587.  
  1588. -    keyval=ioc[4];
  1589. +    keyval = IOC_KARTRX;
  1590.  
  1591.      switch(kbd_state) {
  1592.      case 0:/* initial reset condition */
  1593. @@ -656,15 +656,13 @@
  1594.  
  1595.  static void kbd_tx(int irq, struct pt_regs *regs)
  1596.  {
  1597. -  if(kbd_sendptri!=kbd_sendptro)
  1598. -  {
  1599. -    ioc[0x04]=kbd_sendvala[kbd_sendptro];
  1600. -    kbd_sendptro=(kbd_sendptro+1)&3;
  1601. +  if(kbd_sendptri != kbd_sendptro) {
  1602. +    IOC_KARTTX = kbd_sendvala[kbd_sendptro];
  1603. +    kbd_sendptro = (kbd_sendptro + 1) & 3;
  1604.    }
  1605. -  if(kbd_sendptri==kbd_sendptro)
  1606. -  {
  1607. -    disable_irq(14);
  1608. -    enable_irq(15);
  1609. +  if(kbd_sendptri == kbd_sendptro) {
  1610. +    disable_irq (14);
  1611. +    enable_irq (15);
  1612.    }
  1613.  }
  1614.  
  1615. diff -urN linux.store/linux/arch/arm/drivers/net/Makefile linux/arch/arm/drivers/net/Makefile
  1616. --- linux.store/linux/arch/arm/drivers/net/Makefile    Sat Feb 24 21:37:51 1996
  1617. +++ linux/arch/arm/drivers/net/Makefile    Thu Mar 28 12:04:14 1996
  1618. @@ -148,8 +148,12 @@
  1619.      done
  1620.      touch links
  1621.  
  1622. -LINKCLEAN:
  1623. +mrproper:
  1624.      -@for f in $(LK); do \
  1625. -        if [ -L $$f ]; then rm $$f; fi; \
  1626. +        if [ -L $$f ]; then \
  1627. +            echo $(RM) $$f; \
  1628. +            $(RM) $$f; \
  1629. +        fi; \
  1630.      done
  1631. -    rm -f links
  1632. +    $(RM) links
  1633. +    $(RM) ppp.ver
  1634. diff -urN linux.store/linux/arch/arm/drivers/net/ether1.c linux/arch/arm/drivers/net/ether1.c
  1635. --- linux.store/linux/arch/arm/drivers/net/ether1.c    Thu Mar 14 11:43:03 1996
  1636. +++ linux/arch/arm/drivers/net/ether1.c    Tue Mar 26 23:16:37 1996
  1637. @@ -15,6 +15,12 @@
  1638.   * all the time, we have to be careful when we modify the pointers etc
  1639.   * so that the buffer memory is valid all the time.
  1640.   */
  1641. +
  1642. +/*
  1643. + * Change log:
  1644. + * 1.00    RMK            Released
  1645. + * 1.01    RMK       19/03/96    Transfers the last odd byte onto/off of the card now.
  1646. + */
  1647.  #ifdef MODULE
  1648.  #include <linux/module.h>
  1649.  #include <linux/version.h>
  1650. @@ -55,15 +61,15 @@
  1651.  #define FUNC_PROLOGUE \
  1652.      struct ether1_priv *priv = (struct ether1_priv *)dev->priv
  1653.  
  1654. -#define BUFFER_SIZE    65536
  1655. -#define TX_AREA_START    0x0100
  1656. -#define TX_AREA_END    0x5000
  1657. -#define RX_AREA_START    0x5000
  1658. -#define RX_AREA_END    0xfc00
  1659. +#define BUFFER_SIZE    0x10000
  1660. +#define TX_AREA_START    0x00100
  1661. +#define TX_AREA_END    0x05000
  1662. +#define RX_AREA_START    0x05000
  1663. +#define RX_AREA_END    0x0fc00
  1664.  
  1665.  #define tx_done(dev) 0
  1666.  /* ------------------------------------------------------------------------- */
  1667. -static char *version = "ether1 ethernet driver (c) 1995 Russell King V1.00\n";
  1668. +static char *version = "ether1 ethernet driver (c) 1995 Russell King v1.01\n";
  1669.  
  1670.  #define BUS_16 16
  1671.  #define BUS_8  8
  1672. @@ -122,8 +128,28 @@
  1673.      "    mov    %0, %0, lsr #8\n"
  1674.      "    strb    %0, [%2], #1\n"
  1675.      "    subs    %3, %3, #2\n"
  1676. +    "    bmi    2f\n"
  1677. +    "    ldr    %0, [%1], #4\n"
  1678. +    "    strb    %0, [%2], #1\n"
  1679. +    "    mov    %0, %0, lsr #8\n"
  1680. +    "    strb    %0, [%2], #1\n"
  1681. +    "    subs    %3, %3, #2\n"
  1682. +    "    bmi    2f\n"
  1683. +    "    ldr    %0, [%1], #4\n"
  1684. +    "    strb    %0, [%2], #1\n"
  1685. +    "    mov    %0, %0, lsr #8\n"
  1686. +    "    strb    %0, [%2], #1\n"
  1687. +    "    subs    %3, %3, #2\n"
  1688. +    "    bmi    2f\n"
  1689. +    "    ldr    %0, [%1], #4\n"
  1690. +    "    strb    %0, [%2], #1\n"
  1691. +    "    mov    %0, %0, lsr #8\n"
  1692. +    "    strb    %0, [%2], #1\n"
  1693. +    "    subs    %3, %3, #2\n"
  1694.      "    bpl    1b\n"
  1695. -    "2:"
  1696. +    "2:    adds    %3, %3, #1\n"
  1697. +    "    ldreqb    %0, [%1]\n"
  1698. +    "    streqb    %0, [%2]\n"
  1699.      : "=&r" (used), "=&r" (addr), "=&r" (data), "=&r" (len)
  1700.      : "1" (addr << 2), "2" (data), "3" (len));
  1701.  
  1702. @@ -143,8 +169,28 @@
  1703.      "    orr    %0, %0, %0, lsr #16\n"
  1704.      "    str    %0, [%1], #4\n"
  1705.      "    subs    %3, %3, #2\n"
  1706. +    "    bmi    2f\n"
  1707. +    "    ldr    %0, [%2], #2\n"
  1708. +    "    mov    %0, %0, lsl #16\n"
  1709. +    "    orr    %0, %0, %0, lsr #16\n"
  1710. +    "    str    %0, [%1], #4\n"
  1711. +    "    subs    %3, %3, #2\n"
  1712. +    "    bmi    2f\n"
  1713. +    "    ldr    %0, [%2], #2\n"
  1714. +    "    mov    %0, %0, lsl #16\n"
  1715. +    "    orr    %0, %0, %0, lsr #16\n"
  1716. +    "    str    %0, [%1], #4\n"
  1717. +    "    subs    %3, %3, #2\n"
  1718. +    "    bmi    2f\n"
  1719. +    "    ldr    %0, [%2], #2\n"
  1720. +    "    mov    %0, %0, lsl #16\n"
  1721. +    "    orr    %0, %0, %0, lsr #16\n"
  1722. +    "    str    %0, [%1], #4\n"
  1723. +    "    subs    %3, %3, #2\n"
  1724.      "    bpl    1b\n"
  1725. -    "2:"
  1726. +    "2:    adds    %3, %3, #1\n"
  1727. +    "    ldreqb    %0, [%2]\n"
  1728. +    "    streqb    %0, [%1]\n"
  1729.      : "=&r" (used), "=&r" (addr), "=&r" (data), "=&r" (len)
  1730.      : "1" (addr << 2), "2" (data), "3" (len));
  1731.  
  1732. @@ -436,6 +482,7 @@
  1733.  
  1734.      /* release reset & give 586 a prod */
  1735.      priv->resetting = 1;
  1736. +    priv->initialising = 1;
  1737.      outb (CTRL_RST, REG_CONTROL);
  1738.      outb (0, REG_CONTROL);
  1739.      outb (CTRL_CA, REG_CONTROL);
  1740. @@ -490,7 +537,7 @@
  1741.      }
  1742.  
  1743.      i += HZ;
  1744. -    while (((status = ether1_inw (dev, TDR_ADDR, tdr_t, tdr_status, DISABLE_IRQS))
  1745. +    while (((status = ether1_inw (dev, TDR_ADDR, tdr_t, tdr_status, DISABLEIRQS))
  1746.          & STAT_COMPLETE) == 0) {
  1747.      if (jiffies > i)
  1748.          break;
  1749. @@ -596,7 +643,7 @@
  1750.      if ((ec = ecard_find (0, sizeof (ether1_prods) / sizeof (int), ether1_prods, ether1_manus)) == NULL)
  1751.      return ENODEV;
  1752.  
  1753. -    dev->base_addr = (((unsigned long)ec->r_podaddr & ~0x3c0000) + 0x340000) >> 2;
  1754. +    dev->base_addr = (((unsigned long)ecard_address (ec->slot_no, ECARD_IOC, ECARD_FAST)) >> 2;
  1755.      dev->irq       = ec->irq;
  1756.  
  1757.      ecard_claim (ec);
  1758. @@ -637,15 +684,35 @@
  1759.      return start;
  1760.  }
  1761.  
  1762. +static void
  1763. +ether1_restart (struct device *dev, char *reason)
  1764. +{
  1765. +    FUNC_PROLOGUE;
  1766. +    priv->stats.tx_errors ++;
  1767. +
  1768. +    if (reason)
  1769. +    printk ("%s: %s - resetting device\n", dev->name, reason);
  1770. +    else
  1771. +    printk (" - resetting device\n");
  1772. +
  1773. +    ether1_reset (dev);
  1774. +
  1775. +    dev->start = 0;
  1776. +    dev->tbusy = 0;
  1777. +
  1778. +    if (ether1_init_for_open (dev))
  1779. +    printk ("%s: unable to restart interface\n", dev->name);
  1780. +
  1781. +    dev->start = 1;
  1782. +}
  1783. +
  1784.  static int
  1785.  ether1_open (struct device *dev)
  1786.  {
  1787.      FUNC_PROLOGUE;
  1788.  #ifdef CLAIM_IRQ_AT_OPEN
  1789. -    if (request_irq (dev->irq, ether1_interrupt, 0, "ether1")) {
  1790. -    kfree (dev->priv);
  1791. +    if (request_irq (dev->irq, ether1_interrupt, 0, "ether1"))
  1792.      return -EAGAIN;
  1793. -    }
  1794.  
  1795.      irq2dev_map[dev->irq] = dev;
  1796.  #endif
  1797. @@ -653,7 +720,14 @@
  1798.  
  1799.      memset (&priv->stats, 0, sizeof (struct enet_statistics));
  1800.  
  1801. -    ether1_init_for_open (dev);
  1802. +    if (ether1_init_for_open (dev)) {
  1803. +#ifdef CLAIM_IRQ_AT_OPEN
  1804. +    free_irq (dev->irq);
  1805. +    irq2dev_map[dev->irq] = NULL;
  1806. +#endif
  1807. +    MOD_DEC_USE_COUNT;
  1808. +    return -EAGAIN;
  1809. +    }
  1810.  
  1811.      dev->tbusy = 0;
  1812.      dev->interrupt = 0;
  1813. @@ -677,10 +751,12 @@
  1814.      if (tickssofar < 5)
  1815.          return 1;
  1816.  
  1817. -    printk ("%s: transmit timeout, network cable problem?\n", dev->name);
  1818. -
  1819.      /* Try to restart the adapter. */
  1820. +    ether1_restart (dev, "transmit timeout, network cable problem?");
  1821. +#if 0
  1822. +    printk ("%s: transmit timeout, network cable problem?\n", dev->name);
  1823.      dev->tbusy = 0;
  1824. +#endif
  1825.      dev->trans_start = jiffies;
  1826.      }
  1827.  
  1828. @@ -780,7 +856,10 @@
  1829.  
  1830.      case CMD_NOP:
  1831.      if (nop.nop_link == caddr) {
  1832. -        printk ("%s: strange command complete with no tx command!\n", dev->name);
  1833. +        if (priv->initialising == 0)
  1834. +        printk ("%s: strange command complete with no tx command!\n", dev->name);
  1835. +        else
  1836. +            priv->initialising = 0;
  1837.          return;
  1838.      }
  1839.      caddr = nop.nop_link;
  1840. @@ -789,11 +868,13 @@
  1841.      case CMD_TX:
  1842.      if (nop.nop_status & STAT_COMPLETE)
  1843.          break;
  1844. -    printk ("%s: strange command complete without completed command!\n", dev->name);
  1845. +    ether1_restart (dev, "strange command complete without completed command!");
  1846.      return;
  1847.  
  1848.      default:
  1849. -    printk ("%s: strange command %d complete!\n", dev->name, nop.nop_command & CMD_MASK);
  1850. +    printk ("%s: strange command %d complete! (offset %04X)", dev->name,
  1851. +        nop.nop_command & CMD_MASK, caddr);
  1852. +    ether1_restart (dev, NULL);
  1853.      return;
  1854.      }
  1855.  
  1856. @@ -1031,7 +1112,7 @@
  1857.      memset (my_ethers[i], 0, sizeof (struct device));
  1858.  
  1859.      my_ethers[i]->irq = ec[i]->irq;
  1860. -    my_ethers[i]->base_addr = (((unsigned long)ec[i]->r_podaddr & ~0x3c0000) + 0x340000) >> 2;
  1861. +    my_ethers[i]->base_addr = (((unsigned long)ecard_address (ec[i]->slot_no, ECARD_IOC, ECARD_FAST)) >> 2;
  1862.      my_ethers[i]->init = ether1_probe;
  1863.      my_ethers[i]->name = ethernames[i];
  1864.  
  1865. diff -urN linux.store/linux/arch/arm/drivers/net/ether1.h linux/arch/arm/drivers/net/ether1.h
  1866. --- linux.store/linux/arch/arm/drivers/net/ether1.h    Sat Feb 17 10:05:58 1996
  1867. +++ linux/arch/arm/drivers/net/ether1.h    Wed Mar 20 10:17:11 1996
  1868. @@ -39,6 +39,7 @@
  1869.      volatile int rx_tail;
  1870.      char bus_type;
  1871.      char resetting;
  1872. +    char initialising;
  1873.  };
  1874.  
  1875.  static int ether1_open (struct device *dev);
  1876. diff -urN linux.store/linux/arch/arm/drivers/net/ether3.c linux/arch/arm/drivers/net/ether3.c
  1877. --- linux.store/linux/arch/arm/drivers/net/ether3.c    Wed Mar 13 23:55:05 1996
  1878. +++ linux/arch/arm/drivers/net/ether3.c    Fri Mar 22 23:23:05 1996
  1879. @@ -407,7 +407,7 @@
  1880.      if ((ec = ecard_find (0, sizeof(ether3_prods), ether3_prods, ether3_manus)) == NULL)
  1881.      return ENODEV;
  1882.  
  1883. -    dev->base_addr = ((unsigned long)ec->r_podaddr & ~0x003c0000UL) >> 2;
  1884. +    dev->base_addr = ((unsigned long)ecard_address (ec->slot_no, ECARD_MEMC, 0)) >> 2;
  1885.      dev->irq = ec->irq;
  1886.  
  1887.      ecard_claim (ec);
  1888. @@ -874,7 +874,7 @@
  1889.      memset(my_ethers[i], 0, sizeof(struct device));
  1890.  
  1891.      my_ethers[i]->irq = ec[i]->irq;
  1892. -    my_ethers[i]->base_addr= ((unsigned long)ec[i]->r_podaddr & ~0x003c0000UL)>>2;
  1893. +    my_ethers[i]->base_addr= ((unsigned long)ecard_address (ec[i]->slot_no, ECARD_MEMC, 0))>>2;
  1894.      my_ethers[i]->init = ether3_probe1;
  1895.      my_ethers[i]->name = ethernames[i];
  1896.  
  1897. diff -urN linux.store/linux/arch/arm/drivers/scsi/Makefile linux/arch/arm/drivers/scsi/Makefile
  1898. --- linux.store/linux/arch/arm/drivers/scsi/Makefile    Wed Mar 13 23:55:05 1996
  1899. +++ linux/arch/arm/drivers/scsi/Makefile    Thu Mar 28 11:55:16 1996
  1900. @@ -140,8 +140,11 @@
  1901.      done
  1902.      touch links
  1903.  
  1904. -LINKCLEAN:
  1905. +mrproper:
  1906.      -@for f in $(LK); do \
  1907. -        if [ -L $$f ]; then rm -f $$f; fi; \
  1908. +        if [ -L $$f ]; then \
  1909. +            echo $(RM) $$f; \
  1910. +            $(RM) $$f; \
  1911. +        fi; \
  1912.      done
  1913. -    rm -f links
  1914. +    $(RM) links
  1915. diff -urN linux.store/linux/arch/arm/drivers/scsi/acornscsi.c linux/arch/arm/drivers/scsi/acornscsi.c
  1916. --- linux.store/linux/arch/arm/drivers/scsi/acornscsi.c    Wed Mar 13 23:55:06 1996
  1917. +++ linux/arch/arm/drivers/scsi/acornscsi.c    Fri Mar 22 23:25:50 1996
  1918. @@ -1807,7 +1807,7 @@
  1919.          break;
  1920.  
  1921.      instance = scsi_register (tpnt, sizeof(struct acornscsi_hostdata));
  1922. -    instance->io_port = ((int)ecs[count]->r_podaddr & ~0x003C0000) >> 2;
  1923. +    instance->io_port = ((int)ecard_address (ecs[count]->slot_no, ECARD_MEMC, 0)) >> 2;
  1924.      instance->irq = ecs[count]->irq;
  1925.  
  1926.      if (instance->irq != 0xff) {
  1927. diff -urN linux.store/linux/arch/arm/drivers/scsi/cumana_1.c linux/arch/arm/drivers/scsi/cumana_1.c
  1928. --- linux.store/linux/arch/arm/drivers/scsi/cumana_1.c    Sat Feb 24 09:36:55 1996
  1929. +++ linux/arch/arm/drivers/scsi/cumana_1.c    Fri Mar 22 23:27:20 1996
  1930. @@ -87,7 +87,7 @@
  1931.              break;
  1932.  
  1933.          instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
  1934. -        instance->io_port = (((int)ec->r_podaddr & ~0x003c0000UL) | 0x00242000UL) >> 2;
  1935. +        instance->io_port = (((int)ecard_address (ec->slot_no, ECARD_IOC, ECARD_SLOW) + 0x2000) >> 2;
  1936.  
  1937.      NCR5380_init(instance, 0);
  1938.  
  1939. diff -urN linux.store/linux/arch/arm/drivers/scsi/oak.c linux/arch/arm/drivers/scsi/oak.c
  1940. --- linux.store/linux/arch/arm/drivers/scsi/oak.c    Sat Feb 24 09:36:56 1996
  1941. +++ linux/arch/arm/drivers/scsi/oak.c    Fri Mar 22 23:28:17 1996
  1942. @@ -82,7 +82,7 @@
  1943.              break;
  1944.  
  1945.          instance = scsi_register (tpnt, sizeof(struct NCR5380_hostdata));
  1946. -        instance->io_port = ((int)ecs[count]->r_podaddr & ~0x003c0000)>>2;
  1947. +        instance->io_port = ((int)ecard_address (ecs[count]->slot_no, ECARD_MEMC, 0)) >> 2;
  1948.  
  1949.      NCR5380_init(instance, 0);
  1950.  
  1951. diff -urN linux.store/linux/arch/arm/drivers/sound/Makefile linux/arch/arm/drivers/sound/Makefile
  1952. --- linux.store/linux/arch/arm/drivers/sound/Makefile    Sun Feb 11 09:32:34 1996
  1953. +++ linux/arch/arm/drivers/sound/Makefile    Thu Mar 28 11:55:43 1996
  1954. @@ -11,3 +11,4 @@
  1955.  
  1956.  include $(TOPDIR)/Rules.make
  1957.  
  1958. +mrproper:
  1959. diff -urN linux.store/linux/arch/arm/drivers/sound/arcaudio.c linux/arch/arm/drivers/sound/arcaudio.c
  1960. --- linux.store/linux/arch/arm/drivers/sound/arcaudio.c    Sun Mar  3 12:51:13 1996
  1961. +++ linux/arch/arm/drivers/sound/arcaudio.c    Fri Mar 22 22:01:59 1996
  1962. @@ -18,10 +18,10 @@
  1963.  #include "soundirq.h"
  1964.  #include "voice.h"
  1965.  
  1966. -#include "asm/segment.h"
  1967. +#include <asm/segment.h>
  1968. +#include <asm/hardware.h>
  1969.  
  1970.  static int spkr;
  1971. -extern unsigned char *ioc;
  1972.  
  1973.  static int arcaudio_write(struct inode *inode, struct file *filp, const char *buf, int nr)
  1974.  {
  1975. @@ -173,9 +173,9 @@
  1976.  {
  1977.      spkr = get_fs_long(arg) & 1;
  1978.      if(spkr)
  1979. -        ioc[0] = (ioc[0] & ~0x20) | 0xc0;
  1980. +        IOC_CONTROL = (IOC_CONTROL & ~0x20) | 0xc0;
  1981.      else
  1982. -        ioc[0] = (ioc[0] | 0x20) | 0xc0;
  1983. +        IOC_CONTROL = (IOC_CONTROL | 0x20) | 0xc0;
  1984.      return 0;
  1985.  }
  1986.  
  1987. @@ -231,5 +231,5 @@
  1988.    else
  1989.      printk("arcaudio ");
  1990.  
  1991. -  spkr = (ioc[0] & 0x20) == 0;
  1992. +  spkr = (IOC_CONTROL & 0x20) == 0;
  1993.  }
  1994. diff -urN linux.store/linux/arch/arm/kernel/dma.c linux/arch/arm/kernel/dma.c
  1995. --- linux.store/linux/arch/arm/kernel/dma.c    Wed Mar 13 23:55:06 1996
  1996. +++ linux/arch/arm/kernel/dma.c    Thu Mar 28 14:35:00 1996
  1997. @@ -8,6 +8,7 @@
  1998.  #include <asm/irq.h>
  1999.  #include <asm/dma.h>
  2000.  #include <asm/io.h>
  2001. +#include <asm/hardware.h>
  2002.  
  2003.  static unsigned long dma_address[8];
  2004.  static unsigned long dma_count[8];
  2005. @@ -16,6 +17,7 @@
  2006.  void enable_dma (unsigned int dmanr)
  2007.  {
  2008.  #ifdef CONFIG_BLK_DEV_FD
  2009. +#ifdef CONFIG_ARCH_A5K
  2010.      if (dmanr == 2) {
  2011.          switch (dma_direction[dmanr]) {
  2012.          case 1: /* read */
  2013. @@ -25,7 +27,7 @@
  2014.              unsigned long port);
  2015.          memcpy ((void *)0x1c, (void *)&floppy_fiqin_start,
  2016.              &floppy_fiqin_end - &floppy_fiqin_start);
  2017. -        floppy_fiqsetup (dma_count[dmanr], dma_address[dmanr], io_base + 0x02a000);
  2018. +        floppy_fiqsetup (dma_count[dmanr], dma_address[dmanr], (int)PCIO_FLOPPYDMABASE);
  2019.          enable_irq (16);
  2020.          break;
  2021.          }
  2022. @@ -36,7 +38,7 @@
  2023.              unsigned long port);
  2024.          memcpy ((void *)0x1c, (void *)&floppy_fiqout_start,
  2025.              &floppy_fiqout_end - &floppy_fiqout_start);
  2026. -        floppy_fiqsetup (dma_count[dmanr], dma_address[dmanr], io_base + 0x02a000);
  2027. +        floppy_fiqsetup (dma_count[dmanr], dma_address[dmanr], (int)PCIO_FLOPPYDMABASE);
  2028.          enable_irq (16);
  2029.          break;
  2030.          }
  2031. @@ -46,7 +48,7 @@
  2032.      } /* Direction switch */
  2033.      }; /* dmanr == 2 */
  2034.  #endif
  2035. -#ifdef CONFIG_BLK_DEV_FD1772
  2036. +#ifdef CONFIG_ARCH_ARC
  2037.      switch (dmanr) {
  2038.        case 0: /* Data DMA */
  2039.          switch (dma_direction[dmanr]) {
  2040. @@ -109,6 +111,7 @@
  2041.        break;
  2042.      } /* dma number switch */
  2043.  #endif
  2044. +#endif
  2045.  }
  2046.  
  2047.  void set_dma_mode (unsigned int dmanr, char mode)
  2048. @@ -145,14 +148,15 @@
  2049.  int get_dma_residue (unsigned int dmanr)
  2050.  {
  2051.  #ifdef CONFIG_BLK_DEV_FD
  2052. +#ifdef CONFIG_ARCH_A5K
  2053.      extern int floppy_fiqresidual (void);
  2054.      if (dmanr == 2)
  2055.      return floppy_fiqresidual ();
  2056.  #endif
  2057. -#ifdef CONFIG_BLK_DEV_FD1772
  2058. +#ifdef CONFIG_ARCH_ARC
  2059.      extern unsigned int fdc1772_bytestogo;
  2060.      if (dmanr == 0) return fdc1772_bytestogo; 
  2061.  #endif
  2062. -
  2063. +#endif
  2064.      return -1;
  2065.  }
  2066. diff -urN linux.store/linux/arch/arm/kernel/ecard.c linux/arch/arm/kernel/ecard.c
  2067. --- linux.store/linux/arch/arm/kernel/ecard.c    Wed Mar 13 23:55:07 1996
  2068. +++ linux/arch/arm/kernel/ecard.c    Fri Mar 22 23:21:00 1996
  2069. @@ -20,6 +20,8 @@
  2070.  #include <asm/ecard.h>
  2071.  #include <asm/irq.h>
  2072.  #include <asm/io.h>
  2073. +#include <asm/hardware.h>
  2074. +
  2075.  #ifdef CONFIG_ARCH_ARC
  2076.  #include <asm/arch/oldlatches.h>
  2077.  #endif
  2078. @@ -28,13 +30,10 @@
  2079.   * from linux/arch/arm/kernel/irq.c
  2080.   */
  2081.  extern void do_fast_IRQ(int irq);
  2082. -extern unsigned char *ioc;
  2083.  int ecard_num_cards;
  2084.  
  2085.  #define MAX_ECARDS 4
  2086.  
  2087. -#define expmask ((volatile unsigned char *)(io_base + 0x360000))
  2088. -
  2089.  static struct expansion_card expcard[MAX_ECARDS];
  2090.  static char have_expmask = 0;
  2091.  static char initialised = 0;
  2092. @@ -81,7 +80,7 @@
  2093.  #endif
  2094.  
  2095.      for (i = 0; i < num_cards; i++) {
  2096. -    if (expmask[0] & (1 << i)) {
  2097. +    if (EXPMASK_STATUS & (1 << i)) {
  2098.          if (expcard[i].r_found && expcard[i].r_claimed) {
  2099.          if (!expcard[i].r_irqmask || (expcard[i].r_irqaddr[0] & expcard[i].r_irqmask)) {
  2100.              /*
  2101. @@ -100,16 +99,16 @@
  2102.              cli ();
  2103.              oldexpmask = have_expmask;
  2104.              have_expmask &= (~(15 << i)) | 0xf0;
  2105. -            expmask[4] = have_expmask;
  2106. -            ioc[0x28] |= 1 << 5;
  2107. +            EXPMASK_ENABLE = have_expmask;
  2108. +            IOC_IRQMASKB |= 1 << 5;
  2109.              sti ();
  2110.  #endif
  2111.              do_fast_IRQ (expcard[i].irq);
  2112.              ns ++;
  2113.  #if 0
  2114.              cli ();
  2115. -            ioc[0x28] &= ~(1 << 5);
  2116. -            expmask[4] = oldexpmask;
  2117. +            IOC_IRQMASKB &= ~(1 << 5);
  2118. +            EXPMASK_ENABLE = oldexpmask;
  2119.              sti ();
  2120.  #endif
  2121.          } else
  2122. @@ -118,7 +117,7 @@
  2123.          printk ("card%d: interrupt from non-claimed card\n", i);
  2124.          have_expmask &= ~(1 << i);
  2125.          /* disable interrupt */
  2126. -        expmask[4] = have_expmask;
  2127. +        EXPMASK_ENABLE = have_expmask;
  2128.          }
  2129.      }
  2130.      }
  2131. @@ -130,7 +129,7 @@
  2132.  {/*printk ("irq %d enable\n", intr_no);
  2133.      if (have_expmask && intr_no >= 24 && intr_no < 28) {
  2134.      have_expmask |= 1 << (intr_no - 24);
  2135. -    expmask[4] = have_expmask;
  2136. +    EXPMASK_ENABLE = have_expmask;
  2137.      }*/
  2138.  }
  2139.  
  2140. @@ -138,17 +137,19 @@
  2141.  {/*printk ("irq %d disable\n", intr_no);
  2142.      if (have_expmask && intr_no >= 24 && intr_no < 28) {
  2143.      have_expmask &= ~(1 << (intr_no - 24));
  2144. -    expmask[4] = have_expmask; 
  2145. +    EXPMASK_ENABLE = have_expmask; 
  2146.      }*/
  2147.  }
  2148.  
  2149.  static int ecard_checkirqhw (void)
  2150.  {
  2151.      int found;
  2152. -    expmask[4] = 0x00;
  2153. -    expmask[0] = 0xff;
  2154. -    found = (expmask[0] == 0xf0);
  2155. -    expmask[4] = 0xff;
  2156. +
  2157. +    EXPMASK_ENABLE = 0x00;
  2158. +    EXPMASK_STATUS = 0xff;
  2159. +    found = (EXPMASK_STATUS == 0xf0);
  2160. +    EXPMASK_ENABLE = 0xff;
  2161. +
  2162.      return found;
  2163.  }
  2164.  
  2165. @@ -255,6 +256,11 @@
  2166.      return 1;
  2167.  }
  2168.  
  2169. +unsigned char *ecard_address (int card, int memc, int speed)
  2170. +{
  2171. +    return (unsigned char *)(memc ? MEMCECIO_BASE : IOCECIO_BASE + (speed << 19)) + (card << 14);
  2172. +}
  2173. +
  2174.  unsigned long ecard_init(unsigned long my_kmem)
  2175.  {
  2176.      int i;
  2177. @@ -293,7 +299,8 @@
  2178.          
  2179.      ec = &expcard[i];
  2180.          
  2181. -    ec->r_podaddr = (volatile unsigned char *)(io_base + 0x3C0000 + 0x4000*i);
  2182. +    ec->slot_no = i;
  2183. +    ec->r_podaddr = ecard_address (i, 0, ECARD_SYNC);
  2184.          
  2185.      ec->ecld.r_ecld = 2;
  2186.      ec->irq = 0;
  2187. @@ -335,19 +342,12 @@
  2188.      printk("\n");
  2189.  
  2190.      if (have_expmask)
  2191. -    expmask[4] = have_expmask;
  2192. +    EXPMASK_ENABLE = have_expmask;
  2193.  
  2194.      initialised = 1;
  2195. -    return kmem;    
  2196. -}
  2197. -
  2198. -unsigned long bios32_init(unsigned long start_mem, unsigned long end_mem)
  2199. -{
  2200. -    unsigned long mem;
  2201. -
  2202. -    mem = ecard_init(start_mem);
  2203. -
  2204.  #ifdef CONFIG_ARCH_ARC
  2205.      oldlatch_init ();
  2206.  #endif
  2207. +    return kmem;    
  2208.  }
  2209. +
  2210. diff -urN linux.store/linux/arch/arm/kernel/head.S linux/arch/arm/kernel/head.S
  2211. --- linux.store/linux/arch/arm/kernel/head.S    Sun Mar  3 13:03:43 1996
  2212. +++ linux/arch/arm/kernel/head.S    Thu Mar 14 23:26:08 1996
  2213. @@ -67,39 +67,32 @@
  2214.  @        4156025X = ARM 250
  2215.  @        4156020X = ARM 2
  2216.  @
  2217. -        adr    r0, undef_instr - 12
  2218. -        mov    r2, #4
  2219. -        mov    r3, #0xea000000
  2220. -        orr    r0, r3, r0, lsr #2
  2221. -        str    r0, [r2]
  2222. -
  2223. -        mrc    15, 0, r0, c0, c0
  2224. -
  2225. -continue:
  2226. +        adr    r3, undef_instr - 12
  2227. +        mov    r2, #0
  2228. +        mov    r0, #0xea000000
  2229. +        orr    r3, r0, r3, lsr #2
  2230. +        str    r3, [r2, #4]
  2231. +
  2232. +        ldr    r3, arm2_id
  2233. +        swp    r0, r0, [r2]        @ check for swp - if it can't do it, then it
  2234. +        ldr    r3, arm250_id        @ must be ARM2
  2235. +        mrc    15, 0, r0, c0, c0    @ check for CP#15 - if it can't do it, then ARM250
  2236. +        mov    r3, r0
  2237. +continue:    ldr    r0, [pc, #LC4 - . - 8]
  2238. +        str    r3, [r0]
  2239.  @
  2240.  @ Make undefined instr vector point to itself (endless loop)
  2241.  @
  2242. +        mov    r3, #0xeb000000
  2243.          sub    r3, r3, #2
  2244. -        orr    r3, r3, #0xeb000000
  2245. -        str    r3, [r2]
  2246. -        ldr    r3, [pc, #LC4 - . - 8]
  2247. -        str    r0, [r3]
  2248. +        mov    r2, #0
  2249. +        str    r3, [r2, #4]
  2250.          mov    fp, #0
  2251.          b    _start_kernel
  2252.  @
  2253. -@ IF we come in here from the mrc instruction, then we have an ARM2/250
  2254. +@ IF we come in here then one of the swp / mrc instructions must have aborted - jum
  2255.  @
  2256. -undef_instr:    adr    r0, undef_instr2 - 12
  2257. -        orr    r0, r3, r0, lsr #2
  2258. -        str    r0, [r2], #4
  2259. -        swpb    r0, r0, [r2]
  2260. -        ldr     r0, arm250_id
  2261. -        b    continue
  2262. -
  2263. -arm250_id:    .long    0x41560250
  2264. -
  2265. -undef_instr2:    ldr    r0, arm2_id
  2266. -        b    continue
  2267. +undef_instr:    b    continue
  2268.  
  2269.  arm2_id:    .long    0x41560200
  2270. -
  2271. +arm250_id:    .long    0x41560250
  2272. diff -urN linux.store/linux/arch/arm/kernel/irq.c linux/arch/arm/kernel/irq.c
  2273. --- linux.store/linux/arch/arm/kernel/irq.c    Wed Mar 13 23:55:07 1996
  2274. +++ linux/arch/arm/kernel/irq.c    Fri Mar 22 22:46:23 1996
  2275. @@ -31,8 +31,7 @@
  2276.  #include <linux/random.h>
  2277.  
  2278.  #include <asm/system.h>
  2279. -
  2280. -extern char *ioc;
  2281. +#include <asm/hardware.h>
  2282.  
  2283.  /*
  2284.   * Slight change here - we now keep a bit array of currently executing
  2285. @@ -61,13 +60,13 @@
  2286.      enabled_irqs &= ~(1 << irq_nr);
  2287.  
  2288.      if (irq_nr < 8)
  2289. -    ioc[0x18] &= ~(1 << irq_nr);
  2290. +    IOC_IRQMASKA &= ~(1 << irq_nr);
  2291.      else
  2292.      if (irq_nr < 16)
  2293. -    ioc[0x28] &= ~(1 << (irq_nr & 7));
  2294. +    IOC_IRQMASKB &= ~(1 << (irq_nr & 7));
  2295.      else
  2296.      if (irq_nr < 24)
  2297. -    ioc[0x38] &= ~(1 << (irq_nr & 7));
  2298. +    IOC_FIQMASK &= ~(1 << (irq_nr & 7));
  2299.      else
  2300.          ecard_disableirq (irq_nr);
  2301.  
  2302. @@ -90,13 +89,13 @@
  2303.  
  2304.      if ((executing_irqs & (1 << irq_nr)) == 0) {
  2305.      if (irq_nr < 8)
  2306. -        ioc[0x18] |= 1 << irq_nr;
  2307. +        IOC_IRQMASKA |= 1 << irq_nr;
  2308.      else
  2309.          if (irq_nr < 16)
  2310. -        ioc[0x28] |= 1 << (irq_nr & 7);
  2311. +        IOC_IRQMASKB |= 1 << (irq_nr & 7);
  2312.      else
  2313.      if (irq_nr < 24)
  2314. -        ioc[0x38] |= (1 << (irq_nr & 7));
  2315. +        IOC_FIQMASK |= (1 << (irq_nr & 7));
  2316.      }
  2317.      if (irq_nr >= 24)
  2318.      ecard_enableirq (irq_nr);
  2319. @@ -149,89 +148,89 @@
  2320.   * fast ones, then the bad ones.
  2321.   */
  2322.  static void (*interrupt[16])(void) = {
  2323. -    IRQ0_interrupt, IRQ1_interrupt, IRQ2_interrupt, IRQ3_interrupt,
  2324. -    IRQ4_interrupt, IRQ5_interrupt, IRQ6_interrupt, IRQ7_interrupt,
  2325. -    IRQ8_interrupt, IRQ9_interrupt, IRQ10_interrupt, IRQ11_interrupt,
  2326. -    IRQ12_interrupt, IRQ13_interrupt, IRQ14_interrupt, IRQ15_interrupt
  2327. +    IRQ0_interrupt, IRQ1_interrupt, IRQ2_interrupt, IRQ3_interrupt,
  2328. +    IRQ4_interrupt, IRQ5_interrupt, IRQ6_interrupt, IRQ7_interrupt,
  2329. +    IRQ8_interrupt, IRQ9_interrupt, IRQ10_interrupt, IRQ11_interrupt,
  2330. +    IRQ12_interrupt, IRQ13_interrupt, IRQ14_interrupt, IRQ15_interrupt
  2331.  };
  2332.  
  2333.  static void (*fast_interrupt[16])(void) = {
  2334. -    fast_IRQ0_interrupt, fast_IRQ1_interrupt,
  2335. -    fast_IRQ2_interrupt, fast_IRQ3_interrupt,
  2336. -    fast_IRQ4_interrupt, fast_IRQ5_interrupt,
  2337. -    fast_IRQ6_interrupt, fast_IRQ7_interrupt,
  2338. -    fast_IRQ8_interrupt, fast_IRQ9_interrupt,
  2339. -    fast_IRQ10_interrupt, fast_IRQ11_interrupt,
  2340. -    fast_IRQ12_interrupt, fast_IRQ13_interrupt,
  2341. -    fast_IRQ14_interrupt, fast_IRQ15_interrupt
  2342. +    fast_IRQ0_interrupt, fast_IRQ1_interrupt,
  2343. +    fast_IRQ2_interrupt, fast_IRQ3_interrupt,
  2344. +    fast_IRQ4_interrupt, fast_IRQ5_interrupt,
  2345. +    fast_IRQ6_interrupt, fast_IRQ7_interrupt,
  2346. +    fast_IRQ8_interrupt, fast_IRQ9_interrupt,
  2347. +    fast_IRQ10_interrupt, fast_IRQ11_interrupt,
  2348. +    fast_IRQ12_interrupt, fast_IRQ13_interrupt,
  2349. +    fast_IRQ14_interrupt, fast_IRQ15_interrupt
  2350.  };
  2351.  
  2352.  static void (*bad_interrupt[16])(void) = {
  2353. -    bad_IRQ0_interrupt, bad_IRQ1_interrupt,
  2354. -    bad_IRQ2_interrupt, bad_IRQ3_interrupt,
  2355. -    bad_IRQ4_interrupt, bad_IRQ5_interrupt,
  2356. -    bad_IRQ6_interrupt, bad_IRQ7_interrupt,
  2357. -    bad_IRQ8_interrupt, bad_IRQ9_interrupt,
  2358. -    bad_IRQ10_interrupt, bad_IRQ11_interrupt,
  2359. -    bad_IRQ12_interrupt, bad_IRQ13_interrupt,
  2360. -    bad_IRQ14_interrupt, bad_IRQ15_interrupt
  2361. +    bad_IRQ0_interrupt, bad_IRQ1_interrupt,
  2362. +    bad_IRQ2_interrupt, bad_IRQ3_interrupt,
  2363. +    bad_IRQ4_interrupt, bad_IRQ5_interrupt,
  2364. +    bad_IRQ6_interrupt, bad_IRQ7_interrupt,
  2365. +    bad_IRQ8_interrupt, bad_IRQ9_interrupt,
  2366. +    bad_IRQ10_interrupt, bad_IRQ11_interrupt,
  2367. +    bad_IRQ12_interrupt, bad_IRQ13_interrupt,
  2368. +    bad_IRQ14_interrupt, bad_IRQ15_interrupt
  2369.  };
  2370.  
  2371.  struct irqaction {
  2372. -    void (*handler)(int, struct pt_regs *);
  2373. -    unsigned long flags;
  2374. -    unsigned long mask;
  2375. -    const char *name;
  2376. +    void (*handler)(int, struct pt_regs *);
  2377. +    unsigned long flags;
  2378. +    unsigned long mask;
  2379. +    const char *name;
  2380.  };
  2381.  
  2382.  /*
  2383.   * Initial irq handlers.
  2384.   */
  2385.  struct irqaction irq_action[32] = {
  2386. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2387. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2388. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2389. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2390. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2391. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2392. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2393. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2394. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2395. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2396. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2397. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2398. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2399. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2400. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2401. -    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL }
  2402. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2403. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2404. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2405. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2406. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2407. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2408. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2409. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2410. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2411. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2412. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2413. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2414. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2415. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2416. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL },
  2417. +    { NULL, 0, 0, NULL }, { NULL, 0, 0, NULL }
  2418.  };
  2419.  
  2420.  void (*irqjump[32])(void) =
  2421.  {
  2422. -  bad_IRQ0_interrupt , bad_IRQ1_interrupt , bad_IRQ2_interrupt , bad_IRQ3_interrupt ,
  2423. -  bad_IRQ4_interrupt , bad_IRQ5_interrupt , bad_IRQ6_interrupt , bad_IRQ7_interrupt ,
  2424. -  bad_IRQ8_interrupt , bad_IRQ9_interrupt , bad_IRQ10_interrupt, bad_IRQ11_interrupt,
  2425. -  bad_IRQ12_interrupt, bad_IRQ13_interrupt, bad_IRQ14_interrupt, bad_IRQ15_interrupt,
  2426. -  bad_IRQ    , bad_IRQ    , bad_IRQ    , bad_IRQ,
  2427. -  bad_IRQ    , bad_IRQ    , bad_IRQ    , bad_IRQ,
  2428. -  bad_IRQ    , bad_IRQ    , bad_IRQ    , bad_IRQ,
  2429. -  bad_IRQ    , bad_IRQ    , bad_IRQ    , bad_IRQ,
  2430. +    bad_IRQ0_interrupt , bad_IRQ1_interrupt , bad_IRQ2_interrupt , bad_IRQ3_interrupt ,
  2431. +    bad_IRQ4_interrupt , bad_IRQ5_interrupt , bad_IRQ6_interrupt , bad_IRQ7_interrupt ,
  2432. +    bad_IRQ8_interrupt , bad_IRQ9_interrupt , bad_IRQ10_interrupt, bad_IRQ11_interrupt,
  2433. +    bad_IRQ12_interrupt, bad_IRQ13_interrupt, bad_IRQ14_interrupt, bad_IRQ15_interrupt,
  2434. +    bad_IRQ    , bad_IRQ    , bad_IRQ    , bad_IRQ,
  2435. +    bad_IRQ    , bad_IRQ    , bad_IRQ    , bad_IRQ,
  2436. +    bad_IRQ    , bad_IRQ    , bad_IRQ    , bad_IRQ,
  2437. +    bad_IRQ    , bad_IRQ    , bad_IRQ    , bad_IRQ,
  2438.  };
  2439.  
  2440.  int get_irq_list(char *buf)
  2441.  {
  2442. -    int i, len = 0;
  2443. -    struct irqaction * action = irq_action;
  2444. +    int i, len = 0;
  2445. +    struct irqaction * action = irq_action;
  2446.  
  2447. -    for (i = 0 ; i < 32 ; i++, action++) {
  2448. -        if (!action->handler)
  2449. -            continue;
  2450. -        len += sprintf(buf+len, "%2d: %8d %c %s\n",
  2451. -            i, kstat.interrupts[i],
  2452. -            (action->flags & SA_INTERRUPT) ? '+' : ' ',
  2453. -            action->name);
  2454. -    }
  2455. -    return len;
  2456. +    for (i = 0 ; i < 32 ; i++, action++) {
  2457. +    if (!action->handler)
  2458. +        continue;
  2459. +    len += sprintf(buf+len, "%2d: %8d %c %s\n",
  2460. +        i, kstat.interrupts[i],
  2461. +        (action->flags & SA_INTERRUPT) ? '+' : ' ',
  2462. +        action->name);
  2463. +    }
  2464. +    return len;
  2465.  }
  2466.  
  2467.  /*
  2468. @@ -243,12 +242,12 @@
  2469.   */
  2470.  asmlinkage void do_IRQ(int irq, struct pt_regs * regs)
  2471.  {
  2472. -    struct irqaction * action = irq + irq_action;
  2473. +    struct irqaction * action = irq + irq_action;
  2474.  
  2475. -    kstat.interrupts[irq]++;
  2476. -    if (action->flags & SA_SAMPLE_RANDOM)
  2477. -        add_interrupt_randomness(irq);
  2478. -    action->handler(irq, regs);
  2479. +    kstat.interrupts[irq]++;
  2480. +    if (action->flags & SA_SAMPLE_RANDOM)
  2481. +    add_interrupt_randomness(irq);
  2482. +    action->handler(irq, regs);
  2483.  }
  2484.  
  2485.  /*
  2486. @@ -258,12 +257,12 @@
  2487.   */
  2488.  asmlinkage void do_fast_IRQ(int irq)
  2489.  {
  2490. -    struct irqaction * action = irq + irq_action;
  2491. +    struct irqaction * action = irq + irq_action;
  2492.  
  2493. -    kstat.interrupts[irq]++;
  2494. -    if (action->flags & SA_SAMPLE_RANDOM)
  2495. -        add_interrupt_randomness(irq);
  2496. -    action->handler(irq, NULL);
  2497. +    kstat.interrupts[irq]++;
  2498. +    if (action->flags & SA_SAMPLE_RANDOM)
  2499. +    add_interrupt_randomness(irq);
  2500. +    action->handler (irq, NULL);
  2501.  }
  2502.  
  2503.  #define SA_PROBE SA_ONESHOT
  2504. @@ -275,64 +274,62 @@
  2505.  int request_irq(unsigned int irq, void (*handler)(int, struct pt_regs *),
  2506.           unsigned long irq_flags, const char * devname)
  2507.  {
  2508. -    struct irqaction *action;
  2509. -    unsigned long flags;
  2510. +    struct irqaction *action;
  2511. +    unsigned long flags;
  2512.      
  2513. -    if (irq > 32)
  2514. -        return -EINVAL;
  2515. -    action = irq_action + irq;
  2516. -    if(action->handler)
  2517. -        return -EBUSY;
  2518. -    if(!handler)
  2519. -        return -EINVAL;
  2520. +    if (irq > 32)
  2521. +    return -EINVAL;
  2522. +    action = irq_action + irq;
  2523. +    if (action->handler)
  2524. +    return -EBUSY;
  2525. +    if (!handler)
  2526. +    return -EINVAL;
  2527.      
  2528. -    save_flags(flags);
  2529. -    cli();
  2530. -    action->handler = handler;
  2531. -    action->flags = irq_flags;
  2532. -    action->mask = 0;
  2533. -    action->name = devname;
  2534. -    if (!(action->flags & SA_PROBE)) { /* SA_ONESHOT is used by probing */
  2535. -        if (irq < 16) {
  2536. -            if (action->flags & SA_INTERRUPT)
  2537. -                irqjump[irq] = fast_interrupt[irq];
  2538. -            else
  2539. -                irqjump[irq] = interrupt[irq];
  2540. -        }
  2541. -        else
  2542. -            irqjump[irq] = (void (*)(void))handler;
  2543. -    }
  2544. -    enable_irq(irq);
  2545. -    restore_flags(flags);
  2546. -    return 0;
  2547. +    save_flags_cli (flags);
  2548. +
  2549. +    action->handler = handler;
  2550. +    action->flags = irq_flags;
  2551. +    action->mask = 0;
  2552. +    action->name = devname;
  2553. +    if (!(action->flags & SA_PROBE)) { /* SA_ONESHOT is used by probing */
  2554. +    if (irq < 16) {
  2555. +        if (action->flags & SA_INTERRUPT)
  2556. +        irqjump[irq] = fast_interrupt[irq];
  2557. +        else
  2558. +        irqjump[irq] = interrupt[irq];
  2559. +    } else
  2560. +        irqjump[irq] = (void (*)(void))handler;
  2561. +    }
  2562. +    enable_irq (irq);
  2563. +    restore_flags (flags);
  2564. +    return 0;
  2565.  }
  2566.  
  2567.  void free_irq(unsigned int irq)
  2568.  {
  2569. -    struct irqaction * action = irq + irq_action;
  2570. -    unsigned long flags;
  2571. +    struct irqaction * action = irq + irq_action;
  2572. +    unsigned long flags;
  2573.  
  2574. -    if (irq > 32) {
  2575. -        printk("Trying to free IRQ%d\n",irq);
  2576. -        return;
  2577. -    }
  2578. -    if (!action->handler) {
  2579. -        printk("Trying to free free IRQ%d\n",irq);
  2580. -        return;
  2581. -    }
  2582. -    save_flags(flags);
  2583. -    cli();
  2584. -
  2585. -    disable_irq(irq);
  2586. -    if(irq < 16)
  2587. -        irqjump[irq]=bad_interrupt[irq];
  2588. -    else
  2589. -        irqjump[irq]=bad_IRQ;
  2590. -    action->handler = NULL;
  2591. -    action->flags = 0;
  2592. -    action->mask = 0;
  2593. -    action->name = NULL;
  2594. -    restore_flags(flags);
  2595. +    if (irq > 32) {
  2596. +    printk ("Trying to free IRQ%d\n",irq);
  2597. +    return;
  2598. +    }
  2599. +    if (!action->handler) {
  2600. +    printk ("Trying to free free IRQ%d\n",irq);
  2601. +    return;
  2602. +    }
  2603. +    save_flags_cli (flags);
  2604. +    disable_irq (irq);
  2605. +
  2606. +    if (irq < 16)
  2607. +    irqjump[irq] = bad_interrupt[irq];
  2608. +    else
  2609. +    irqjump[irq] = bad_IRQ;
  2610. +    action->handler = NULL;
  2611. +    action->flags = 0;
  2612. +    action->mask = 0;
  2613. +    action->name = NULL;
  2614. +    restore_flags (flags);
  2615.  }
  2616.  
  2617.  /*
  2618. @@ -349,20 +346,19 @@
  2619.  
  2620.  unsigned long probe_irq_on (void)
  2621.  {
  2622. -    return 0;
  2623. +    return 0;
  2624.  }
  2625.  
  2626.  int probe_irq_off (unsigned long irqs)
  2627.  {
  2628. -    return 0;
  2629. +    return 0;
  2630.  }
  2631.  
  2632.  void init_IRQ(void)
  2633.  {
  2634. -    ioc[0x40]=LATCH & 255;
  2635. -    ioc[0x44]=LATCH>>8;
  2636. -    ioc[0x48]=0;
  2637. -    ioc[0x18]=0;
  2638. -    ioc[0x28]=0;
  2639. -    ioc[0x38]=0;
  2640. +    IOC_T0LTCHL = LATCH & 255;
  2641. +    IOC_T0LTCHH = LATCH >> 8;
  2642. +    IOC_T0GO = 0;
  2643. +
  2644. +    IOC_IRQMASKA = IOC_IRQMASKB = IOC_FIQMASK = 0;
  2645.  }
  2646. diff -urN linux.store/linux/arch/arm/kernel/oldlatches.c linux/arch/arm/kernel/oldlatches.c
  2647. --- linux.store/linux/arch/arm/kernel/oldlatches.c    Wed Mar 13 23:55:07 1996
  2648. +++ linux/arch/arm/kernel/oldlatches.c    Thu Mar 28 14:22:32 1996
  2649. @@ -7,7 +7,6 @@
  2650.  #include <linux/config.h>
  2651.  #include <linux/kernel.h>
  2652.  
  2653. -#include <asm/machdep.h>
  2654.  #include <asm/io.h>
  2655.  
  2656.  /* They are static so that everyone who accesses them has to go through here */
  2657. diff -urN linux.store/linux/arch/arm/kernel/process.c linux/arch/arm/kernel/process.c
  2658. --- linux.store/linux/arch/arm/kernel/process.c    Wed Mar 13 23:55:07 1996
  2659. +++ linux/arch/arm/kernel/process.c    Tue Mar 26 21:29:03 1996
  2660. @@ -72,7 +72,7 @@
  2661.       * and floppy drive accesses in RiscOS.
  2662.       */
  2663.      if ((arm_id & 0xfffffff0) == 0x41560300)
  2664. -    __asm__ __volatile__ ("mcr 15, 0, %0, c2, c0": : "r" (2));
  2665. +    __asm__ __volatile__ ("mcr 15, 0, %0, c2, c0": : "r" (2) : "cc");
  2666.  
  2667.      /* Copy branch instr to reset location & call it */
  2668.      *(unsigned long *)0 = *(unsigned long *)0x03800000;
  2669. diff -urN linux.store/linux/arch/arm/kernel/setup.c linux/arch/arm/kernel/setup.c
  2670. --- linux.store/linux/arch/arm/kernel/setup.c    Thu Mar 14 23:33:06 1996
  2671. +++ linux/arch/arm/kernel/setup.c    Fri Mar 22 22:49:09 1996
  2672. @@ -26,11 +26,8 @@
  2673.  
  2674.  #include <asm/segment.h>
  2675.  #include <asm/system.h>
  2676. -
  2677. -#define F_MEMC   (1<<0)
  2678. -#define F_MMU    (1<<1)
  2679. -#define F_32BIT  (1<<2)
  2680. -#define F_IOEB   (1<<31)
  2681. +#include <asm/assembler.h>
  2682. +#include <asm/hardware.h>
  2683.  
  2684.  struct drive_info_struct { char dummy[32]; } drive_info;
  2685.  
  2686. @@ -62,22 +59,23 @@
  2687.      unsigned long unused[256/4-11];
  2688.      char paths[8][128];
  2689.      char commandline[256];
  2690. -} *params = (struct param_struct *)0x0207C000;
  2691. +} *params = (struct param_struct *)PARAMS_BASE;
  2692.  
  2693. -struct armversions {
  2694. -    unsigned long id;
  2695. -    unsigned long mask;
  2696. -    unsigned long features;
  2697. -    unsigned long io_base;
  2698. -    const char *manu;
  2699. -    const char *name;
  2700. -} armidlist[] = {
  2701. -    { 0x41560200, 0xfffffff0, F_MEMC    , 0x03000000    , "ARM",    "arm2"        },
  2702. -    { 0x41560250, 0xfffffff0, F_MEMC    , 0x03000000    , "ARM",    "arm250"    },
  2703. -    { 0x41560300, 0xfffffff0, F_MEMC    , 0x03000000    , "ARM",    "arm3"        },
  2704. -    { 0x41560610, 0xfffffff0, F_MMU|F_32BIT    , 0        , "ARM",    "arm610"    },
  2705. -    { 0x44450000, 0xffff0000, F_MMU        , 0        , "DEC",    "SA-1"        },
  2706. -    { 0x00000000, 0x00000000, 0        , 0        , "***",    "*unknown*"    }
  2707. +struct armversions armidlist[] = {
  2708. +#ifdef __arm2__
  2709. +    { 0x41560200, 0xfffffff0, F_MEMC    , "ARM/VLSI",    "arm2"        },
  2710. +#endif
  2711. +#ifdef __arm3__
  2712. +    { 0x41560250, 0xfffffff0, F_MEMC    , "ARM/VLSI",    "arm250"    },
  2713. +    { 0x41560300, 0xfffffff0, F_MEMC|F_CACHE, "ARM/VLSI",    "arm3"        },
  2714. +#endif
  2715. +#ifdef __arm6__
  2716. +    { 0x41560610, 0xfffffff0, F_MMU|F_32BIT    , "ARM/VLSI",    "arm610"    },
  2717. +#endif
  2718. +#ifdef __sa110__
  2719. +    { 0x44010000, 0xffff0000, F_MMU        , "DEC",    "SA-110"    },
  2720. +#endif
  2721. +    { 0x00000000, 0x00000000, 0        , "***",    "*unknown*"    }
  2722.  };
  2723.  
  2724.  #define ISSET(bit) (armidlist[armidindex].features & bit)
  2725. @@ -85,18 +83,16 @@
  2726.  #define COMMAND_LINE_SIZE 256
  2727.  static char command_line[COMMAND_LINE_SIZE] = { 0, };
  2728.  
  2729. -unsigned char aux_device_present;
  2730. -unsigned char *ioc;
  2731. -unsigned long io_base;
  2732.  unsigned long arm_id;
  2733.  int armidindex;
  2734.  int ioebpresent;
  2735.  int memc_ctrl_reg;
  2736. +int number_ide_drives;
  2737. +int number_mfm_drives;
  2738.  
  2739.  extern int bytes_per_char_h;
  2740.  extern int bytes_per_char_v;
  2741.  extern char arc_hd_files[8][128];
  2742. -extern int no_hds;
  2743.  extern int ramdisk_size;
  2744.  extern int root_mountflags;
  2745.  extern int _etext, _edata, _end;
  2746. @@ -104,7 +100,7 @@
  2747.  
  2748.  static void check_ioeb_present(void)
  2749.  {
  2750. -    if (((*(unsigned char *)(io_base + 0x350050)) & 15) == 5)
  2751. +    if (((*IOEB_BASE) & 15) == 5)
  2752.          armidlist[armidindex].features |= F_IOEB;
  2753.  }
  2754.  
  2755. @@ -123,53 +119,30 @@
  2756.          armidindex += 1;
  2757.      }
  2758.  
  2759. -#ifndef __arm6__
  2760. -    if (!(armidlist[armidindex].features & F_MEMC)) {
  2761. -        *(unsigned long *)0x02000000 = 0x11111111;
  2762. +    if (armidlist[armidindex].id == 0) {
  2763. +        for (i = 0; i < 3200; i++)
  2764. +            ((unsigned long *)SCREEN_BASE)[i] = 0x77113322;
  2765.          while (1);
  2766.      }
  2767. -#else
  2768. -    if (!(armidlist[armidindex].features & F_MMU)) {
  2769. -        *(unsigned long *)0x02000000 = 0x22222222;
  2770. -        while (1);
  2771. -    }
  2772. -#endif
  2773. -
  2774. -    io_base = armidlist[armidindex].io_base;
  2775. -    ioc = (unsigned char *)(io_base + 0x200000);
  2776.  
  2777.      check_ioeb_present();
  2778. +    cache_setup (armidlist[armidindex].features);
  2779. +    memory_start = GET_MEMORY_START;
  2780.  
  2781. -    if ((arm_id & 0x0000fff0) == 0x300) {
  2782. -        __asm__ __volatile__("
  2783. -        mcr    15, 0, %0, c3, c0
  2784. -        mcr    15, 0, %1, c4, c0
  2785. -        mcr    15, 0, %2, c5, c0
  2786. -        mcr    15, 0, %3, c1, c0
  2787. -        mcr    15, 0, %3, c2, c0
  2788. -        " : : "r" (0x000e7fff), "r" (0x000e7fff), "r" (0xf0000000), "r" (3));
  2789. -    } else {
  2790. -        /* ok, so this is a bit dirty... Self modifing code! */
  2791. -        extern unsigned long *arm3_flushcache;
  2792. -        arm3_flushcache[0] = arm3_flushcache[1];
  2793. -    }
  2794. -
  2795. -    memory_start = (unsigned long)&_end - 0x01800000+0x02080000;
  2796. +    bytes_per_char_h  = params->bytes_per_char_h;
  2797. +    bytes_per_char_v  = params->bytes_per_char_v;
  2798. +    from          = params->commandline;
  2799. +    ROOT_DEV      = params->rootdev;
  2800. +    ORIG_X          = params->video_x;
  2801. +    ORIG_Y          = params->video_y;
  2802. +    ORIG_VIDEO_COLS      = params->video_num_cols;
  2803. +    ORIG_VIDEO_LINES  = params->video_num_rows;
  2804. +    memc_ctrl_reg      = params->memc_control_reg;
  2805. +    number_ide_drives = (params->adfsdrives >> 6) & 3;
  2806. +    number_mfm_drives = (params->adfsdrives >> 4) & 3;
  2807. +    ramdisk_size      = params->ramdisk_size;
  2808.  
  2809. -    bytes_per_char_h = params->bytes_per_char_h;
  2810. -    bytes_per_char_v = params->bytes_per_char_v;
  2811. -    from = params->commandline;
  2812. -    ROOT_DEV = params->rootdev;
  2813. -    ORIG_X = params->video_x;
  2814. -    ORIG_Y = params->video_y;
  2815. -    ORIG_VIDEO_COLS = params->video_num_cols;
  2816. -    ORIG_VIDEO_LINES = params->video_num_rows;
  2817. -    memc_ctrl_reg = params->memc_control_reg;
  2818. -    no_hds = (params->adfsdrives >> 6) & 3;
  2819. -
  2820. -    aux_device_present = 0;
  2821. -    memory_end = 0x02000000 + params->page_size * params->nr_pages;
  2822. -    ramdisk_size = params->ramdisk_size;
  2823. +    memory_end = GET_MEMORY_END(params->page_size, params->nr_pages);
  2824.  
  2825.      if (params->mountrootrdonly)
  2826.          root_mountflags |= MS_RDONLY;
  2827. @@ -178,9 +151,9 @@
  2828.          strcpy(arc_hd_files[i], params->paths[i]);
  2829.  
  2830.      init_task.mm->start_code = TASK_SIZE;
  2831. -    init_task.mm->end_code = TASK_SIZE + (unsigned long) &_etext;
  2832. -    init_task.mm->end_data = TASK_SIZE + (unsigned long) &_edata;
  2833. -    init_task.mm->brk = TASK_SIZE + (unsigned long) &_end;
  2834. +    init_task.mm->end_code     = TASK_SIZE + (unsigned long) &_etext;
  2835. +    init_task.mm->end_data     = TASK_SIZE + (unsigned long) &_edata;
  2836. +    init_task.mm->brk     = TASK_SIZE + (unsigned long) &_end;
  2837.  
  2838.      for (;;) {
  2839.          if (c == ' ' && *(unsigned long *)from == *(unsigned long *)"mem=") {
  2840. @@ -192,7 +165,7 @@
  2841.                  memory_end = memory_end << 20;
  2842.                  from++;
  2843.              }
  2844. -            memory_end = memory_end + 0x02000000;
  2845. +            memory_end = memory_end + GET_MEMORY_PHYSICAL;
  2846.          }
  2847.          c = *(from++);
  2848.          if (!c)
  2849. diff -urN linux.store/linux/arch/arm/lib/Makefile linux/arch/arm/lib/Makefile
  2850. --- linux.store/linux/arch/arm/lib/Makefile    Wed Mar 13 23:55:07 1996
  2851. +++ linux/arch/arm/lib/Makefile    Thu Mar 28 14:38:21 1996
  2852. @@ -7,11 +7,18 @@
  2853.  O_TARGET := lib.o
  2854.  O_OBJS   := backtrace.o bitops.o delay.o irqs.o \
  2855.      ll_char_wr.o io.o segment.o system.o traps.o ioc.o \
  2856. -    calls.o prints.o memfastset.o fp_support.o string.o \
  2857. -    floppydma.o
  2858. +    calls.o prints.o memfastset.o fp_support.o string.o
  2859.  
  2860. -ifdef CONFIG_BLK_DEV_FD1772
  2861. -O_OBJS += fd1772.o
  2862. +ifeq ($(MACHINE),a5k)
  2863. +    FLOPPY = floppydma.o
  2864. +endif
  2865. +
  2866. +ifeq ($(MACHINE),arc)
  2867. +    FLOPPY = fd1772.o
  2868. +endif
  2869. +
  2870. +ifdef CONFIG_BLK_DEV_FD
  2871. +O_OBJS += $(FLOPPY)
  2872.  endif
  2873.  
  2874.  ifdef CONFIG_BLK_DEV_XD
  2875. @@ -32,8 +39,8 @@
  2876.      ./getconstants > constants.h
  2877.  
  2878.  getconstants: getconstants.c
  2879. -    gcc -o getconstants getconstants.c -O2 -D__KERNEL__ -fomit-frame-pointer -Wl,-N
  2880. +    $(HOSTCC) -D__KERNEL__ -o getconstants getconstants.c
  2881.  
  2882.  irqs.s:    irqs.S
  2883. -    gcc -E $^ | tr ";" "\n" > $@
  2884. +    $(CPP) $^ | tr ";" "\n" > $@
  2885.  
  2886. diff -urN linux.store/linux/arch/arm/lib/backtrace.S linux/arch/arm/lib/backtrace.S
  2887. --- linux.store/linux/arch/arm/lib/backtrace.S    Sun Mar  3 13:09:12 1996
  2888. +++ linux/arch/arm/lib/backtrace.S    Thu Mar 28 10:32:30 1996
  2889. @@ -19,8 +19,8 @@
  2890.          teq    fp, #0
  2891.          moveq    r0, #-2
  2892.          LOADREGS(eqfd, sp!, {r4 - r12, pc})
  2893. -loop:        tst    fp, #0xFC000003
  2894. -        bne    loop
  2895. +Lloop:        tst    fp, #0xFC000003
  2896. +        bne    Lloop
  2897.          ldr    r1, [fp, #0]
  2898.          sub    r1, r1, #12
  2899.          ldr    r2, [fp, #-4]
  2900. @@ -29,12 +29,12 @@
  2901.          ldr    fp, [fp, #-12]
  2902.          teq    r0, fp
  2903.          moveq    fp, #0
  2904. -        adr    r0, message
  2905. +        adr    r0, Lmessage
  2906.           bl    _printk
  2907.          teq    fp, #0
  2908. -        bne    loop
  2909. +        bne    Lloop
  2910.          LOADREGS(fd, sp!, {r4 - r12, pc})
  2911.  
  2912. -message:    .ascii    "Func: entered at %p, link %p, sp %p\n"
  2913. +Lmessage:    .ascii    "Func: entered at %p, link %p, sp %p\n"
  2914.          .byte 0
  2915.          .align
  2916. diff -urN linux.store/linux/arch/arm/lib/bitops.S linux/arch/arm/lib/bitops.S
  2917. --- linux.store/linux/arch/arm/lib/bitops.S    Sun Mar  3 13:09:39 1996
  2918. +++ linux/arch/arm/lib/bitops.S    Thu Mar 28 10:11:59 1996
  2919. @@ -75,15 +75,15 @@
  2920.          .global    _find_first_zero_bit
  2921.  _find_first_zero_bit:
  2922.          mov    r2, #0            @ Initialise bit position
  2923. -findzbit1lp:    ldrb    r3, [r0, r2, lsr #3]    @ Check byte, if 0xFF, then all bits set
  2924. +Lfindzbit1lp:    ldrb    r3, [r0, r2, lsr #3]    @ Check byte, if 0xFF, then all bits set
  2925.          teq    r3, #0xFF
  2926. -        bne    foundzbit
  2927. +        bne    Lfoundzbit
  2928.          add    r2, r2, #8
  2929.          cmp    r2, r1            @ Check to see if we have come to the end
  2930. -        bcc    findzbit1lp
  2931. +        bcc    Lfindzbit1lp
  2932.          add    r0, r1, #1        @ Make sure that we flag an error
  2933.          RETINSTR(mov,pc,lr)
  2934. -foundzbit:    tst    r3, #1            @ Check individual bits
  2935. +Lfoundzbit:    tst    r3, #1            @ Check individual bits
  2936.          moveq    r0, r2
  2937.          RETINSTR(moveq,pc,lr)
  2938.          tst    r3, #2
  2939. @@ -114,7 +114,7 @@
  2940.  _find_next_zero_bit:
  2941.          add    r2, r2, #1        @ Increment bit position
  2942.          tst    r2, #7
  2943. -        beq    findzbit1lp        @ If new byte, goto old routine
  2944. +        beq    Lfindzbit1lp        @ If new byte, goto old routine
  2945.          ldrb    r3, [r0, r2, lsr#3]
  2946.          orr    r3, r3, #0xFF00        @ Set top bits so we wont get confused
  2947.          stmfd    sp!, {r4}
  2948. @@ -125,5 +125,5 @@
  2949.          teq    r3, #0xFF
  2950.          orreq    r2, r2, #7
  2951.          addeq    r2, r2, #1
  2952. -        beq    findzbit1lp        @ If all bits are set, goto old routine
  2953. -        b    foundzbit
  2954. +        beq    Lfindzbit1lp        @ If all bits are set, goto old routine
  2955. +        b    Lfoundzbit
  2956. diff -urN linux.store/linux/arch/arm/lib/constants.h linux/arch/arm/lib/constants.h
  2957. --- linux.store/linux/arch/arm/lib/constants.h    Thu Jan  1 01:00:00 1970
  2958. +++ linux/arch/arm/lib/constants.h    Thu Mar 14 08:26:41 1996
  2959. @@ -0,0 +1,20 @@
  2960. +/*
  2961. + *  contants.h generated by getconstants
  2962. + * DO NOT EDIT!
  2963. + */
  2964. +#define _current    _current_set
  2965. +#define PAGE_PRESENT    1
  2966. +#define PAGE_RW    2
  2967. +#define PAGE_USER    4
  2968. +#define PAGE_ACCESSED    32
  2969. +#define PAGE_DIRTY    64
  2970. +#define TSK_MM    744
  2971. +#define MM_PGDIR    4
  2972. +#define TSS_UREGS    512
  2973. +#define TSS_SREGS    532
  2974. +#define TSS_FPESAVE    576
  2975. +#define SYS_execve    9437195
  2976. +#define SYS_sigreturn    9437303
  2977. +#define KSWI_BASE    0x900000
  2978. +#define KSWI_SYS_BASE    0x9F0000
  2979. +#define SYS_ERROR0    0x9F0000
  2980. diff -urN linux.store/linux/arch/arm/lib/fd1772.S linux/arch/arm/lib/fd1772.S
  2981. --- linux.store/linux/arch/arm/lib/fd1772.S    Wed Mar 13 23:55:08 1996
  2982. +++ linux/arch/arm/lib/fd1772.S    Fri Mar 22 22:05:27 1996
  2983. @@ -1,3 +1,5 @@
  2984. +#include <asm/hardware.h>
  2985. +
  2986.  @ Code for DMA with the 1772 fdc
  2987.  .text
  2988.  
  2989. @@ -22,11 +24,11 @@
  2990.  @ We hang this off DMA channel 1
  2991.      .global _fdc1772_comendhandler
  2992.  _fdc1772_comendhandler:
  2993. -  mov      r8,#0x3200000
  2994. +  mov      r8,#IOC_BASE
  2995.    ldrb     r9,[r8,#0x34]    @ IOC FIQ status
  2996.    tst      r9,#2
  2997.    subeqs   pc,r14,#4
  2998. -  mov      r9,#0x3200000
  2999. +  mov      r9,#IOC_BASE
  3000.    orr      r9,r9,#0x10000   @ FDC base
  3001.    adr      r8,_fdc1772_fdc_int_done
  3002.    ldrb     r10,[r9,#0]  @ FDC status
  3003. @@ -37,7 +39,7 @@
  3004.  
  3005.      .global _fdc1772_dma_read
  3006.  _fdc1772_dma_read:
  3007. -  mov      r8,#0x3200000
  3008. +  mov      r8,#IOC_BASE
  3009.    ldrb     r9,[r8,#0x34]    @ IOC FIQ status
  3010.    tst      r9,#1
  3011.    beq      _fdc1772_dma_read_notours
  3012. @@ -58,7 +60,7 @@
  3013.  
  3014.      .global _fdc1772_dma_write
  3015.  _fdc1772_dma_write:
  3016. -  mov      r8,#0x3200000
  3017. +  mov      r8,#IOC_BASE
  3018.    ldrb     r9,[r8,#0x34]    @ IOC FIQ status
  3019.    tst      r9,#1
  3020.    beq      _fdc1772_dma_write_notours
  3021. Binary files linux.store/linux/arch/arm/lib/getconstants and linux/arch/arm/lib/getconstants differ
  3022. diff -urN linux.store/linux/arch/arm/lib/io.S linux/arch/arm/lib/io.S
  3023. --- linux.store/linux/arch/arm/lib/io.S    Wed Mar 13 23:55:08 1996
  3024. +++ linux/arch/arm/lib/io.S    Thu Mar 28 10:11:19 1996
  3025. @@ -100,9 +100,9 @@
  3026.          orrlt    r3, r3, #0x00010000
  3027.          add    r0, r3, r0, lsl #2
  3028.          tst    r1, #3
  3029. -        beq    pcinswok
  3030. +        beq    Linswok
  3031.          tst    r1, #1
  3032. -        bne    pcinsw_notaligned
  3033. +        bne    Linsw_notaligned
  3034.          cmp    r2, #1
  3035.          ldrge    r4, [r0]
  3036.          strgeb    r4, [r1], #1
  3037. @@ -110,10 +110,10 @@
  3038.          strgtb    r4, [r1], #1
  3039.          ldmleea    fp, {r4 - r10, fp, sp, pc}^
  3040.          sub    r2, r2, #2
  3041. -pcinswok:    mov    ip, #0xFF
  3042. +Linswok:    mov    ip, #0xFF
  3043.          orr    ip, ip, ip, lsl #8
  3044. -pcinswlp:    subs    r2, r2, #64
  3045. -        bmi    pcinsw_toosmall
  3046. +Linswlp:    subs    r2, r2, #64
  3047. +        bmi    Linsw_toosmall
  3048.          IN(r3)
  3049.          IN(r4)
  3050.          IN(r5)
  3051. @@ -132,12 +132,12 @@
  3052.          IN(r9)
  3053.          IN(r10)
  3054.          stmia    r1!, {r3 - r10}
  3055. -        bne    pcinswlp
  3056. +        bne    Linswlp
  3057.          LOADREGS(ea, fp, {r4 - r10, fp, sp, pc})
  3058. -pcinsw_toosmall:
  3059. +Linsw_toosmall:
  3060.          add    r2, r2, #32
  3061. -        bmi    pcinsw_toosmall2
  3062. -pcinsw2lp:    IN(r3)
  3063. +        bmi    Linsw_toosmall2
  3064. +Linsw2lp:    IN(r3)
  3065.          IN(r4)
  3066.          IN(r5)
  3067.          IN(r6)
  3068. @@ -147,10 +147,10 @@
  3069.          IN(r10)
  3070.          stmia    r1!, {r3 - r10}
  3071.          LOADREGS(eqea, fp, {r4 - r10, fp, sp, pc})
  3072. -        b    pcinsw_notaligned
  3073. -pcinsw_toosmall2:
  3074. +        b    Linsw_notaligned
  3075. +Linsw_toosmall2:
  3076.          add    r2, r2, #32
  3077. -pcinsw_notaligned:
  3078. +Linsw_notaligned:
  3079.          cmp    r2, #1
  3080.          LOADREGS(ltea, fp, {r4 - r10, fp, sp, pc})
  3081.          ldr    r4, [r0]
  3082. @@ -158,7 +158,7 @@
  3083.          movgt    r4, r4, LSR#8
  3084.          strgtb    r4, [r1], #1
  3085.          subs    r2, r2, #2
  3086. -        bgt    pcinsw_notaligned
  3087. +        bgt    Linsw_notaligned
  3088.          LOADREGS(ea, fp, {r4 - r10, fp, sp, pc})
  3089.  
  3090.  @ Purpose: write a block of data from memory to a hardware register.
  3091. @@ -177,7 +177,7 @@
  3092.          movlt    r3, #0x03000000
  3093.          orrlt    r3, r3, #0x00010000
  3094.          tst    r1, #2
  3095. -        beq    pcoutsw32lp
  3096. +        beq    Loutsw32lp
  3097.          ldr    r4, [r1], #2
  3098.          mov    r4, r4, lsl #16
  3099.          orr    r4, r4, r4, lsr #16
  3100. @@ -185,8 +185,8 @@
  3101.          sub    r2, r2, #2
  3102.          teq    r2, #0
  3103.          LOADREGS(eqea, fp, {r4 - r8, fp, sp, pc})
  3104. -pcoutsw32lp:    subs    r2,r2,#32
  3105. -        blt    pcoutsw_toosmall
  3106. +Loutsw32lp:    subs    r2,r2,#32
  3107. +        blt    Loutsw_toosmall
  3108.          ldmia    r1!,{r4,r5,r6,r7}
  3109.          OUT(r4)
  3110.          OUT(r5)
  3111. @@ -198,16 +198,16 @@
  3112.          OUT(r6)
  3113.          OUT(r7)
  3114.          LOADREGS(eqea, fp, {r4 - r8, fp, sp, pc})
  3115. -        b    pcoutsw32lp
  3116. -pcoutsw_toosmall:
  3117. +        b    Loutsw32lp
  3118. +Loutsw_toosmall:
  3119.          adds    r2,r2,#32
  3120.          LOADREGS(eqea, fp, {r4 - r8, fp, sp, pc})
  3121. -lpx:        ldr    r4,[r1],#2
  3122. +Llpx:        ldr    r4,[r1],#2
  3123.          mov    r4,r4,LSL#16
  3124.          orr    r4,r4,r4,LSR#16
  3125.          str    r4,[r3,r0,LSL#2]
  3126.          subs    r2,r2,#2
  3127. -        bgt    lpx
  3128. +        bgt    Llpx
  3129.          LOADREGS(ea, fp, {r4 - r8, fp, sp, pc})
  3130.  
  3131.  @ Purpose: write a vidc register.
  3132. diff -urN linux.store/linux/arch/arm/lib/iputils.S linux/arch/arm/lib/iputils.S
  3133. --- linux.store/linux/arch/arm/lib/iputils.S    Sun Mar  3 13:14:06 1996
  3134. +++ linux/arch/arm/lib/iputils.S    Thu Mar 28 10:15:10 1996
  3135. @@ -11,19 +11,19 @@
  3136.  @ r2 = sum
  3137.          .global    _csum_partial
  3138.  _csum_partial:    tst    r0, #2
  3139. -        beq    alignok
  3140. +        beq    Lalignok
  3141.          subs    r1, r1, #2
  3142.          addmi    r1, r1, #2
  3143. -        bmi    nobits32
  3144. +        bmi    Lnobits32
  3145.          bic    r0, r0, #3
  3146.          ldr    r3, [r0], #4
  3147.          adds    r2, r2, r3, lsr #16
  3148.          adcs    r2, r2, #0
  3149. -alignok:    adds    r2, r2, #0
  3150. +Lalignok:    adds    r2, r2, #0
  3151.          bics    ip, r1, #31
  3152. -        beq    nolots32
  3153. +        beq    Lnolots32
  3154.          stmfd    sp!, {r4 - r10}
  3155. -lp32:        ldmia    r0!, {r3 - r10}
  3156. +Llp32:        ldmia    r0!, {r3 - r10}
  3157.          adcs    r2, r2, r3
  3158.          adcs    r2, r2, r4
  3159.          adcs    r2, r2, r5
  3160. @@ -34,18 +34,18 @@
  3161.          adcs    r2, r2, r10
  3162.          sub    ip, ip, #32
  3163.          teq    ip, #0
  3164. -        bne    lp32
  3165. +        bne    Llp32
  3166.          adcs    r2, r2, #0
  3167.          ldmfd    sp!, {r4 - r10}
  3168. -nolots32:    ands    ip, r1, #0x1c
  3169. -        beq    nobits32
  3170. -bits32lp:    ldr    r3, [r0], #4
  3171. +Lnolots32:    ands    ip, r1, #0x1c
  3172. +        beq    Lnobits32
  3173. +Lbits32lp:    ldr    r3, [r0], #4
  3174.          adcs    r2, r2, r3
  3175.          sub    ip, ip, #4
  3176.          teq    ip, #0
  3177. -        bne    bits32lp
  3178. +        bne    Lbits32lp
  3179.          adcs    r2, r2, #0
  3180. -nobits32:    ands    ip, r1, #3
  3181. +Lnobits32:    ands    ip, r1, #3
  3182.          moveq    r0, r2
  3183.          moveqs    pc, lr
  3184.          mov    ip, ip, lsl #3
  3185. @@ -66,10 +66,10 @@
  3186.          stmfd    sp!, {r4 - r10, fp, ip, lr, pc}
  3187.          sub    fp, ip, #4
  3188.          tst    r1, #2            @ Test destination alignment
  3189. -        beq    dst_aligned
  3190. +        beq    Ldst_aligned
  3191.          subs    r2, r2, #2
  3192.          addmi    r2, r2, #2
  3193. -        bmi    nobits32_b
  3194. +        bmi    Lnobits32_b
  3195.          ldrt    r4, [r0], #2
  3196.          mov    r5, r4, lsl #16
  3197.          adds    r3, r3, r5, lsr #16
  3198. @@ -77,12 +77,12 @@
  3199.          strb    r4, [r1], #1
  3200.          mov    r4, r4, lsr #8
  3201.          strb    r4, [r1], #1        @ Destination now aligned
  3202. -dst_aligned:    tst    r0, #2
  3203. -        bne    src_not_aligned
  3204. +Ldst_aligned:    tst    r0, #2
  3205. +        bne    Lsrc_not_aligned
  3206.          adds    r3, r3, #0
  3207.          bics    ip, r2, #31        @ Routine for src & dst aligned
  3208. -        beq    nolots32_ba
  3209. -lp32_ba:    ldrt    r4, [r0], #4
  3210. +        beq    Lnolots32_ba
  3211. +Llp32_ba:    ldrt    r4, [r0], #4
  3212.          ldrt    r5, [r0], #4
  3213.          ldrt    r6, [r0], #4
  3214.          ldrt    r7, [r0], #4
  3215. @@ -108,20 +108,20 @@
  3216.          adcs    r3, r3, r7
  3217.          sub    ip, ip, #32
  3218.          teq    ip, #0
  3219. -        bne    lp32_ba
  3220. +        bne    Llp32_ba
  3221.          adcs    r3, r3, #0
  3222. -nolots32_ba:    ands    ip, r2, #0x1c
  3223. -        beq    nobits32_ba
  3224. -bits32lp_ba:    ldrt    r4, [r0], #4
  3225. +Lnolots32_ba:    ands    ip, r2, #0x1c
  3226. +        beq    Lnobits32_ba
  3227. +Lbits32lp_ba:    ldrt    r4, [r0], #4
  3228.          str    r4, [r1], #4
  3229.          adcs    r3, r3, r4
  3230.          sub    ip, ip, #4
  3231.          teq    ip, #0
  3232. -        bne    bits32lp_ba
  3233. +        bne    Lbits32lp_ba
  3234.          adcs    r3, r3, #0
  3235. -nobits32_ba:    ands    ip, r2, #3
  3236. +Lnobits32_ba:    ands    ip, r2, #3
  3237.          moveq    r0, r3
  3238. -        beq    alldone_ba
  3239. +        beq    Lalldone_ba
  3240.          mov    r5, ip, lsl #3
  3241.          rsb    r5, r5, #32
  3242.          ldr    r4, [r0]
  3243. @@ -136,16 +136,16 @@
  3244.          teq    ip, #3
  3245.          moveq    r4, r4, lsr #8
  3246.          streqb    r4, [r1], #1
  3247. -alldone_ba:    ldmea    fp, {r4 - r10, fp, sp, pc}^
  3248. +Lalldone_ba:    ldmea    fp, {r4 - r10, fp, sp, pc}^
  3249.  
  3250. -src_not_aligned:
  3251. +Lsrc_not_aligned:
  3252.          cmp    r2, #4
  3253.          bic    r0, r0, #3
  3254.          ldrcst    r4, [r0], #4
  3255.          adds    r3, r3, #0
  3256.          bics    ip, r2, #31
  3257. -        beq    notlots32_b
  3258. -lp32_b:        ldrt    r5, [r0], #4
  3259. +        beq    Lnotlots32_b
  3260. +Llp32_b:    ldrt    r5, [r0], #4
  3261.          ldrt    r6, [r0], #4
  3262.          ldrt    r7, [r0], #4
  3263.          ldrt    r8, [r0], #4
  3264. @@ -183,11 +183,11 @@
  3265.          mov    r4, r8
  3266.          sub    ip, ip, #32
  3267.          teq    ip, #0
  3268. -        bne    lp32_b
  3269. +        bne    Llp32_b
  3270.          adcs    r3, r3, #0
  3271. -notlots32_b:    ands    ip, r2, #0x1c
  3272. -        beq    nobits32_b
  3273. -bits32lp_b:    ldrt    r5, [r0], #4
  3274. +Lnotlots32_b:    ands    ip, r2, #0x1c
  3275. +        beq    Lnobits32_b
  3276. +Lbits32lp_b:    ldrt    r5, [r0], #4
  3277.          mov    r4, r4, lsr #16
  3278.          orr    r4, r4, r5, lsl #16
  3279.          str    r4, [r1], #4
  3280. @@ -195,11 +195,11 @@
  3281.          mov    r4, r5
  3282.          sub    ip, ip, #4
  3283.          teq    ip, #0
  3284. -        bne    bits32lp_b
  3285. +        bne    Lbits32lp_b
  3286.          adc    r3, r3, #0
  3287. -nobits32_b:    ands    ip, r2, #3
  3288. +Lnobits32_b:    ands    ip, r2, #3
  3289.          moveq    r0, r3
  3290. -        beq    alldone_b
  3291. +        beq    Lalldone_b
  3292.          ldrt    r5, [r0], #4
  3293.          mov    r4, r4, lsr #16
  3294.          orr    r4, r4, r5, lsl #16
  3295. @@ -216,7 +216,7 @@
  3296.          teq    ip, #3
  3297.          moveq    r4, r4, lsr #8
  3298.          streqb    r4, [r1], #1
  3299. -alldone_b:    ldmea    fp, {r4 - r10, fp, sp, pc}^
  3300. +Lalldone_b:    ldmea    fp, {r4 - r10, fp, sp, pc}^
  3301.  
  3302.  
  3303.  @ r0 = src
  3304. @@ -229,10 +229,10 @@
  3305.          stmfd    sp!, {r4 - r10, fp, ip, lr, pc}
  3306.          sub    fp, ip, #4
  3307.          tst    r1, #2            @ Test destination alignment
  3308. -        beq    dst_aligned_2
  3309. +        beq    Ldst_aligned_2
  3310.          subs    r2, r2, #2
  3311.          addmi    r2, r2, #2
  3312. -        bmi    nobits32_b_2
  3313. +        bmi    Lnobits32_b_2
  3314.          ldr    r4, [r0], #2
  3315.          mov    r5, r4, lsl #16
  3316.          adds    r3, r3, r5, lsr #16
  3317. @@ -240,12 +240,12 @@
  3318.          strb    r4, [r1], #1
  3319.          mov    r4, r4, lsr #8
  3320.          strb    r4, [r1], #1        @ Destination now aligned
  3321. -dst_aligned_2:    tst    r0, #2
  3322. -        bne    src_not_aligned_2
  3323. +Ldst_aligned_2:    tst    r0, #2
  3324. +        bne    Lsrc_not_aligned_2
  3325.          adds    r3, r3, #0
  3326.          bics    ip, r2, #31        @ Routine for src & dst aligned
  3327. -        beq    nolots32_ba_2
  3328. -lp32_ba_2:    ldr    r4, [r0], #4
  3329. +        beq    Lnolots32_ba_2
  3330. +Llp32_ba_2:    ldr    r4, [r0], #4
  3331.          ldr    r5, [r0], #4
  3332.          ldr    r6, [r0], #4
  3333.          ldr    r7, [r0], #4
  3334. @@ -271,20 +271,20 @@
  3335.          adcs    r3, r3, r7
  3336.          sub    ip, ip, #32
  3337.          teq    ip, #0
  3338. -        bne    lp32_ba_2
  3339. +        bne    Llp32_ba_2
  3340.          adcs    r3, r3, #0
  3341. -nolots32_ba_2:    ands    ip, r2, #0x1c
  3342. -        beq    nobits32_ba_2
  3343. -bits32lp_ba_2:    ldr    r4, [r0], #4
  3344. +Lnolots32_ba_2:    ands    ip, r2, #0x1c
  3345. +        beq    Lnobits32_ba_2
  3346. +Lbits32lp_ba_2:    ldr    r4, [r0], #4
  3347.          str    r4, [r1], #4
  3348.          adcs    r3, r3, r4
  3349.          sub    ip, ip, #4
  3350.          teq    ip, #0
  3351. -        bne    bits32lp_ba_2
  3352. +        bne    Lbits32lp_ba_2
  3353.          adcs    r3, r3, #0
  3354. -nobits32_ba_2:    ands    ip, r2, #3
  3355. +Lnobits32_ba_2:    ands    ip, r2, #3
  3356.          moveq    r0, r3
  3357. -        beq    alldone_ba_2
  3358. +        beq    Lalldone_ba_2
  3359.          mov    r5, ip, lsl #3
  3360.          rsb    r5, r5, #32
  3361.          ldr    r4, [r0]
  3362. @@ -299,16 +299,16 @@
  3363.          teq    ip, #3
  3364.          moveq    r4, r4, lsr #8
  3365.          streqb    r4, [r1], #1
  3366. -alldone_ba_2:    ldmea    fp, {r4 - r10, fp, sp, pc}^
  3367. +Lalldone_ba_2:    ldmea    fp, {r4 - r10, fp, sp, pc}^
  3368.  
  3369. -src_not_aligned_2:
  3370. +Lsrc_not_aligned_2:
  3371.          cmp    r2, #4
  3372.          bic    r0, r0, #3
  3373.          ldrcs    r4, [r0], #4
  3374.          adds    r3, r3, #0
  3375.          bics    ip, r2, #31
  3376. -        beq    notlots32_b_2
  3377. -lp32_b_2:    ldr    r5, [r0], #4
  3378. +        beq    Lnotlots32_b_2
  3379. +Llp32_b_2:    ldr    r5, [r0], #4
  3380.          ldr    r6, [r0], #4
  3381.          ldr    r7, [r0], #4
  3382.          ldr    r8, [r0], #4
  3383. @@ -346,11 +346,11 @@
  3384.          mov    r4, r8
  3385.          sub    ip, ip, #32
  3386.          teq    ip, #0
  3387. -        bne    lp32_b_2
  3388. +        bne    Llp32_b_2
  3389.          adcs    r3, r3, #0
  3390. -notlots32_b_2:    ands    ip, r2, #0x1c
  3391. -        beq    nobits32_b_2
  3392. -bits32lp_b_2:    ldr    r5, [r0], #4
  3393. +Lnotlots32_b_2:    ands    ip, r2, #0x1c
  3394. +        beq    Lnobits32_b_2
  3395. +Lbits32lp_b_2:    ldr    r5, [r0], #4
  3396.          mov    r4, r4, lsr #16
  3397.          orr    r4, r4, r5, lsl #16
  3398.          str    r4, [r1], #4
  3399. @@ -358,11 +358,11 @@
  3400.          mov    r4, r5
  3401.          sub    ip, ip, #4
  3402.          teq    ip, #0
  3403. -        bne    bits32lp_b_2
  3404. +        bne    Lbits32lp_b_2
  3405.          adcs    r3, r3, #0
  3406. -nobits32_b_2:    ands    ip, r2, #3
  3407. +Lnobits32_b_2:    ands    ip, r2, #3
  3408.          moveq    r0, r3
  3409. -        beq    alldone_b_2
  3410. +        beq    Lalldone_b_2
  3411.          ldr    r5, [r0], #4
  3412.          mov    r4, r4, lsr #16
  3413.          orr    r4, r4, r5, lsl #16
  3414. @@ -379,7 +379,4 @@
  3415.          teq    ip, #3
  3416.          moveq    r4, r4, lsr #8
  3417.          streqb    r4, [r1], #1
  3418. -alldone_b_2:    ldmea    fp, {r4 - r10, fp, sp, pc}^
  3419. -
  3420. -
  3421. -
  3422. +Lalldone_b_2:    ldmea    fp, {r4 - r10, fp, sp, pc}^
  3423. diff -urN linux.store/linux/arch/arm/lib/ll_char_wr.S linux/arch/arm/lib/ll_char_wr.S
  3424. --- linux.store/linux/arch/arm/lib/ll_char_wr.S    Wed Mar 13 23:55:08 1996
  3425. +++ linux/arch/arm/lib/ll_char_wr.S    Thu Mar 28 10:15:50 1996
  3426. @@ -55,8 +55,8 @@
  3427.          mul    r6, r5, r6
  3428.          mov    r1, r1, lsl #3
  3429.          teq    r5, #8
  3430. -        beq    row8bpplp
  3431. -row4bpplp:
  3432. +        beq    Lrow8bpplp
  3433. +Lrow4bpplp:
  3434.          ldrb    r9, [r7, r1]
  3435.          and    r8, r1, #7
  3436.          teq    r8, #7
  3437. @@ -91,10 +91,10 @@
  3438.          str    ip, [r0], r6
  3439.          add    r1, r1,#1
  3440.          tst    r1, #7
  3441. -        bne    row4bpplp
  3442. +        bne    Lrow4bpplp
  3443.          LOADREGS(ea, fp, {r4 - r9, fp, sp, pc})
  3444.  
  3445. -row8bpplp:    ldrb    r9, [r7, r1]
  3446. +Lrow8bpplp:    ldrb    r9, [r7, r1]
  3447.          and    r8, r1, #7
  3448.          teq    r8, #7
  3449.          tsteq    r4, #UNDERLINE << 24
  3450. @@ -127,6 +127,6 @@
  3451.          add    r0, r0, r6
  3452.          add    r1,r1,#1
  3453.          tst    r1,#7
  3454. -        bne    row8bpplp
  3455. +        bne    Lrow8bpplp
  3456.          LOADREGS(ea, fp, {r4 - r9, fp, sp, pc})
  3457.  
  3458. diff -urN linux.store/linux/arch/arm/lib/memfastset.S linux/arch/arm/lib/memfastset.S
  3459. --- linux.store/linux/arch/arm/lib/memfastset.S    Sun Mar  3 13:15:54 1996
  3460. +++ linux/arch/arm/lib/memfastset.S    Thu Mar 28 10:16:22 1996
  3461. @@ -12,8 +12,9 @@
  3462.  
  3463.  _memfastset:    stmfd    sp!, {lr}
  3464.          subs    r2, r2, #32
  3465. -        bmi    memfastl32
  3466. -memfast32setlp:    str    r1, [r0], #4
  3467. +        bmi    Lmemfastl32
  3468. +Lmemfast32setlp:
  3469. +        str    r1, [r0], #4
  3470.          str    r1, [r0], #4
  3471.          str    r1, [r0], #4
  3472.          str    r1, [r0], #4
  3473. @@ -23,18 +24,19 @@
  3474.          str    r1, [r0], #4
  3475.          LOADREGS(eqfd, sp!, {pc})
  3476.          subs    r2, r2, #32
  3477. -        bpl    memfast32setlp
  3478. -memfastl32:    adds    r2, r2, #16
  3479. -        bmi    memfastl16
  3480. -memfast16setlp:    str    r1, [r0], #4
  3481. +        bpl    Lmemfast32setlp
  3482. +Lmemfastl32:    adds    r2, r2, #16
  3483. +        bmi    Lmemfastl16
  3484. +Lmemfast16setlp:
  3485. +        str    r1, [r0], #4
  3486.          str    r1, [r0], #4
  3487.          str    r1, [r0], #4
  3488.          str    r1, [r0], #4
  3489.          LOADREGS(eqfd, sp!, {pc})
  3490.          subs    r2, r2, #16
  3491. -        bpl    memfast16setlp
  3492. -memfastl16:    add    r2, r2, #16
  3493. -memfastsetlp:    subs    r2, r2, #4
  3494. +        bpl    Lmemfast16setlp
  3495. +Lmemfastl16:    add    r2, r2, #16
  3496. +Lmemfastsetlp:    subs    r2, r2, #4
  3497.          strge    r1, [r0], #4
  3498. -        bgt    memfastsetlp
  3499. +        bgt    Lmemfastsetlp
  3500.          LOADREGS(fd, sp!, {pc})
  3501. diff -urN linux.store/linux/arch/arm/lib/mfm.S linux/arch/arm/lib/mfm.S
  3502. --- linux.store/linux/arch/arm/lib/mfm.S    Wed Mar 13 23:55:08 1996
  3503. +++ linux/arch/arm/lib/mfm.S    Thu Mar 28 14:23:22 1996
  3504. @@ -38,7 +38,6 @@
  3505.    adr r5,_hdc63463_irqdata
  3506.    ldmia r5,{r0,r1,r2,r3,r4}
  3507.  
  3508. -writedma_loop:
  3509.    @ test number of remaining bytes to transfer
  3510.    cmp r4,#0
  3511.    beq writedma_end
  3512. @@ -49,6 +48,11 @@
  3513.    tst r5,r2
  3514.    beq writedma_end
  3515.  
  3516. +  @ Transfer a block of upto 256 bytes
  3517. +  cmp r4,#256
  3518. +  movlt r7,r4
  3519. +  movge r7,#256
  3520. +
  3521.    @ Check the hdc is still busy and command has not ended and no errors
  3522.    ldr r5,[r0,#32]     @ Status reg - 16 bit - its the top few bits which are status
  3523.    tst r5,#0x3c00        @ Test for things which should be off
  3524. @@ -57,6 +61,10 @@
  3525.    cmp r5,#0x8000
  3526.    bne writedma_end 
  3527.  
  3528. +  @ Bytes remaining at end
  3529. +  sub r4,r4,r7
  3530. +
  3531. +writedma_loop:
  3532.    @ OK - pretty sure we should be doing this
  3533.    @ Get two bytes - note it can be half word aligned; its easiest to read 2 bytes
  3534.    ldrb r6,[r3],#1
  3535. @@ -64,8 +72,8 @@
  3536.    orr  r6,r6,r5,lsl#8  @ Put them together, note big endian for HDC
  3537.    orr  r6,r6,r6,lsl#16    @ Both halves of word for podule write
  3538.    str  r6,[r0,#32+8]      @ Put the data out
  3539. -  subs r4,r4,#2        @ Decrement bytes to go
  3540. -  b writedma_loop
  3541. +  subs r7,r7,#2        @ Decrement bytes to go
  3542. +  bne writedma_loop
  3543.  
  3544.  writedma_end:
  3545.    adr r5,_hdc63463_irqdata+12
  3546. @@ -83,7 +91,6 @@
  3547.    adr r5,_hdc63463_irqdata
  3548.    ldmia r5,{r0,r1,r2,r3,r4}
  3549.  
  3550. -readdma_loop:
  3551.    @ test number of remaining bytes to transfer
  3552.    cmp r4,#0
  3553.    beq readdma_end
  3554. @@ -102,14 +109,23 @@
  3555.    cmp r5,#0x8000
  3556.    bne readdma_end 
  3557.  
  3558. +  @ Transfer a block of upto 256 bytes
  3559. +  cmp r4,#256
  3560. +  movlt r7,r4
  3561. +  movge r7,#256
  3562. +
  3563. +  @ Bytes remaining at end
  3564. +  sub r4,r4,r7
  3565. +
  3566. +readdma_loop:
  3567.    @ OK - pretty sure we should be doing this
  3568.    @ Get two bytes - note it can be half word aligned; its easiest to read 2 bytes
  3569. -  ldr  r6,[r0,#8]     @ Read data from hdc - its in the bottom half
  3570. +  ldr  r6,[r0,#8]      @ Read data from hdc - its in the bottom half
  3571.    mov  r5,r6,lsr#8     @ Move second byte to bottom
  3572.    strb r6,[r3],#1      @ Note endian swap in here
  3573.    strb r5,[r3],#1
  3574. -  subs r4,r4,#2        @ Decrement bytes to go
  3575. -  b readdma_loop
  3576. +  subs r7,r7,#2        @ Decrement bytes to go
  3577. +  bne readdma_loop
  3578.  
  3579.  readdma_end:
  3580.    adr r5,_hdc63463_irqdata+12
  3581. diff -urN linux.store/linux/arch/arm/lib/prints.S linux/arch/arm/lib/prints.S
  3582. --- linux.store/linux/arch/arm/lib/prints.S    Sun Mar  3 13:16:21 1996
  3583. +++ linux/arch/arm/lib/prints.S    Thu Mar 28 10:17:07 1996
  3584. @@ -22,19 +22,19 @@
  3585.          mov    r2, #0x03000000
  3586.          orr    r2, r2, #0x00010000
  3587.          orr    r2, r2, #0x00000fe0
  3588. -outlp:        ldrb    r1, [r0], #1
  3589. +Loutlp:        ldrb    r1, [r0], #1
  3590.          teq    r1, #0
  3591. -        beq    out
  3592. +        beq    Lout
  3593.          teq    r1, #10
  3594.          moveq    r3, #13
  3595.          streqb    r3, [r0, #-1]!
  3596.          strb    r1, [r2]
  3597.          mov    r3, #0x8000
  3598. -dlylp:        sub    r3, r3, #1
  3599. +Ldlylp:        sub    r3, r3, #1
  3600.          teq    r3, #0
  3601. -        bne    dlylp
  3602. -        b    outlp
  3603. -out:        LOADREGS(ea, fp, {fp, sp, pc})
  3604. +        bne    Ldlylp
  3605. +        b    Loutlp
  3606. +Lout:        LOADREGS(ea, fp, {fp, sp, pc})
  3607.  
  3608.          .global    _prints
  3609.  _prints:    mov    ip, sp
  3610. @@ -43,16 +43,16 @@
  3611.          mov    r2, #0x03000000
  3612.          orr    r2, r2, #0x00010000
  3613.          orr    r2, r2, #0x00000fe0
  3614. -out2lp:        LDRB    r1, [r0], #1
  3615. +Lout2lp:    LDRB    r1, [r0], #1
  3616.          TEQ    r1, #0
  3617. -        BEQ    out
  3618. +        BEQ    Lout
  3619.          TEQ    r1, #10
  3620.          MOVEQ    r3, #13
  3621.          STREQB    r3, [r0, #-1]!
  3622.          STRB    r1, [r2]
  3623.          MOV    r3, #0x8000
  3624. -dly2lp:        SUB    r3, r3, #1
  3625. +Ldly2lp:    SUB    r3, r3, #1
  3626.          TEQ    r3, #0
  3627. -        BNE    dly2lp
  3628. -        B    out2lp
  3629. +        BNE    Ldly2lp
  3630. +        B    Lout2lp
  3631.  
  3632. diff -urN linux.store/linux/arch/arm/lib/segment.S linux/arch/arm/lib/segment.S
  3633. --- linux.store/linux/arch/arm/lib/segment.S    Sun Mar  3 13:20:42 1996
  3634. +++ linux/arch/arm/lib/segment.S    Thu Mar 28 10:30:46 1996
  3635. @@ -90,17 +90,17 @@
  3636.          bge    _memcpy_fromfs
  3637.          ENTER
  3638.          subs    r2, r2, #4
  3639. -        blt    no_double_words
  3640. +        blt    Lno_double_words
  3641.          ands    ip, r0, #3
  3642. -        bne    dest_not_aligned
  3643. +        bne    Ldest_not_aligned
  3644.          ands    ip, r1, #3
  3645. -        bne    src_not_aligned
  3646. -rest:        subs    r2, r2, #8
  3647. -        blt    cpy_2_lp
  3648. +        bne    Lsrc_not_aligned
  3649. +Lrest:        subs    r2, r2, #8
  3650. +        blt    Lcpy_2_lp
  3651.          subs    r2, r2, #0x14
  3652. -        blt    not_long_copy
  3653. +        blt    Lnot_long_copy
  3654.  
  3655. -cpy_8_lp:    ldmia    r1!, {r3 - r9, ip}
  3656. +Lcpy_8_lp:    ldmia    r1!, {r3 - r9, ip}
  3657.          strt    r3, [r0], #4
  3658.          strt    r4, [r0], #4
  3659.          strt    r5, [r0], #4
  3660. @@ -110,7 +110,7 @@
  3661.          strt    r9, [r0], #4
  3662.          strt    ip, [r0], #4
  3663.          subs    r2, r2, #32
  3664. -        bge    cpy_8_lp
  3665. +        bge    Lcpy_8_lp
  3666.          cmn    r2,#16
  3667.          ldmgeia    r1!,{r3 - r6}
  3668.          strget    r3, [r0], #4
  3669. @@ -119,17 +119,17 @@
  3670.          strget    r6, [r0], #4
  3671.          subge    r2, r2, #0x10
  3672.  
  3673. -not_long_copy:    adds    r2,r2,#0x14
  3674. +Lnot_long_copy:    adds    r2,r2,#0x14
  3675.  
  3676. -cpy_3_lp:    ldmgeia    r1!, {r3 - r5}
  3677. +Lcpy_3_lp:    ldmgeia    r1!, {r3 - r5}
  3678.          strget    r3, [r0], #4
  3679.          strget    r4, [r0], #4
  3680.          strget    r5, [r0], #4
  3681.          subges    r2, r2, #12
  3682. -        bge    cpy_3_lp
  3683. +        bge    Lcpy_3_lp
  3684.  
  3685. -cpy_2_lp:    adds    r2, r2, #8
  3686. -        blt    no_double_words
  3687. +Lcpy_2_lp:    adds    r2, r2, #8
  3688. +        blt    Lno_double_words
  3689.          subs    r2, r2, #4
  3690.          ldrlt    r3, [r1], #4
  3691.          strltt    r3, [r0], #4
  3692. @@ -138,7 +138,7 @@
  3693.          strget    r4, [r0], #4
  3694.          subge    r2, r2, #4
  3695.  
  3696. -no_double_words:
  3697. +Lno_double_words:
  3698.          adds    r2, r2, #4
  3699.          EXITEQ
  3700.          cmp    r2, #2
  3701. @@ -149,7 +149,7 @@
  3702.          ldrgtb    r3, [r1], #1
  3703.          strgtbt    r3, [r0], #1
  3704.          EXIT
  3705. -dest_not_aligned:
  3706. +Ldest_not_aligned:
  3707.          rsb    ip, ip, #4
  3708.          cmp    ip, #2
  3709.          ldrb    r3, [r1], #1
  3710. @@ -159,20 +159,20 @@
  3711.          ldrgtb    r3, [r1], #1
  3712.          strgtbt    r3, [r0], #1
  3713.          subs    r2, r2, ip
  3714. -        blt    no_double_words
  3715. +        blt    Lno_double_words
  3716.          ands    ip, r1, #3
  3717. -        beq    rest
  3718. -src_not_aligned:
  3719. +        beq    Lrest
  3720. +Lsrc_not_aligned:
  3721.          bic    r1, r1, #3
  3722.          ldr    r7, [r1], #4
  3723.          cmp    ip, #2
  3724. -        bgt    cpy_4_3
  3725. -        beq    cpy_4_2
  3726. +        bgt    Lcpy_4_3
  3727. +        beq    Lcpy_4_2
  3728.          cmp    r2, #12
  3729. -        blt    cpy_x_1_lp
  3730. +        blt    Lcpy_x_1_lp
  3731.          sub    r2, r2, #12
  3732.  
  3733. -cpy_4_1_lp:    mov    r3, r7, lsr #8
  3734. +Lcpy_4_1_lp:    mov    r3, r7, lsr #8
  3735.          ldmia    r1!, {r4 - r7}
  3736.          orr    r3, r3, r4, lsl #24
  3737.          mov    r4, r4, lsr #8
  3738. @@ -186,25 +186,25 @@
  3739.          strt    r5, [r0], #4
  3740.          strt    r6, [r0], #4
  3741.          subs    r2, r2, #16
  3742. -        bge    cpy_4_1_lp
  3743. +        bge    Lcpy_4_1_lp
  3744.          adds    r2,r2,#12
  3745. -        blt    rest1
  3746. +        blt    Lrest1
  3747.  
  3748. -cpy_x_1_lp:    mov    r3, r7, lsr #8
  3749. +Lcpy_x_1_lp:    mov    r3, r7, lsr #8
  3750.          ldr    r7, [r1], #4
  3751.          orr    r3, r3, r7, lsl #24
  3752.          strt    r3, [r0], #4
  3753.          subs    r2, r2, #4
  3754. -        bge    cpy_x_1_lp
  3755. +        bge    Lcpy_x_1_lp
  3756.  
  3757. -rest1:        sub    r1, r1, #3
  3758. -        b    no_double_words
  3759. +Lrest1:        sub    r1, r1, #3
  3760. +        b    Lno_double_words
  3761.  
  3762. -cpy_4_2:    cmp    r2, #12
  3763. -        blt    cpy_x_2_lp
  3764. +Lcpy_4_2:    cmp    r2, #12
  3765. +        blt    Lcpy_x_2_lp
  3766.          sub    r2, r2, #12
  3767.  
  3768. -cpy_4_2_lp:    mov    r3, r7, lsr #16
  3769. +Lcpy_4_2_lp:    mov    r3, r7, lsr #16
  3770.          ldmia    r1!, {r4 - r7}
  3771.          orr    r3, r3, r4, lsl #16
  3772.          mov    r4, r4, lsr #16
  3773. @@ -218,25 +218,25 @@
  3774.          strt    r5, [r0], #4
  3775.          strt    r6, [r0], #4
  3776.          subs    r2, r2, #16
  3777. -        bge    cpy_4_2_lp
  3778. +        bge    Lcpy_4_2_lp
  3779.          adds    r2, r2, #12
  3780. -        blt    rest2
  3781. +        blt    Lrest2
  3782.  
  3783. -cpy_x_2_lp:    mov    r3, r7, lsr #16
  3784. +Lcpy_x_2_lp:    mov    r3, r7, lsr #16
  3785.          ldr    r7, [r1], #4
  3786.          orr    r3, r3, r7, lsl #16
  3787.          strt    r3, [r0], #4
  3788.          subs    r2, r2, #4
  3789. -        bge    cpy_x_2_lp
  3790. +        bge    Lcpy_x_2_lp
  3791.  
  3792. -rest2:        sub    r1, r1, #2
  3793. -        b    no_double_words
  3794. +Lrest2:        sub    r1, r1, #2
  3795. +        b    Lno_double_words
  3796.  
  3797. -cpy_4_3:    cmp    r2, #12
  3798. -        blt    cpy_x_3_lp
  3799. +Lcpy_4_3:    cmp    r2, #12
  3800. +        blt    Lcpy_x_3_lp
  3801.          sub    r2, r2, #12
  3802.  
  3803. -cpy_4_3_lp:    mov    r3, r7, lsr #24
  3804. +Lcpy_4_3_lp:    mov    r3, r7, lsr #24
  3805.          ldmia    r1!, {r4 - r7}
  3806.          orr    r3, r3, r4, lsl #8
  3807.          mov    r4, r4, lsr #24
  3808. @@ -250,19 +250,19 @@
  3809.          strt    r5, [r0], #4
  3810.          strt    r6, [r0], #4
  3811.          subs    r2, r2, #16
  3812. -        bge    cpy_4_3_lp
  3813. +        bge    Lcpy_4_3_lp
  3814.          adds    r2, r2, #12
  3815. -        blt    rest3
  3816. +        blt    Lrest3
  3817.  
  3818. -cpy_x_3_lp:    mov    r3, r7, lsr #24
  3819. +Lcpy_x_3_lp:    mov    r3, r7, lsr #24
  3820.          ldr    r7, [r1], #4
  3821.          orr    r3, r3, r7, lsl #8
  3822.          strt    r3, [r0], #4
  3823.          subs    r2, r2, #4
  3824. -        bge    cpy_x_3_lp
  3825. +        bge    Lcpy_x_3_lp
  3826.  
  3827. -rest3:        sub    r1, r1, #1
  3828. -        b    no_double_words
  3829. +Lrest3:        sub    r1, r1, #1
  3830. +        b    Lno_double_words
  3831.  
  3832.  # Prototype: void memcpy_fromfs(void *to,const void *from,unsigned long n);
  3833.  # ARM3: cant use memcopy here!!!
  3834. @@ -275,37 +275,37 @@
  3835.  _memcpy_fromfs:
  3836.          ENTER
  3837.          cmp    r1, r0
  3838. -        bcc    other_copy
  3839. +        bcc    Lother_copy
  3840.          subs    r2, r2, #4
  3841. -        blt    up_no_double_words
  3842. +        blt    Lup_no_double_words
  3843.          ands    ip, r0, #3
  3844. -        bne    up_dest_not_aligned
  3845. +        bne    Lup_dest_not_aligned
  3846.          ands    ip, r1, #3
  3847. -        bne    up_src_not_aligned
  3848. +        bne    Lup_src_not_aligned
  3849.  
  3850. -up_rest:    subs    r2, r2, #8
  3851. -        blt    up_cpy_2_lp
  3852. +Lup_rest:    subs    r2, r2, #8
  3853. +        blt    Lup_cpy_2_lp
  3854.          subs    r2, r2, #0x14
  3855. -        blt    up_not_long_copy
  3856. +        blt    Lup_not_long_copy
  3857.  
  3858. -up_cpy_8_lp:    ldmia    r1!,{r3 - r9, ip}
  3859. +Lup_cpy_8_lp:    ldmia    r1!,{r3 - r9, ip}
  3860.          stmia    r0!,{r3 - r9, ip}
  3861.          subs    r2, r2, #32
  3862. -        bge    up_cpy_8_lp
  3863. +        bge    Lup_cpy_8_lp
  3864.          cmn    r2, #16
  3865.          ldmgeia    r1!, {r3 - r6}
  3866.          stmgeia    r0!, {r3 - r6}
  3867.          subge    r2, r2, #0x10
  3868. -up_not_long_copy:
  3869. +Lup_not_long_copy:
  3870.          adds    r2, r2, #0x14
  3871.  
  3872. -up_cpy_3_lp:    ldmgeia    r1!, {r3 - r5}
  3873. +Lup_cpy_3_lp:    ldmgeia    r1!, {r3 - r5}
  3874.          stmgeia    r0!, {r3 - r5}
  3875.          subges    r2, r2, #12
  3876. -        bge    up_cpy_3_lp
  3877. +        bge    Lup_cpy_3_lp
  3878.  
  3879. -up_cpy_2_lp:    adds    r2, r2, #8
  3880. -        blt    up_no_double_words
  3881. +Lup_cpy_2_lp:    adds    r2, r2, #8
  3882. +        blt    Lup_no_double_words
  3883.          subs    r2, r2, #4
  3884.          ldrlt    r3, [r1], #4
  3885.          strlt    r3, [r0], #4
  3886. @@ -313,7 +313,7 @@
  3887.          stmgeia    r0!, {r3, r4}
  3888.          subge    r2, r2, #4
  3889.  
  3890. -up_no_double_words:
  3891. +Lup_no_double_words:
  3892.          adds    r2, r2, #4
  3893.          EXITEQ
  3894.          cmp    r2, #2
  3895. @@ -324,7 +324,7 @@
  3896.          ldrgtb    r3, [r1], #1
  3897.          strgtb    r3, [r0], #1
  3898.          EXIT
  3899. -up_dest_not_aligned:
  3900. +Lup_dest_not_aligned:
  3901.          rsb    ip, ip, #4
  3902.          cmp    ip, #2
  3903.          ldrb    r3, [r1], #1
  3904. @@ -334,20 +334,20 @@
  3905.          ldrgtb    r3, [r1], #1
  3906.          strgtb    r3, [r0], #1
  3907.          subs    r2, r2, ip
  3908. -        blt    up_no_double_words
  3909. +        blt    Lup_no_double_words
  3910.          ands    ip, r1, #3
  3911. -        beq    up_rest
  3912. -up_src_not_aligned:
  3913. +        beq    Lup_rest
  3914. +Lup_src_not_aligned:
  3915.          bic    r1, r1, #3
  3916.          ldr    r7, [r1], #4
  3917.          cmp    ip, #2
  3918. -        bgt    up_cpy_4_3
  3919. -        beq    up_cpy_4_2
  3920. +        bgt    Lup_cpy_4_3
  3921. +        beq    Lup_cpy_4_2
  3922.          cmp    r2, #12
  3923. -        blt    up_cpy_x_1_lp
  3924. +        blt    Lup_cpy_x_1_lp
  3925.          sub    r2, r2, #12
  3926.  
  3927. -up_cpy_4_1_lp:    mov    r3, r7, lsr #8
  3928. +Lup_cpy_4_1_lp:    mov    r3, r7, lsr #8
  3929.          ldmia    r1!, {r4 - r7}
  3930.          orr    r3, r3, r4, lsl #24
  3931.          mov    r4, r4, lsr #8
  3932. @@ -358,25 +358,25 @@
  3933.          orr    r6, r6, r7, lsl #24
  3934.          stmia    r0!, {r3 - r6}
  3935.          subs    r2, r2, #16
  3936. -        bge    up_cpy_4_1_lp
  3937. +        bge    Lup_cpy_4_1_lp
  3938.          adds    r2, r2, #12
  3939. -        blt    up_rest1
  3940. +        blt    Lup_rest1
  3941.  
  3942. -up_cpy_x_1_lp:    mov    r3, r7, lsr #8
  3943. +Lup_cpy_x_1_lp:    mov    r3, r7, lsr #8
  3944.          ldr    r7, [r1], #4
  3945.          orr    r3, r3, r7, lsl #24
  3946.          str    r3, [r0], #4
  3947.          subs    r2, r2, #4
  3948. -        bge    up_cpy_x_1_lp
  3949. +        bge    Lup_cpy_x_1_lp
  3950.  
  3951. -up_rest1:    sub    r1, r1, #3
  3952. -        b    up_no_double_words
  3953. +Lup_rest1:    sub    r1, r1, #3
  3954. +        b    Lup_no_double_words
  3955.  
  3956. -up_cpy_4_2:    cmp    r2, #12
  3957. -        blt    up_cpy_x_2_lp
  3958. +Lup_cpy_4_2:    cmp    r2, #12
  3959. +        blt    Lup_cpy_x_2_lp
  3960.          sub    r2, r2, #12
  3961.  
  3962. -up_cpy_4_2_lp:    mov    r3, r7, lsr #16
  3963. +Lup_cpy_4_2_lp:    mov    r3, r7, lsr #16
  3964.          ldmia    r1!, {r4 - r7}
  3965.          orr    r3, r3, r4, lsl #16
  3966.          mov    r4, r4, lsr #16
  3967. @@ -387,25 +387,25 @@
  3968.          orr    r6, r6, r7,LSL#16
  3969.          stmia    r0!, {r3 - r6}
  3970.          subs    r2, r2, #16
  3971. -        bge    up_cpy_4_2_lp
  3972. +        bge    Lup_cpy_4_2_lp
  3973.          adds    r2, r2, #12
  3974. -        blt    up_rest2
  3975. +        blt    Lup_rest2
  3976.  
  3977. -up_cpy_x_2_lp:    mov    r3, r7, lsr #16
  3978. +Lup_cpy_x_2_lp:    mov    r3, r7, lsr #16
  3979.          ldr    r7, [r1], #4
  3980.          orr    r3, r3, r7, lsl #16
  3981.          str    r3, [r0], #4
  3982.          subs    r2, r2, #4
  3983. -        bge    up_cpy_x_2_lp
  3984. +        bge    Lup_cpy_x_2_lp
  3985.  
  3986. -up_rest2:    sub    r1, r1, #2
  3987. -        b    up_no_double_words
  3988. +Lup_rest2:    sub    r1, r1, #2
  3989. +        b    Lup_no_double_words
  3990.  
  3991. -up_cpy_4_3:    cmp    r2, #12
  3992. -        blt    up_cpy_x_3_lp
  3993. +Lup_cpy_4_3:    cmp    r2, #12
  3994. +        blt    Lup_cpy_x_3_lp
  3995.          sub    r2, r2, #12
  3996.  
  3997. -up_cpy_4_3_lp:    mov    r3, r7, lsr #24
  3998. +Lup_cpy_4_3_lp:    mov    r3, r7, lsr #24
  3999.          ldmia    r1!,{r4 - r7}
  4000.          orr    r3, r3, r4, lsl #8
  4001.          mov    r4, r4, lsr #24
  4002. @@ -416,42 +416,42 @@
  4003.          orr    r6, r6, r7, lsl #8
  4004.          stmia    r0!, {r3 - r6}
  4005.          subs    r2, r2, #16
  4006. -        bge    up_cpy_4_3_lp
  4007. +        bge    Lup_cpy_4_3_lp
  4008.          adds    r2, r2, #12
  4009. -        blt    up_rest3
  4010. +        blt    Lup_rest3
  4011.  
  4012. -up_cpy_x_3_lp:    mov    r3, r7, lsr #24
  4013. +Lup_cpy_x_3_lp:    mov    r3, r7, lsr #24
  4014.          ldr    r7, [r1], #4
  4015.          orr    r3, r3, r7, lsl#8
  4016.          str    r3, [r0], #4
  4017.          subs    r2, r2, #4
  4018. -        bge    up_cpy_x_3_lp
  4019. +        bge    Lup_cpy_x_3_lp
  4020.  
  4021. -up_rest3:    sub    r1, r1, #1
  4022. -        b    up_no_double_words
  4023. +Lup_rest3:    sub    r1, r1, #1
  4024. +        b    Lup_no_double_words
  4025.  
  4026.  
  4027. -other_copy:    add    r1, r1, r2
  4028. +Lother_copy:    add    r1, r1, r2
  4029.          add    r0, r0, r2
  4030.          subs    r2, r2, #4
  4031. -        blt    down_no_double_words
  4032. +        blt    Ldown_no_double_words
  4033.          ands    ip, r0, #3
  4034. -        bne    down_dest_not_aligned
  4035. +        bne    Ldown_dest_not_aligned
  4036.          ands    ip, r1, #3
  4037. -        bne    down_src_not_aligned
  4038. +        bne    Ldown_src_not_aligned
  4039.  
  4040. -down_rest:
  4041. +Ldown_rest:
  4042.          subs    r2, r2, #8
  4043. -        blt    down_cpy_2_lp
  4044. +        blt    Ldown_cpy_2_lp
  4045.          subs    r2, r2, #0x14
  4046. -        blt    down_not_long_copy
  4047. -down_cpy_8_lp:
  4048. +        blt    Ldown_not_long_copy
  4049. +Ldown_cpy_8_lp:
  4050.          ldmdb    r1!, {r3 - r9, ip}
  4051.          stmdb    r0!, {r3 - r9, ip}
  4052.          subs    r2, r2, #32
  4053. -        bge    down_cpy_8_lp
  4054. +        bge    Ldown_cpy_8_lp
  4055.  
  4056. -down_not_long_copy:
  4057. +Ldown_not_long_copy:
  4058.          cmn    r2, #16
  4059.          ldmgedb    r1!, {r3 - r6}
  4060.          stmgedb    r0!, {r3 - r6}
  4061. @@ -460,9 +460,9 @@
  4062.          ldmgedb    r1!, {r3 - r5}
  4063.          stmgedb    r0!, {r3 - r5}
  4064.          subge    r2, r2, #12
  4065. -down_cpy_2_lp:
  4066. +Ldown_cpy_2_lp:
  4067.          adds    r2, r2, #8
  4068. -        blt    down_no_double_words
  4069. +        blt    Ldown_no_double_words
  4070.          subs    r2, r2, #4
  4071.          ldrlt    r3, [r1, #-4]!
  4072.          strlt    r3, [r0, #-4]!
  4073. @@ -470,7 +470,7 @@
  4074.          stmgedb    r0!, {r3, r4}
  4075.          subge    r2, r2, #4
  4076.  
  4077. -down_no_double_words:
  4078. +Ldown_no_double_words:
  4079.          adds    r2, r2, #4
  4080.          EXITEQ
  4081.          cmp    r2, #2
  4082. @@ -482,7 +482,7 @@
  4083.          strgtb    r3, [r0, #-1]!
  4084.          EXIT
  4085.  
  4086. -down_dest_not_aligned:
  4087. +Ldown_dest_not_aligned:
  4088.          CMP    ip,#2
  4089.          LDRB    r3,[r1,#-1]!
  4090.          STRB    r3,[r0,#-1]!
  4091. @@ -491,21 +491,21 @@
  4092.          LDRGTB    r3,[r1,#-1]!
  4093.          STRGTB    r3,[r0,#-1]!
  4094.          SUBS    r2,r2,ip
  4095. -        BLT    down_no_double_words
  4096. +        BLT    Ldown_no_double_words
  4097.          ANDS    ip,r1,#3
  4098. -        BEQ    down_rest
  4099. +        BEQ    Ldown_rest
  4100.  
  4101. -down_src_not_aligned:
  4102. +Ldown_src_not_aligned:
  4103.          BIC    r1,r1,#3
  4104.          LDR    r3,[r1],#0
  4105.          CMP    ip,#2
  4106. -        BLT    down_cpy_4_3
  4107. -        BEQ    down_cpy_4_2
  4108. +        BLT    Ldown_cpy_4_3
  4109. +        BEQ    Ldown_cpy_4_2
  4110.          CMP    r2,#12
  4111. -        BLT    down_cpy_x_1_lp
  4112. +        BLT    Ldown_cpy_x_1_lp
  4113.          SUB    r2,r2,#12
  4114.  
  4115. -down_cpy_4_1_lp:
  4116. +Ldown_cpy_4_1_lp:
  4117.          MOV    r7,r3,LSL#8
  4118.          LDMDB    r1!,{r3,r4,r5,r6}
  4119.          ORR    r7,r7,r6,LSR#24
  4120. @@ -517,28 +517,28 @@
  4121.          ORR    r4,r4,r3,LSR#24
  4122.          STMDB    r0!,{r4,r5,r6,r7}
  4123.          SUBS    r2,r2,#16
  4124. -        BGE    down_cpy_4_1_lp
  4125. +        BGE    Ldown_cpy_4_1_lp
  4126.          ADDS    r2,r2,#12
  4127. -        BLT    down_rest1
  4128. +        BLT    Ldown_rest1
  4129.  
  4130. -down_cpy_x_1_lp:
  4131. +Ldown_cpy_x_1_lp:
  4132.          MOV    ip,r3,LSL#8
  4133.          LDR    r3,[r1,#-4]!
  4134.          ORR    ip,ip,r3,LSR#24
  4135.          STR    ip,[r0,#-4]!
  4136.          SUBS    r2,r2,#4
  4137. -        BGE    down_cpy_x_1_lp
  4138. +        BGE    Ldown_cpy_x_1_lp
  4139.  
  4140. -down_rest1:
  4141. +Ldown_rest1:
  4142.          ADD    r1,r1,#3
  4143. -        B    down_no_double_words
  4144. +        B    Ldown_no_double_words
  4145.  
  4146. -down_cpy_4_2:
  4147. +Ldown_cpy_4_2:
  4148.          CMP    r2,#12
  4149. -        BLT    down_cpy_x_2_lp
  4150. +        BLT    Ldown_cpy_x_2_lp
  4151.          SUB    r2,r2,#12
  4152.  
  4153. -down_cpy_4_2_lp:
  4154. +Ldown_cpy_4_2_lp:
  4155.          MOV    r7,r3,LSL#16
  4156.          LDMDB    r1!,{r3,r4,r5,r6}
  4157.          ORR    r7,r7,r6,LSR#16
  4158. @@ -550,28 +550,28 @@
  4159.          ORR    r4,r4,r3,LSR#16
  4160.          STMDB    r0!,{r4,r5,r6,r7}
  4161.          SUBS    r2,r2,#16
  4162. -        BGE    down_cpy_4_2_lp
  4163. +        BGE    Ldown_cpy_4_2_lp
  4164.          ADDS    r2,r2,#12
  4165. -        BLT    down_rest2
  4166. +        BLT    Ldown_rest2
  4167.  
  4168. -down_cpy_x_2_lp:
  4169. +Ldown_cpy_x_2_lp:
  4170.          MOV    ip,r3,LSL#16
  4171.          LDR    r3,[r1,#-4]!
  4172.          ORR    ip,ip,r3,LSR#16
  4173.          STR    ip,[r0,#-4]!
  4174.          SUBS    r2,r2,#4
  4175. -        BGE    down_cpy_x_2_lp
  4176. +        BGE    Ldown_cpy_x_2_lp
  4177.  
  4178. -down_rest2:
  4179. +Ldown_rest2:
  4180.          ADD    r1,r1,#2
  4181. -        B    down_no_double_words
  4182. +        B    Ldown_no_double_words
  4183.  
  4184. -down_cpy_4_3:
  4185. +Ldown_cpy_4_3:
  4186.          CMP    r2,#12
  4187. -        BLT    down_cpy_x_3_lp
  4188. +        BLT    Ldown_cpy_x_3_lp
  4189.          SUB    r2,r2,#12
  4190.  
  4191. -down_cpy_4_3_lp:
  4192. +Ldown_cpy_4_3_lp:
  4193.          MOV    r7,r3,LSL#24
  4194.          LDMDB    r1!,{r3,r4,r5,r6}
  4195.          ORR    r7,r7,r6,LSR#8
  4196. @@ -583,17 +583,17 @@
  4197.          ORR    r4,r4,r3,LSR#8
  4198.          STMDB    r0!,{r4,r5,r6,r7}
  4199.          SUBS    r2,r2,#16
  4200. -        BGE    down_cpy_4_3_lp
  4201. +        BGE    Ldown_cpy_4_3_lp
  4202.          ADDS    r2,r2,#12
  4203. -        BLT    down_rest3
  4204. -down_cpy_x_3_lp:
  4205. +        BLT    Ldown_rest3
  4206. +Ldown_cpy_x_3_lp:
  4207.          MOV    ip,r3,LSL#24
  4208.          LDR    r3,[r1,#-4]!
  4209.          ORR    ip,ip,r3,LSR#8
  4210.          STR    ip,[r0,#-4]!
  4211.          SUBS    r2,r2,#4
  4212. -        BGE    down_cpy_x_3_lp
  4213. -down_rest3:
  4214. +        BGE    Ldown_cpy_x_3_lp
  4215. +Ldown_rest3:
  4216.          ADD    r1,r1,#1
  4217. -        B    down_no_double_words
  4218. +        B    Ldown_no_double_words
  4219.  
  4220. diff -urN linux.store/linux/arch/arm/lib/string.S linux/arch/arm/lib/string.S
  4221. --- linux.store/linux/arch/arm/lib/string.S    Sun Mar  3 13:17:16 1996
  4222. +++ linux/arch/arm/lib/string.S    Thu Mar 28 10:23:15 1996
  4223. @@ -11,11 +11,11 @@
  4224.          .global    _strrchr
  4225.  _strrchr:    stmfd    sp!,{lr}
  4226.          mov    r3,#0
  4227. -strrchrlp:    ldrb    r2,[r0],#1
  4228. +Lstrrchrlp:    ldrb    r2,[r0],#1
  4229.          teq    r2,r1
  4230.          moveq    r3,r0
  4231.          teq    r2,#0
  4232. -        bne    strrchrlp
  4233. +        bne    Lstrrchrlp
  4234.          mov    r0,r3
  4235.          LOADREGS(fd, sp!, {pc})
  4236.  
  4237. @@ -25,20 +25,20 @@
  4238.          stmfd    sp!, {lr}
  4239.          mov    r3, r0
  4240.          cmp    r2, #4
  4241. -        blt    memsetlp
  4242. +        blt    Lmemsetlp
  4243.          ands    ip, r3, #3
  4244. -        beq    aligned
  4245. +        beq    Laligned
  4246.          cmp    ip, #2
  4247.          strltb    r1, [r3], #1
  4248.          strleb    r1, [r3], #1
  4249.          strb    r1, [r3], #1
  4250.          rsb    ip, ip, #4
  4251.          sub    r2, r2, ip
  4252. -aligned:    orr    ip, r1, r1, lsl #8
  4253. +Laligned:    orr    ip, r1, r1, lsl #8
  4254.          orr    ip, ip, ip, lsl #16
  4255.          subs    r2, r2, #32
  4256. -        bmi    memsetl32
  4257. -memset32lp:    str    ip, [r3], #4
  4258. +        bmi    Lmemsetl32
  4259. +Lmemset32lp:    str    ip, [r3], #4
  4260.          str    ip, [r3], #4
  4261.          str    ip, [r3], #4
  4262.          str    ip, [r3], #4
  4263. @@ -48,29 +48,29 @@
  4264.          str    ip, [r3], #4
  4265.          LOADREGS(eqfd, sp!, {pc})
  4266.          subs    r2, r2, #32
  4267. -        bpl    memset32lp
  4268. -memsetl32:    adds    r2, r2, #16
  4269. -        bmi    memsetl16
  4270. +        bpl    Lmemset32lp
  4271. +Lmemsetl32:    adds    r2, r2, #16
  4272. +        bmi    Lmemsetl16
  4273.          str    ip, [r3], #4
  4274.          str    ip, [r3], #4
  4275.          str    ip, [r3], #4
  4276.          str    ip, [r3], #4
  4277.          LOADREGS(eqfd, sp!, {pc})
  4278.          sub    r2, r2, #16
  4279. -memsetl16:    adds    r2, r2, #8
  4280. -        bmi    memsetl8
  4281. +Lmemsetl16:    adds    r2, r2, #8
  4282. +        bmi    Lmemsetl8
  4283.          str    ip, [r3], #4
  4284.          str    ip, [r3], #4
  4285.          LOADREGS(eqfd, sp!, {pc})
  4286.          sub    r2, r2, #8
  4287. -memsetl8:    adds    r2, r2, #4
  4288. -        bmi    memsetl4
  4289. +Lmemsetl8:    adds    r2, r2, #4
  4290. +        bmi    Lmemsetl4
  4291.          str    ip, [r3], #4
  4292.          LOADREGS(eqfd, sp!, {pc})
  4293.          sub    r2, r2, #4
  4294. -memsetl4:    add    r2, r2, #4
  4295. -memsetlp:    subs    r2, r2, #1
  4296. +Lmemsetl4:    add    r2, r2, #4
  4297. +Lmemsetlp:    subs    r2, r2, #1
  4298.          strgeb    r1, [r3], #1
  4299. -        bgt    memsetlp
  4300. +        bgt    Lmemsetlp
  4301.          LOADREGS(fd, sp!, {pc})
  4302.  
  4303. diff -urN linux.store/linux/arch/arm/lib/system.S linux/arch/arm/lib/system.S
  4304. --- linux.store/linux/arch/arm/lib/system.S    Sun Mar  3 13:17:43 1996
  4305. +++ linux/arch/arm/lib/system.S    Thu Mar 28 10:25:18 1996
  4306. @@ -33,7 +33,7 @@
  4307.  LC0:
  4308.          .word    _current
  4309.  LC1:
  4310. -        .word    _wantmap
  4311. +        .word    Lwantmap
  4312.  LC2:
  4313.          .word    _page_nr
  4314.  LC3:
  4315. @@ -88,7 +88,7 @@
  4316.          orr    r3, r3, #0x03F00000
  4317.          ldr    r2, [pc, #LC2 - . - 8]
  4318.          ldr    r2, [r2]
  4319. -removelp:    subs    r2, r2, #1
  4320. +Lremovelp:    subs    r2, r2, #1
  4321.          orrpl    r1, r3, r2
  4322.          strpl    r1, [r4, r2, lsl#2]
  4323.          subpls    r2, r2, #1
  4324. @@ -100,52 +100,52 @@
  4325.          subpls    r2, r2, #1
  4326.          orrpl    r1, r3, r2
  4327.          strpl    r1, [r4, r2, lsl#2]
  4328. -        bpl    removelp
  4329. +        bpl    Lremovelp
  4330.  
  4331. -        adr    r6, phystomemc32    @ Convert to logical page number
  4332. +        adr    r6, Lphystomemc32    @ Convert to logical page number
  4333.          ldr    r1, [pc, #LC3 - . - 8]
  4334.          ldr    r7, [r1]
  4335.          mov    r1, #32*1024*1024    @ Top of logical memory
  4336.          mov    r1, r1, LSR r7        @ Convert to logical page number
  4337.          sub    r8, r1, #1        @ Max. logical page no.
  4338.  
  4339. -invalidatelp:    ldr    r1, [r0, r8, lsl#2]    @ Get map info
  4340. +Linvalidatelp:    ldr    r1, [r0, r8, lsl#2]    @ Get map info
  4341.          tst    r1, #PAGE_PRESENT    @ Check to see if it is present
  4342. -        beq    nextpage        @ If not, try next
  4343. +        beq    Lnextpage        @ If not, try next
  4344.          mov    r2, r1, lsr r7        @ convert entry to physical page number
  4345.          and    r2, r2, #0xff        @ Ensure that we only have the page no.
  4346.          ldr    r2, [r6, r2, lsl#2]    @ Convert to memc page number
  4347.          tst    r1, #PAGE_ACCESSED    @ check accessed
  4348.          tstne    r1, #PAGE_USER
  4349. -        beq    not_accessed
  4350. +        beq    Lnot_accessed
  4351.          bic    r2, r2, #0x200
  4352.          tst    r1, #PAGE_RW
  4353.          tstne    r1,#PAGE_DIRTY
  4354.          bicne    r2, r2, #0x300        @ Read/Write
  4355.  
  4356. -not_accessed:    mov    r1, r8, lsl r7        @ Shift logical page into correct position
  4357. +Lnot_accessed:    mov    r1, r8, lsl r7        @ Shift logical page into correct position
  4358.          mov    r3, r1, lsl #9        @ get low bits of page number
  4359.          orr    r2, r2, r3, lsr #9
  4360.          and    r1, r1, #0x01800000
  4361.          orr    r2, r2, r1, lsr #(23 - 10)
  4362.          and    r1, r2, #255
  4363.          str    r2, [r4, r1, lsl #2]    @ save in 'wanted' map table
  4364. -nextpage:    subs    r8,r8,#1
  4365. -        bpl    invalidatelp
  4366. +Lnextpage:    subs    r8,r8,#1
  4367. +        bpl    Linvalidatelp
  4368.  
  4369. -@ update the map to 'wantmap' - wantmap is in r11, r10 = page_nr
  4370. +@ update the map to 'Lwantmap' - wantmap is in r11, r10 = page_nr
  4371.  @ (interrupts can be enabled, and will be soon...)
  4372. -map_update:    ldr    r3, [pc, #LC2 - . - 8]
  4373. +Lmap_update:    ldr    r3, [pc, #LC2 - . - 8]
  4374.          ldr    r3, [r3]
  4375.          sub    r3, r3, #1
  4376.          ldr    r5, [pc, #LC4 - . - 8]
  4377. -map_updatelp:    ldr    r1, [r4,r3,LSL#2]
  4378. +Lmap_updatelp:    ldr    r1, [r4,r3,LSL#2]
  4379.          ldr    r2, [r5,r3,LSL#2]
  4380.          teq    r2, r1
  4381.          strne    r1, [r5,r3,LSL#2]
  4382.          strneb    r1,[r1]
  4383.          subs    r3,r3,#1
  4384. -        bpl    map_updatelp
  4385. +        bpl    Lmap_updatelp
  4386.          ldmea    fp, {r4 - r9, fp, sp, pc}^
  4387.  
  4388.          .align
  4389. @@ -169,7 +169,7 @@
  4390.          .word    af | 0x03800300
  4391.  
  4392.  @ Table to map from page number to vidc page number
  4393. -phystomemc32:
  4394. +Lphystomemc32:
  4395.          
  4396.          PCD(    0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78)
  4397.          PCD(    0x01,0x09,0x11,0x19,0x21,0x29,0x31,0x39,0x41,0x49,0x51,0x59,0x61,0x69,0x71,0x79)
  4398. @@ -209,7 +209,7 @@
  4399.          .word    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  4400.          .word    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  4401.  # The wanted memc mapping
  4402. -_wantmap:
  4403. +Lwantmap:
  4404.          .word    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  4405.          .word    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  4406.          .word    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  4407. diff -urN linux.store/linux/arch/arm/lib/traps-arm6.S linux/arch/arm/lib/traps-arm6.S
  4408. --- linux.store/linux/arch/arm/lib/traps-arm6.S    Thu Jan  1 01:00:00 1970
  4409. +++ linux/arch/arm/lib/traps-arm6.S    Fri Mar 22 22:04:08 1996
  4410. @@ -0,0 +1,1034 @@
  4411. +/*
  4412. + * linux/arch/arm/lib/traps-arm6.S
  4413. + *
  4414. + * Copyright (C) 1996 Russell King.
  4415. + *
  4416. + * Low-level vector interface routines
  4417. + *
  4418. + * Design issues:
  4419. + *  - We have several modes that each vector can be called from,
  4420. + *    each with its own set of registers.  On entry to any vector,
  4421. + *    we *must* save the registers used in *that* mode.
  4422. + *
  4423. + *  - This code must be as fast as possible.
  4424. + *
  4425. + * There are a few restrictions on the vectors:
  4426. + *  - the SWI vector cannot be called from *any* non-user mode
  4427. + *
  4428. + *  - the FP emulator is *never* called from *any* non-user mode undefined instruction.
  4429. + *
  4430. + * Ok, so this file may be a mess, but its as efficient as possible while
  4431. + * adhering to the above criteria.
  4432. + */
  4433. +
  4434. +#include <asm/assembler.h>
  4435. +#include <asm/errno.h>
  4436. +#include <asm/hardware.h>
  4437. +
  4438. +        .text
  4439. +
  4440. +@ Offsets into task structure
  4441. +@ ---------------------------
  4442. +@
  4443. +#define STATE        0
  4444. +#define COUNTER        4
  4445. +#define PRIORITY    8
  4446. +#define SIGNAL        12
  4447. +#define BLOCKED        16
  4448. +#define FLAGS        20
  4449. +#define ERRNO        24
  4450. +
  4451. +#define PF_TRACESYS    0x20
  4452. +
  4453. +@ Bad Abort numbers
  4454. +@ -----------------
  4455. +@
  4456. +#define BAD_PREFETCH    0
  4457. +#define BAD_DATA    1
  4458. +#define BAD_ADDREXCPTN    2
  4459. +#define BAD_IRQ        3
  4460. +#define BAD_UNDEFINSTR    4
  4461. +
  4462. +@ Number of syscalls accepted
  4463. +@
  4464. +#define NSYS_CALL    142
  4465. +
  4466. +@ OS version number used in SWIs
  4467. +@  RISC OS is 0
  4468. +@  RISC iX is 8
  4469. +@
  4470. +#define OS_NUMBER    9
  4471. +
  4472. +@
  4473. +@ Stack format (ensured by USER_* and SVC_*)
  4474. +@
  4475. +#define S_FRAME_SIZE    72
  4476. +#define S_OLD_R0    68
  4477. +#define S_PSR        64
  4478. +#define S_PC        60
  4479. +#define S_LR        56
  4480. +#define S_SP        52
  4481. +#define S_IP        48
  4482. +#define S_FP        44
  4483. +#define S_R10        40
  4484. +#define S_R9        36
  4485. +#define S_R8        32
  4486. +#define S_R7        28
  4487. +#define S_R6        24
  4488. +#define S_R5        20
  4489. +#define S_R4        16
  4490. +#define S_R3        12
  4491. +#define S_R2        8
  4492. +#define S_R1        4
  4493. +#define S_R0        0
  4494. +
  4495. +#include "constants.h"
  4496. +
  4497. +#define USER_SAVE_ALL                \
  4498. +        str    r0, [sp, #-4]!        ;\
  4499. +        str    lr, [sp, #-4]!        ;\
  4500. +        sub    sp, sp, #15*4        ;\
  4501. +        stmia    sp, {r0 - lr}^        ;\
  4502. +        mov    r0, r0            ;\
  4503. +        mov    fp, #0
  4504. +
  4505. +#define SVC_SAVE_ALL                \
  4506. +        str    sp, [sp, #-16]!        ;\
  4507. +        str    lr, [sp, #8]        ;\
  4508. +        str    lr, [sp, #4]        ;\
  4509. +        stmfd    sp!, {r0 - r12}        ;\
  4510. +        mov    r0, #-1            ;\
  4511. +        str    r0, [sp, #S_OLD_R0]    ;\
  4512. +        mov    fp, #0
  4513. +
  4514. +#define SVC_IRQ_SAVE_ALL            \
  4515. +        str    sp, [sp, #-16]!        ;\
  4516. +        str    lr, [sp, #4]        ;\
  4517. +        ldr    lr, [pc, #LC4 - . - 8]    ;\
  4518. +        ldr    lr, [lr]        ;\
  4519. +        str    lr, [sp, #8]        ;\
  4520. +        stmfd    sp!, {r0 - r12}        ;\
  4521. +        mov    r0, #-1            ;\
  4522. +        str    r0, [sp, #S_OLD_R0]    ;\
  4523. +        mov    fp, #0
  4524. +
  4525. +#define USER_RESTORE_ALL            \
  4526. +        ldmia    sp, {r0 - lr}^        ;\
  4527. +        mov    r0, r0            ;\
  4528. +        add    sp, sp, #15*4        ;\
  4529. +        ldr    lr, [sp], #8        ;\
  4530. +        bics    pc, lr, #0x0C000003    
  4531. +
  4532. +#define SVC_RESTORE_ALL                \
  4533. +        ldmfd    sp, {r0 - pc}^
  4534. +        
  4535. +        .global    _ret_from_sys_call
  4536. +
  4537. +/*
  4538. + *================================================================================================
  4539. + *        Low-level interface code
  4540. + *------------------------------------------------------------------------------------------------
  4541. + *        Trap initialisation
  4542. + *------------------------------------------------------------------------------------------------
  4543. + *
  4544. + * Note - FIQ code has changed.  The default is a couple of words in 0x1c, 0x20
  4545. + * that call _unexp_fiq.  Nowever, we now copy the FIQ routine to 0x1c (removes
  4546. + * some excess cycles).
  4547. + *
  4548. + * What we need to put into 0-0x1c are ldrs to branch to 0xC0000000
  4549. + * (the kernel).
  4550. + * 0x1c onwards is reserved for FIQ, so I think that I will allocate 0xe0 onwards for
  4551. + * the actuall address to jump to.
  4552. + */
  4553. +/*
  4554. + * these go into 0x00
  4555. + */
  4556. +branches:    swi    SYS_ERROR0
  4557. +        ldr    pc, branches + 0xe4
  4558. +        ldr    pc, branches + 0xe8
  4559. +        ldr    pc, branches + 0xec
  4560. +        ldr    pc, branches + 0xf0
  4561. +        ldr    pc, branches + 0xf4
  4562. +        ldr    pc, branches + 0xf8
  4563. +        ldr    pc, . + 4
  4564. +        .word    _unexp_fiq
  4565. +/*
  4566. + * this is put into 0xe0 and above
  4567. + */
  4568. +jump_addresses:    .word    0
  4569. +        .word    vector_undefinstr
  4570. +        .word    vector_swi
  4571. +        .word    vector_prefetch
  4572. +        .word    vector_data
  4573. +        .word    vector_addrexcptn
  4574. +        .word    vector_IRQ
  4575. +/*
  4576. + * initialise the trap system
  4577. + */
  4578. +        .global    _trap_init
  4579. +_trap_init:    stmfd    sp !,{r4 - r9,lr}        @ Save link register
  4580. +        mrs    r0, cpsr_all
  4581. +        bic    r0, r0, #192 | 31
  4582. +        orr    r0, r0, #0xD3
  4583. +        msr    cpsr_all, r0
  4584. +        mov    r0, #IOC_BASE
  4585. +        str    r0, [r0, #0x18]
  4586. +        str    r0, [r0, #0x28]
  4587. +        str    r0, [r0, #0x38]
  4588. +        mov    r0, #0xE0
  4589. +        adr    r1, jump_addresses
  4590. +        ldmia    r1, {r1 - r7}
  4591. +        stmia    r0, {r1 - r7}
  4592. +        mov    r0, #0                @ Lowest location
  4593. +        adr    r1, branches
  4594. +        ldmia    r1,  {r1 - r9}
  4595. +        stmia    r0!, {r1 - r9}            @ Save all into page 0 ram
  4596. +        ldmfd    sp!, {r4 - r9, pc}^
  4597. +/*
  4598. + *------------------------------------------------------------------------------------------------
  4599. + * Undefined FIQs
  4600. + *------------------------------------------------------------------------------------------------
  4601. + * Enter in FIQ mode, spsr = ANY CPSR, lr = ANY PC
  4602. + * MUST PRESERVE SVC SPSR, but need to switch to SVC mode to show our msg.
  4603. + * Basically to switch modes, we *HAVE* to clobber one register...  brain damage alert!
  4604. + * I don't think that we can execute any code in here in any other mode than FIQ...  Ok
  4605. + * you can switch to another mode, but you can't get out of that mode without clobbering one
  4606. + * register.
  4607. + */
  4608. +_unexp_fiq:    mov    r12, #IOC_BASE
  4609. +        strb    r12, [r12, #0x38]    @ Disable FIQ register
  4610. +        subs    pc, lr, #4
  4611. +/*
  4612. + *------------------------------------------------------------------------------------------------
  4613. + * Interrupt entry dispatcher - dispatches it to the correct handler for the processor mode
  4614. + *------------------------------------------------------------------------------------------------
  4615. + * Enter in IRQ mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
  4616. + */
  4617. +LCirq:        .word    __temp_irq
  4618. +vector_IRQ:    @
  4619. +        @ save mode specific registers
  4620. +        @
  4621. +        ldr    r13, [pc, #LCirq - . - 8]
  4622. +        sub    lr, lr, #4
  4623. +        str    lr, [r13]
  4624. +        mrs    lr, spsr_all
  4625. +        str    lr, [r13, #4]
  4626. +        @
  4627. +        @ now branch to the relevent MODE handling routine
  4628. +        @
  4629. +        and    lr, lr, #15
  4630. +        cmp    lr, #4
  4631. +        addlt    pc, pc, lr, lsl #2
  4632. +        b    __irq_invalid            @ 7, 11 (ABT) (UND)
  4633. +        b    __irq_usr            @ 0  (USR)
  4634. +        b    __irq_invalid            @ 1  (FIQ)
  4635. +        b    __irq_invalid            @ 2  (IRQ)
  4636. +        b    __irq_svc            @ 3  (SVC)
  4637. +/*
  4638. + *------------------------------------------------------------------------------------------------
  4639. + * Undef instr entry dispatcher - dispatches it to the correct handler for the processor mode
  4640. + *------------------------------------------------------------------------------------------------
  4641. + * Enter in UND mode, spsr = SVC/USR CPSR, lr = SVC/USR PC
  4642. + */
  4643. +LCund:        .word    __temp_und
  4644. +vector_undefinstr:
  4645. +        @
  4646. +        @ save mode specific registers
  4647. +        @
  4648. +        ldr    r13, [pc, #LCund - . - 8]
  4649. +        str    lr, [r13]
  4650. +        mrs    lr, spsr_all
  4651. +        str    lr, [r13, #4]
  4652. +        @
  4653. +        @ now branch to the relevent MODE handling routine
  4654. +        @
  4655. +        and    lr, lr, #15
  4656. +        cmp    lr, #4
  4657. +        addlt    pc, pc, lr, lsl #2
  4658. +        b    __und_invalid            @ 7, 11 (ABT) (UND)
  4659. +        b    __und_usr            @ 0 (USR)
  4660. +        b    __und_invalid            @ 1 (FIQ)
  4661. +        b    __und_invalid            @ 2 (IRQ)
  4662. +        b    __und_svc            @ 3 (SVC)
  4663. +/*
  4664. + *------------------------------------------------------------------------------------------------
  4665. + * Prefetch abort dispatcher - dispatches it to the correct handler for the processor mode
  4666. + *------------------------------------------------------------------------------------------------
  4667. + * Enter in ABT mode, spsr = USR CPSR, lr = USR PC
  4668. + */
  4669. +LCabt:        .word    __temp_abt
  4670. +vector_prefetch:
  4671. +        @
  4672. +        @ save mode specific registers
  4673. +        @
  4674. +        sub    lr, lr, #4
  4675. +        ldr    r13, [pc, #LCabt - . - 8]
  4676. +        str    lr, [r13]
  4677. +        mrs    lr, spsr_all
  4678. +        str    lr, [r13, #4]
  4679. +        @
  4680. +        @ now branch to the relevent MODE handling routine
  4681. +        @
  4682. +        and    lr, lr, #31
  4683. +        teq    lr, #16
  4684. +        beq    __pabt_usr            @ 0 (USR)
  4685. +        b    __pabt_invalid            @ 1, 2, 3, 7, 11 (FIQ)(IRQ)(SVC)(ABT)(UND)
  4686. +/*
  4687. + *------------------------------------------------------------------------------------------------
  4688. + * Data abort dispatcher - dispatches it to the correct handler for the processor mode
  4689. + *------------------------------------------------------------------------------------------------
  4690. + * Enter in ABT mode, spsr = USR CPSR, lr = USR PC
  4691. + */
  4692. +vector_data:    @
  4693. +        @ save mode specific registers
  4694. +        @
  4695. +        sub    lr, lr, #8
  4696. +        ldr    r13, [pc, #LCabt - . - 8]
  4697. +        str    lr, [r13]
  4698. +        mrs    lr, spsr_all
  4699. +        str    lr, [r13, #4]
  4700. +        @
  4701. +        @ now branch to the relevent MODE handling routine
  4702. +        @
  4703. +        and    lr, lr, #15
  4704. +        b    __dabt_invalid            @ 7, 11 (ABT) (UND)
  4705. +        b    __dabt_usr            @ 0  (USR)
  4706. +        b    __dabt_invalid            @ 1  (FIQ)
  4707. +        b    __dabt_invalid            @ 2  (IRQ)
  4708. +        b    __dabt_svc            @ 3  (SVC)
  4709. +
  4710. +/*
  4711. + *===============================================================================
  4712. + * SWI handler
  4713. + *-------------------------------------------------------------------------------
  4714. + *
  4715. + * We now handle sys-call tracing, and the errno in the task structure.
  4716. + * Still have a problem with >4 arguments for functions.  Theres only
  4717. + * a couple of functions in the code that have 5 arguments, so Im not
  4718. + * too worried.
  4719. + */
  4720. +LC1:        .word    _current
  4721. +LC2:        .word    _sys_call_table
  4722. +/*
  4723. + * Enter in SVC mode, spsr_all = OLD_USER_cpsr_all, R14 = OLD_USER_PC
  4724. + */
  4725. +vector_swi:    sub    sp, sp, #S_FRAME_SIZE
  4726. +        stmia    sp, {r0 - lr}^            @ Calling r0 - lr
  4727. +        mov    r7, r0
  4728. +        mrs    r6, spsr
  4729. +        mov    r5, lr
  4730. +        add    r4, sp, #S_PC
  4731. +        stmia    r4, {r5, r6, r7}        @ Save calling PC, CPSR, OLD_R0
  4732. +        mov    fp, #0
  4733. +        ldr    r4, [lr, #-4]            @ get swi instruction
  4734. +        mrs    r5, cpsr            @ enable irqs
  4735. +        bic    r5, r5, #128
  4736. +        msr    cpsr, r5
  4737. +        bic    r4, r4, #0xff000000        @ mask off swi op code
  4738. +        eor    r4, r4, #OS_NUMBER << 20    @ check OS number
  4739. +        tst    r4, #0x00f00000
  4740. +        bne    bad
  4741. +retry:        cmp    r4, #NSYS_CALL            @ check upper syscall limit
  4742. +        bcs    swi_bad_call
  4743. +@        bl    _arm3_flushcache
  4744. +
  4745. +        ldr    r5, [pc, #LC1 - . - 8]
  4746. +        ldr    r5, [r5]
  4747. +        mov    ip, #0                @ zero errno
  4748. +        str    ip, [r5, #ERRNO]
  4749. +
  4750. +        ldr    ip, [r5, #FLAGS]        @ check for syscall tracing
  4751. +        tst    ip, #PF_TRACESYS
  4752. +        bne    trace_this_syscall
  4753. +
  4754. +        ldr    ip, [pc, #LC2 - . - 8]
  4755. +        mov    r9, sp                @ hack for routines needing > 4 values
  4756. +        mov    lr, pc
  4757. +        ldr    pc, [ip, r4, lsl #2]        @ call sys routine
  4758. +
  4759. +        ldr    ip, [r5, #ERRNO]        @ check errno
  4760. +        rsbs    ip, ip, #0
  4761. +        movne    r0, ip
  4762. +        streq    r0, [sp, #0]            @ returned r0
  4763. +@        bl    _arm3_flushcache
  4764. +        b    _ret_from_sys_call
  4765. +
  4766. +trace_this_syscall:
  4767. +        ldr    r7, [sp, #S_IP]
  4768. +        mov    r0, #0
  4769. +        str    r0, [sp, #S_IP]
  4770. +        bl    _syscall_trace            @ trace entry [IP must = 0]
  4771. +        str    r7, [sp, #S_IP]
  4772. +        ldmia    sp, {r0 - r3}            @ have to reload r0 - r3
  4773. +
  4774. +        ldr    ip, [pc, #LC2 - . - 8]
  4775. +        mov    r9, sp                @ hack for routines needing > 4 values
  4776. +        mov    lr, pc
  4777. +        ldr    pc, [ip, r4, lsl #2]        @ call sys routine
  4778. +
  4779. +        ldr    ip, [r5, #ERRNO]
  4780. +        rsbs    ip, ip, #0
  4781. +        movne    r0, ip
  4782. +        str    r0, [sp, #0]            @ returned r0
  4783. +
  4784. +        mov    r0, #1
  4785. +        str    r0, [sp, #S_IP]
  4786. +        bl    _syscall_trace            @ trace exit [IP must != 0]
  4787. +        str    r7, [sp, #S_IP]
  4788. +@        bl    _arm3_flushcache
  4789. +        b    _ret_from_sys_call
  4790. +
  4791. +
  4792. +swi_bad_call:    cmp    r4, #(KSWI_SYS_BASE - KSWI_BASE)@ check for arm private syscalls
  4793. +        bcs    arm_sys_call
  4794. +        bl    _sys_ni_syscall
  4795. +        str    r0, [sp, #0]            @ returned r0
  4796. +        b    _ret_from_sys_call
  4797. +
  4798. +bad:        bl    _deferred
  4799. +        ldmfd    sp, {r0 - r3}
  4800. +        b    retry
  4801. +
  4802. +arm_sys_call:    bic    r0, r4, #0x000f0000
  4803. +        mov    r1, sp
  4804. +        bl    _arm_syscall
  4805. +        b    _ret_from_sys_call
  4806. +/*
  4807. + *================================================================================================
  4808. + * Undefined instruction handler
  4809. + *------------------------------------------------------------------------------------------------
  4810. + */
  4811. +LC9:        .word    _fp_enter
  4812. +        .word    _fp_save
  4813. +        .word    _fp_restore
  4814. +
  4815. +__und_usr:    mrs    lr, cpsr            @ Change to SVC mode
  4816. +        bic    lr, lr, #31
  4817. +        orr    lr, lr, #0x13
  4818. +        msr    cpsr, lr
  4819. +        mov    r0, r0
  4820. +        sub    sp, sp, #S_FRAME_SIZE        @ Allocate frame size in one go
  4821. +        stmia    sp, {r0 - lr}^            @ Save USR r0 - lr
  4822. +        mov    r7, r0                @ OLD R0
  4823. +        ldr    r4, [pc, #LCund - . - 8]
  4824. +        ldmia    r4, {r5, r6}            @ Get USR pc, cpsr
  4825. +        add    r4, sp, #S_PC
  4826. +        stmia    r4, {r5, r6, r7}        @ Save USR pc, cpsr, old_r0
  4827. +        @
  4828. +        @ Call FP module
  4829. +        @
  4830. +        ldr    r3, [pc, #LC9 - . - 8]
  4831. +        ldr    pc, [r3]            @ Call FP module (when loaded)
  4832. +
  4833. +        .global    _fpreturn
  4834. +        .global    _fpundefinstr
  4835. +_fpundefinstr:    mov    r0, lr                @ Called by FP module on undefined instr
  4836. +        mov    r1, sp
  4837. +        mov    r2, #0
  4838. +        mrs    r4, cpsr            @ Enable interrupts
  4839. +        bic    r4, r4, #128
  4840. +        msr    cpsr, r4
  4841. +        bl    _do_undefinstr
  4842. +_fpreturn:    b    _ret_from_sys_call        @ Normal FP exit
  4843. +
  4844. +/*
  4845. + * Function to call when switching tasks to save FP state
  4846. + */
  4847. +        .global    _fpe_save
  4848. +_fpe_save:    ldr    r1, [pc, #LC9 - . - 4]
  4849. +        ldr    pc, [r1]
  4850. +
  4851. +/*
  4852. + * Function to call when switching tasks to restore FP state
  4853. + */
  4854. +        .global    _fpe_restore
  4855. +_fpe_restore:    ldr    r1, [pc, #LC9 - . - 0]
  4856. +        ldr    pc, [r1]
  4857. +
  4858. +__und_svc:    mrs    lr, cpsr
  4859. +        bic    lr, lr, #31
  4860. +        orr    lr, lr, #0x13
  4861. +        msr    cpsr, lr
  4862. +        mov    r0, r0
  4863. +        sub    sp, sp, #S_FRAME_SIZE
  4864. +        stmia    sp, {r0 - lr}            @ Save SVC r0 - lr [lr *should* be intact]
  4865. +        mov    r7, r0
  4866. +        ldr    r4, [pc, #LCund - . - 8]
  4867. +        ldmia    r4, {r5, r6}            @ Get SVC pc, cpsr
  4868. +        add    r4, sp, #S_PC
  4869. +        stmia    r4, {r5, r6, r7}        @ Save SVC pc, cpsr, old_r0
  4870. +        mov    r0, r5                @ unsigned long pc
  4871. +        mov    r1, sp                @ struct pt_regs *regs
  4872. +        and    r2, r6, #31            @ mode
  4873. +        bl    _do_undefinstr
  4874. +        ldr    lr, [sp, #S_PSR]        @ Get SVC cpsr
  4875. +        msr    spsr, lr
  4876. +        ldmia    sp, {r0 - pc}^            @ Restore SVC registers
  4877. +
  4878. +__und_invalid:    mrs    lr, cpsr
  4879. +        bic    lr, lr, #31
  4880. +        orr    lr, lr, #0x13
  4881. +        msr    cpsr, lr
  4882. +        mov    r0, r0
  4883. +        sub    sp, sp, #S_FRAME_SIZE
  4884. +        stmia    sp, {r0 - lr}
  4885. +        mov    r7, r0
  4886. +        ldr    r4, [pc, #LCund - . - 8]
  4887. +        ldmia    r4, {r5, r6}            @ Get UND/IRQ/FIQ/ABT pc, cpsr
  4888. +        add    r4, sp, #S_PC
  4889. +        stmia    r4, {r5, r6, r7}        @ Save UND/IRQ/FIQ/ABT pc, cpsr, old_r0
  4890. +        mov    r0, sp                @ struct pt_regs *regs
  4891. +        mov    r1, #BAD_UNDEFINSTR        @ int reason
  4892. +        and    r2, r6, #31            @ int mode
  4893. +        b    _bad_mode            @ Does not ever return...
  4894. +/*
  4895. + *================================================================================================
  4896. + * Prefetch abort handler
  4897. + *------------------------------------------------------------------------------------------------
  4898. + */
  4899. +__pabt_usr:    mrs    lr, cpsr            @ Change to SVC mode
  4900. +        bic    lr, lr, #31
  4901. +        orr    lr, lr, #0x13
  4902. +        msr    cpsr, lr
  4903. +        mov    r0, r0
  4904. +        sub    sp, sp, #S_FRAME_SIZE        @ Allocate frame size in one go
  4905. +        stmia    sp, {r0 - lr}^            @ Save USR r0 - lr
  4906. +        mov    r7, r0                @ OLD R0
  4907. +        ldr    r4, [pc, #LCabt - . - 8]
  4908. +        ldmia    r4, {r5, r6}            @ Get USR pc, cpsr
  4909. +        add    r4, sp, #S_PC
  4910. +        stmia    r4, {r5, r6, r7}        @ Save USR pc, cpsr, old_r0
  4911. +        tst    r6, #128
  4912. +        mrseq    r7, cpsr            @ Enable interrupts if they were
  4913. +        biceq    r7, r7, #128            @ previously
  4914. +        msreq    cpsr, r7
  4915. +        mov    r0, r5                @ unsigned long min_addr
  4916. +        add    r1, r0, #4            @ unsigned long max_addr
  4917. +        mov    r2, #0x100            @ int error_code
  4918. +        mov    r3, sp                @ struct pt_regs *regs
  4919. +        bl    _do_dataabort            @ call abort handler
  4920. +        teq    r0, #0
  4921. +        bne    _ret_from_sys_call        @ Return from sys call
  4922. +#ifdef DEBUG_UNDEF
  4923. +        adr    r0, t
  4924. +        bl    _printk
  4925. +#endif
  4926. +        mov    r0, r5
  4927. +        mov    r1, sp
  4928. +        and    r2, r6, #31
  4929. +        bl    _do_undefinstr
  4930. +        ldr    lr, [sp, #S_PSR]        @ Get SVC cpsr
  4931. +        msr    spsr, lr
  4932. +        ldmia    sp, {r0 - pc}^            @ Restore SVC registers
  4933. +
  4934. +__pabt_invalid:    mrs    lr, cpsr            @ Change to SVC mode
  4935. +        bic    lr, lr, #31
  4936. +        orr    lr, lr, #0x13
  4937. +        msr    cpsr, lr
  4938. +        mov    r0, r0
  4939. +        sub    sp, sp, #S_FRAME_SIZE        @ Allocate frame size in one go
  4940. +        stmia    sp, {r0 - lr}            @ Save XXX r0 - lr
  4941. +        mov    r7, r0                @ OLD R0
  4942. +        ldr    r4, [pc, #LCabt - . - 8]
  4943. +        ldmia    r4, {r5, r6}            @ Get XXX pc, cpsr
  4944. +        add    r4, sp, #S_PC
  4945. +        stmia    r4, {r5, r6, r7}        @ Save XXX pc, cpsr, old_r0
  4946. +        mov    r0, sp                @ Prefetch aborts are definitely *not*
  4947. +        mov    r1, #BAD_PREFETCH        @ allowed in non-user modes.  We cant
  4948. +        and    r2, r6, #31            @ recover from this problem.
  4949. +        b    _bad_mode
  4950. +
  4951. +#ifdef DEBUG_UNDEF
  4952. +t:    .ascii "*** undef ***\r\n\0"
  4953. +    .align
  4954. +#endif
  4955. +/*
  4956. + *================================================================================================
  4957. + * Address exception handler
  4958. + *------------------------------------------------------------------------------------------------
  4959. + * These aren't too critical. (they're not supposed to happen, and won't happen in 32-bit mode).
  4960. + */
  4961. +
  4962. +vector_addrexcptn:
  4963. +        b    vector_addrexcptn
  4964. +#if 0
  4965. +        sub    lr, lr, #8
  4966. +        tst    lr, #3
  4967. +        bne    addrexcptn_not_user
  4968. +        USER_SAVE_ALL
  4969. +        teq    pc, #0x00000003
  4970. +        bic    r0, lr, #0xfc000003        @ Point to instruction
  4971. +        mov    r1, sp                @ Point to registers
  4972. +        mov    r2, #0x400
  4973. +        bl    _do_excpt
  4974. +        b    _ret_from_sys_call
  4975. +
  4976. +addrexcptn_not_user:
  4977. +        SVC_SAVE_ALL
  4978. +        and    r2, lr, #3
  4979. +        teq    r2, #3
  4980. +        bne    addrexcptn_illegal_mode
  4981. +        teqp    pc, #0x00000003            @ NOT a problem - doesnt change mode
  4982. +        bic    r0, lr, #0xfc000003
  4983. +        mov    r1, sp
  4984. +        orr    r2, r2, #0x400
  4985. +        bl    _do_excpt
  4986. +        ldmia    sp, {r0 - lr}            @ I cant remember the reason I changed this...
  4987. +        add    sp, sp, #15*4
  4988. +        movs    pc, lr
  4989. +
  4990. +addrexcptn_illegal_mode:
  4991. +        mov    r0, sp
  4992. +        str    lr, [sp, #-4]!
  4993. +        orr    r1, r2, #0x0c000000
  4994. +        teqp    r1, #0                @ change into mode (wont be user mode)
  4995. +        mov    r0, r0
  4996. +        mov    r1, r8                @ Any register from r8 - r14 can be banked
  4997. +        mov    r2, r9
  4998. +        mov    r3, r10
  4999. +        mov    r4, r11
  5000. +        mov    r5, r12
  5001. +        mov    r6, r13
  5002. +        mov    r7, r14
  5003. +        teqp    pc, #0x04000003            @ back to svc
  5004. +        mov    r0, r0
  5005. +        stmfd    sp!, {r1-r7}
  5006. +        ldmia    r0, {r0-r7}
  5007. +        stmfd    sp!, {r0-r7}
  5008. +        mov    r0, sp
  5009. +        mov    r1, #BAD_ADDREXCPTN
  5010. +        b    _bad_mode
  5011. +#endif
  5012. +/*
  5013. + *================================================================================================
  5014. + * Interrupt (IRQ) handler (r13 points to irq temp save area)
  5015. + * MOD: if in user mode, then *no* kernel routine is running, so dont have to
  5016. + *      save svc lr
  5017. + *------------------------------------------------------------------------------------------------
  5018. + */
  5019. +LC5:        .word    _irqjump
  5020. +__irq_usr:    mrs    lr, cpsr            @ switch to SVC mode
  5021. +        bic    lr, lr, #31
  5022. +        orr    lr, lr, #0x13
  5023. +        msr    cpsr, lr
  5024. +        mov    r0, r0
  5025. +        sub    sp, sp, #S_FRAME_SIZE
  5026. +        stmia    sp, {r0 - lr}^            @ save r0 - lr
  5027. +        mov    r7, r0
  5028. +        ldr    r4, [pc, #LCirq - . - 8]
  5029. +        ldmia    r4, {r5, r6}            @ get saved PC, SPSR
  5030. +        add    r4, sp, #S_PC
  5031. +        stmia    r4, {r5, r6, r7}        @ save pc, psr, old_r0
  5032. +urepeat:    mov    r4, #IOC_BASE            @ point at IOC
  5033. +        ldrb    r1, [r4, #0x24]            @ get high priority first
  5034. +        adr    r2, irq_prio_h
  5035. +        teq    r1, #0
  5036. +        ldreqb    r1, [r4, #0x14]            @ get low priority
  5037. +        adreq    r2, irq_prio_l
  5038. +        teq    r1, #0
  5039. +        beq    _ret_from_sys_call
  5040. +        ldrb    r0, [r2, r1]            @ Get IRQ number
  5041. +        ldr    r2, [pc, #LC5 - . - 8]
  5042. +        mov    r1, sp
  5043. +        mov    lr, pc
  5044. +        @
  5045. +        @ routine gets called with r0 = interrupt number, r1 = struct pt_regs *
  5046. +        @
  5047. +        ldr    pc, [r2, r0, lsl#2]
  5048. +        mov    r2, #0
  5049. +        teq    r0, #0                @ Check to see if it is a fast IRQ
  5050. +        beq    _ret_from_sys_call
  5051. +        ldr    fp, [sp, #S_PSR]        @ Get saved SPSR
  5052. +        bic    fp, fp, #192 | 15
  5053. +        orr    fp, fp, #16            @ Force USER mode, IRQs+FIQs on
  5054. +        msr    spsr, fp            @ restore SPSR
  5055. +        ldmia    sp, {r0 - lr}^            @ Get calling r0 - lr
  5056. +        mov    r0, r0
  5057. +        add    sp, sp, #S_PC
  5058. +        ldr    lr, [sp], #12
  5059. +        movs    pc, lr
  5060. +
  5061. +LC65:
  5062. +        .word    _intr_count            @ -8
  5063. +        .word    _bh_mask            @ -4
  5064. +        .word    _bh_active            @ -0
  5065. +
  5066. +__irq_svc:    mrs    lr, cpsr            @ switch to SVC mode
  5067. +        bic    lr, lr, #31
  5068. +        orr    lr, lr, #0x13
  5069. +        msr    cpsr, lr
  5070. +        mov    r0, r0
  5071. +        sub    sp, sp, #S_FRAME_SIZE
  5072. +        stmia    sp, {r0 - lr}            @ save SVC r0 - lr
  5073. +        mov    r7, #-1
  5074. +        ldr    r4, [pc, #LCirq - . - 8]
  5075. +        ldmia    r4, {r5, r6}            @ saved pc, psr
  5076. +        add    r4, sp, #S_PC
  5077. +        stmia    r4, {r5, r6, r7}        @ save SVC PC, PSR, old_r0
  5078. +        mov    fp, #0
  5079. +srepeat:    mov    r4, #IOC_BASE        @ point at IOC
  5080. +        ldrb    r1, [r4, #0x24]        @ get high priority first
  5081. +        adr    r2, irq_prio_h
  5082. +        teq    r1, #0
  5083. +        ldreqb    r1, [r4, #0x14]        @ get low priority
  5084. +        adreq    r2, irq_prio_l
  5085. +        teq    r1, #0
  5086. +        beq    no_irq2
  5087. +        ldrb    r0, [r2, r1]        @ Get IRQ number
  5088. +        ldr    r2, [pc, #LC5 - . - 8]
  5089. +        mov    r1, sp
  5090. +        mov    lr, pc
  5091. +        @
  5092. +        @ routine gets called with r0 = interrupt number, r1 = struct pt_regs *
  5093. +        @
  5094. +        ldr    pc, [r2, r0, lsl#2]
  5095. +        mov    r2, #1
  5096. +        teq    r0, #0            @ Check to see if it is a fast IRQ
  5097. +        bne    srepeat
  5098. +        ldr    r0, [pc, #LC65 - . - 8]
  5099. +        ldr    r1, [r0]
  5100. +        teq    r1, #0
  5101. +        bne    srepeat
  5102. +        mov    r4, r0
  5103. +        mov    r5, r1
  5104. +        ldr    r6, [pc, #LC65 - . - 4]
  5105. +        ldr    r7, [pc, #LC65 - . - 0]
  5106. +recheck_bh2:    ldr    r0, [r6]
  5107. +        ldr    r1, [r7]
  5108. +        tst    r0, r1
  5109. +        beq    srepeat
  5110. +        add    r0, r5, #1
  5111. +        str    r0, [r4]
  5112. +        mov    r8, pc
  5113. +        teqp    pc, #0x00000003
  5114. +        bl    _do_bottom_half
  5115. +        teqp    r8, #0
  5116. +        str    r5, [r4]
  5117. +        b    recheck_bh2
  5118. +no_irq2:    ldr    r0, [sp, #S_PSR]
  5119. +        msr    spsr, r0
  5120. +        ldmfd    sp, {r0 - pc}^
  5121. +
  5122. +__irq_invalid:    mrs    lr, cpsr        @ switch to svc mode
  5123. +        bic    lr, lr, #31
  5124. +        orr    lr, lr, #0x13
  5125. +        msr    cpsr, lr
  5126. +        mov    r0, r0
  5127. +        sub    sp, sp, #S_FRAME_SIZE    @ Allocate space on stack for frame
  5128. +        stmfd    sp, {r0 - lr}        @ Save r0 - lr
  5129. +        mov    r7, #-1
  5130. +        ldr    r4, [pc, #LCirq - . - 8]
  5131. +        ldmia    r4, {r5, r6}        @ get saved pc, psr
  5132. +        add    r4, sp, #S_PC
  5133. +        stmia    r4, {r5, r6, r7}
  5134. +        mov    fp, #0
  5135. +        mov    r0, sp
  5136. +        mov    r1, #BAD_IRQ
  5137. +        b    _bad_mode
  5138. +/*
  5139. + *================================================================================================
  5140. + * Data abort handler code
  5141. + *------------------------------------------------------------------------------------------------
  5142. + * This needs some work ...
  5143. + */
  5144. +__dabt_usr:    mrs    lr, cpsr            @ Change to SVC mode
  5145. +        bic    lr, lr, #31
  5146. +        orr    lr, lr, #0x13
  5147. +        msr    cpsr, lr
  5148. +        mov    r0, r0
  5149. +        sub    sp, sp, #S_FRAME_SIZE        @ Allocate frame size in one go
  5150. +        stmia    sp, {r0 - lr}^            @ Save USR r0 - lr
  5151. +        mov    r7, r0                @ OLD R0
  5152. +        ldr    r4, [pc, #LCabt - . - 8]
  5153. +        ldmia    r4, {r5, r6}            @ Get USR pc, cpsr
  5154. +        add    r4, sp, #S_PC
  5155. +        stmia    r4, {r5, r6, r7}        @ Save USR pc, cpsr, old_r0
  5156. +        tst    r6, #128
  5157. +        mrseq    r7, cpsr            @ Enable interrupts if they were
  5158. +        biceq    r7, r7, #128            @ previously
  5159. +        msreq    cpsr, r7
  5160. +
  5161. +__dabt_svc:    mrs    lr, cpsr
  5162. +        bic    lr, lr, #31
  5163. +        orr    lr, lr, #0x13
  5164. +        msr    cpsr, lr
  5165. +        mov    r0, r0
  5166. +        sub    sp, sp, #S_FRAME_SIZE
  5167. +        stmia    sp, {r0 - lr}            @ Save SVC r0 - lr [lr *should* be intact]
  5168. +        mov    r7, r0
  5169. +        ldr    r4, [pc, #LCabt - . - 8]
  5170. +        ldmia    r4, {r5, r6}            @ Get SVC pc, cpsr
  5171. +        add    r4, sp, #S_PC
  5172. +        stmia    r4, {r5, r6, r7}        @ Save SVC pc, cpsr, old_r0
  5173. +        tst    r6, #128
  5174. +        mrseq    r7, cpsr            @ Enable interrupts if they were
  5175. +        biceq    r7, r7, #128            @ previously
  5176. +        msreq    cpsr, r7
  5177. +
  5178. +__dabt_invalid:    mrs    lr, cpsr
  5179. +        bic    lr, lr, #31
  5180. +        orr    lr, lr, #0x13
  5181. +        msr    cpsr, lr
  5182. +        mov    r0, r0
  5183. +        sub    sp, sp, #S_FRAME_SIZE
  5184. +        stmia    sp, {r0 - lr}            @ Save SVC r0 - lr [lr *should* be intact]
  5185. +        mov    r7, r0
  5186. +        ldr    r4, [pc, #LCabt - . - 8]
  5187. +        ldmia    r4, {r5, r6}            @ Get SVC pc, cpsr
  5188. +        add    r4, sp, #S_PC
  5189. +        stmia    r4, {r5, r6, r7}        @ Save SVC pc, cpsr, old_r0
  5190. +        mov    r0, sp
  5191. +        mov    r1, #BAD_DATA
  5192. +        and    r2, r6, #31
  5193. +        b    _bad_mode
  5194. +#if 0
  5195. +vector_data:    b    vector_data
  5196. +        sub    lr, lr, #8        @ Correct lr
  5197. +        tst    lr, #3
  5198. +        bne    data_not_user
  5199. +        USER_SAVE_ALL
  5200. +        tst    lr, #0x08000000
  5201. +        teqeqp    pc, #0x00000003        @ NOT a problem - doesnt change mode
  5202. +        bic    r0, lr, #0xFC000003
  5203. +        mov    r2, #0
  5204. +        mov    r3, sp
  5205. +        bl    data_do
  5206. +        b    _ret_from_sys_call
  5207. +
  5208. +data_not_user:    
  5209. +        SVC_SAVE_ALL
  5210. +        and    r2,lr,#3
  5211. +        teq    r2,#3
  5212. +        bne    data_illegal_mode
  5213. +        tst    lr,#0x08000000
  5214. +        teqeqp    pc,#0x00000003        @ NOT a problem - doesnt change mode
  5215. +        bic    r0,lr,#0xFC000003
  5216. +        mov    r3,sp
  5217. +        bl    data_do
  5218. +        SVC_RESTORE_ALL
  5219. +#endif
  5220. +/*
  5221. + * Interrupt table (incorporates priority)
  5222. + */
  5223. +irq_prio_l:    .byte     0, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
  5224. +        .byte     4, 0, 1, 0, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3
  5225. +        .byte     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
  5226. +        .byte     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
  5227. +        .byte     6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3
  5228. +        .byte     6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 3, 3, 3, 3, 3
  5229. +        .byte     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
  5230. +        .byte     5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
  5231. +        .byte     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
  5232. +        .byte     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
  5233. +        .byte     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
  5234. +        .byte     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
  5235. +        .byte     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
  5236. +        .byte     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
  5237. +        .byte     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
  5238. +        .byte     7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
  5239. +irq_prio_h:    .byte     0, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10
  5240. +        .byte    12, 8, 9, 8,10,10,10,10,11,11,11,11,10,10,10,10
  5241. +        .byte    13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
  5242. +        .byte    13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
  5243. +        .byte    14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10
  5244. +        .byte    14,14,14,14,10,10,10,10,11,11,11,11,10,10,10,10
  5245. +        .byte    13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
  5246. +        .byte    13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
  5247. +        .byte    15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
  5248. +        .byte    15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
  5249. +        .byte    13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
  5250. +        .byte    13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
  5251. +        .byte    15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
  5252. +        .byte    15,15,15,15,10,10,10,10,11,11,11,11,10,10,10,10
  5253. +        .byte    13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
  5254. +        .byte    13,13,13,13,10,10,10,10,11,11,11,11,10,10,10,10
  5255. +#if 0
  5256. +@ ----------------------------------------------------------------------------------------------
  5257. +@
  5258. +@ This is where I wish that the ARM would tell you which address aborted.
  5259. +@
  5260. +
  5261. +data_do:    ldr    r5, [r0]        @ Get instruction
  5262. +        tst    r5, #1<<20        @ Check to see if it is a write instruction
  5263. +        orreq    r2, r2, #0x20        @ Indicate write instruction
  5264. +        tst    r5, #1 << 26        @ Check LDMSTM/LDRSTRLDCSTC
  5265. +        bne    data_ldrstrldcstc    @ If set, then it is not LDMSTM
  5266. +
  5267. +        mov    r6, #1 << 15
  5268. +        mov    r7, #0
  5269. +data_ldmstm_cr:    tst    r5, r6            @ Check this register
  5270. +        addne    r7, r7, #4        @ If set, then another register
  5271. +        movs    r6, r6, lsr#1
  5272. +        bne    data_ldmstm_cr
  5273. +        eor    r1, r5, r5, lsl#2
  5274. +        tst    r1, #1<<23        @ Check inc/dec bit ^ writeback
  5275. +        rsbeq    r7, r7, #0
  5276. +        mov    r4, r5, lsr#(16-2)    @ Get base register
  5277. +        and    r4, r4, #15*4        @ Mask out register
  5278. +        ldr    r0, [r3, r4]        @ Get reg
  5279. +        add    r7, r0, r7        @ Do correction (signed)
  5280. +        moveq    r1, r0
  5281. +        moveq    r0, r7
  5282. +        movne    r1, r7
  5283. +        tst    r5, #1<<21
  5284. +        strne    r7, [r3, r4]
  5285. +        teq    r4, #15*4        @ CHECK FOR PC
  5286. +        biceq    r1, r1, #0xfc000003
  5287. +        biceq    r0, r0, #0xfc000003
  5288. +        orr    r2, r2, #0x200
  5289. +        b    _do_dataabort
  5290. +
  5291. +data_ldrstrldcstc:
  5292. +        mov    r6, r5, lsr#(16-2)    @ Get Rn
  5293. +        and    r6, r6, #15*4        @ Mask out register
  5294. +        teq    r6, #15*4        @ CHECK FOR PC
  5295. +        ldr    r6, [r3, r6]        @ Get register
  5296. +        biceq    r6, r6, #0xfc000003
  5297. +        tst    r5, #1 << 24        @ Check index type bit
  5298. +        beq    ldrstrpost        @ Post indexing?
  5299. +        tst    r5, #1 << 27        @ Get LDRSTR/LDCSTC bit
  5300. +        bne    instrldcstc        @ If set, do LDC/STC instruction
  5301. +        tst    r5, #1 << 25        @ Check immediate bit
  5302. +        bne    ldrstrregval        @ Register is specified
  5303. +        mov    r1, #0xff
  5304. +        orr    r1, r1, #0xf00
  5305. +        and    r7, r5, r1
  5306. +ldrstrsubadd:
  5307. +        tst    r5, #1 << 23
  5308. +        addne    r1, r6, r7
  5309. +        movne    r0, r6
  5310. +        moveq    r1, r6            @ Set higher address same
  5311. +        subeq    r0, r6, r7        @ Apply correction
  5312. +        orr    r2, r2, #0x300
  5313. +        b    _do_dataabort
  5314. +
  5315. +ldrstrpost:    mov    r0, r6
  5316. +        mov    r1, r0            @ Set higher address same
  5317. +        tst    r5, #1 << 21
  5318. +        bicne    r2, r2, #3        @ If T bit is set, force user mode
  5319. +        orr    r2, r2, #0x400
  5320. +        b    _do_dataabort
  5321. +
  5322. +ldrstrregval:    and    r7, r5,#15
  5323. +        teq    r7, #15            @ CHECK FOR PC
  5324. +        ldr    r7, [r3, r7, lsl#2]    @ Get Rm
  5325. +        biceq    r7, r7, #0xfc000003
  5326. +        and    r8, r5, #0x60        @ Get shift types
  5327. +        mov    r9, r5, lsr#7
  5328. +        and    r9, r9, #31        @ Get shift amount
  5329. +        teq    r8, #0            @ LSL shift
  5330. +        moveq    r7, r7, lsl r9
  5331. +        teq    r8, #0x20        @ LSR shift
  5332. +        moveq    r7, r7, lsr r9
  5333. +        teq    r8, #0x40        @ ASR shift
  5334. +        moveq    r7, r7, asr r9
  5335. +        teq    r8, #0x60        @ ROR shift
  5336. +        moveq    r7, r7, ror r9
  5337. +        tst    r5, #1 << 23
  5338. +        addne    r0, r6, r7
  5339. +        subeq    r0, r6, r7        @ Apply correction
  5340. +        mov    r1, r0
  5341. +        orr    r2, r2, #0x500
  5342. +        b    _do_dataabort
  5343. +
  5344. +instrldcstc:    and    r7, r5, #255        @ Get offset
  5345. +        orr    r2, r2, #0x600
  5346. +        B    ldrstrsubadd
  5347. +#endif
  5348. +/*
  5349. + *================================================================================================
  5350. + * All exits to user mode from the kernel go through this code.
  5351. + */
  5352. +
  5353. +LC6:
  5354. +        .word    _intr_count        @ -8
  5355. +        .word    _bh_mask        @ -4
  5356. +        .word    _bh_active        @ -0
  5357. +        .word    _need_resched        @ +4
  5358. +        .word    _current        @ +8
  5359. +        .word    _init_task        @ +12
  5360. +
  5361. +reschedule:    bl    _schedule
  5362. +
  5363. +_ret_from_sys_call:
  5364. +        ldr    r4, [pc, #LC6 - . - 8]
  5365. +        ldr    r5, [r4]
  5366. +        teq    r5, #0
  5367. +        bne    ret_no_check
  5368. +        ldr    r6, [pc, #LC6 - . - 4]
  5369. +        ldr    r7, [pc, #LC6 - . - 0]
  5370. +recheck_bh:    ldr    r0, [r6]
  5371. +        ldr    r1, [r7]
  5372. +        tst    r0, r1
  5373. +        beq    no_handle_bh
  5374. +handle_bottom_half:
  5375. +        add    r0, r5, #1
  5376. +        str    r0, [r4]
  5377. +        mov    r8, pc
  5378. +        mrs    lr, cpsr_all
  5379. +        bic    lr, lr, #128
  5380. +        msr    cpsr_all, lr
  5381. +        bl    _do_bottom_half
  5382. +        teqp    r8, #0
  5383. +        str    r5, [r4]
  5384. +        b    recheck_bh
  5385. +no_handle_bh:    mrs    lr, cpsr_all
  5386. +        bic    lr, lr, #128
  5387. +        msr    cpsr_all, lr
  5388. +        ldr    r0, [pc, #LC6 - . + 4]
  5389. +        ldr    r0, [r0]
  5390. +        teq    r0, #0
  5391. +        bne    reschedule
  5392. +        ldr    r4, [pc, #LC6 - . + 8]
  5393. +        ldr    r4, [r4]
  5394. +        ldr    r0, [pc, #LC6 - . + 12]
  5395. +        teq    r4, r0
  5396. +        beq    ret_no_check
  5397. +        ldr    r0, [r4, #STATE]
  5398. +        teq    r0, #0
  5399. +        bne    reschedule
  5400. +        ldr    r0, [r4, #COUNTER]
  5401. +        teq    r0, #0
  5402. +        beq    reschedule
  5403. +        ldr    r1, [r4, #SIGNAL]
  5404. +        ldr    r0, [r4, #BLOCKED]
  5405. +        bics    r1, r1, r0
  5406. +        movne    r1, sp
  5407. +        blne    _do_signal
  5408. +ret_no_check:    mrs    lr, cpsr_all            @ disable IRQs
  5409. +        orr    lr, lr, #128
  5410. +        msr    cpsr_all, lr
  5411. +        ldr    fp, [sp, #S_PSR]        @ Get calling cpsr
  5412. +        bic    fp, fp, #192 | 15
  5413. +        orr    fp, fp, #16            @ Force USER mode, IRQs+FIQs on
  5414. +        msr    spsr_all, fp
  5415. +        ldmia    sp, {r0 - lr}^            @ Get calling r0 - lr
  5416. +        mov    r0, r0
  5417. +        add    sp, sp, #S_PC
  5418. +        ldr    lr, [sp], #12            @ Get PC and jump over PC, PSR, OLD_R0
  5419. +        movs    pc, lr
  5420. +
  5421. +_arm3_flushcache:
  5422. +        mcr    15, 0, r0, c1, c0        @ flush cache
  5423. +        movs    pc, lr
  5424. +
  5425. +_fpnull:    mov    pc, lr
  5426. +
  5427. +        .data
  5428. +
  5429. +        .global    _fp_enter
  5430. +        .global    _fp_save
  5431. +        .global    _fp_restore
  5432. +
  5433. +_fp_enter:    .word    _fpundefinstr
  5434. +_fp_save:    .word    _fpnull
  5435. +_fp_restore:    .word    _fpnull
  5436. +
  5437. +_temp_irq:    .word    0                @ saved lr_irq
  5438. +        .word    0                @ saved spsr_irq
  5439. +
  5440. +_temp_und:    .word    0                @ Saved lr_und
  5441. +        .word    0                @ Saved spsr_und
  5442. +
  5443. +_temp_abt:    .word    0                @ Saved lr_abt
  5444. +        .word    0                @ Saved spsr_abt
  5445. diff -urN linux.store/linux/arch/arm/lib/traps.S linux/arch/arm/lib/traps.S
  5446. --- linux.store/linux/arch/arm/lib/traps.S    Sun Mar  3 13:18:51 1996
  5447. +++ linux/arch/arm/lib/traps.S    Thu Mar 28 10:32:04 1996
  5448. @@ -23,6 +23,8 @@
  5449.  
  5450.  #include <asm/assembler.h>
  5451.  #include <asm/errno.h>
  5452. +#include <asm/hardware.h>
  5453. +
  5454.          .text
  5455.  
  5456.  @ Offsets into task structure
  5457. @@ -46,10 +48,6 @@
  5458.  #define BAD_ADDREXCPTN    2
  5459.  #define BAD_IRQ        3
  5460.  
  5461. -@ Address of start of IOC
  5462. -@
  5463. -#define IOC        0x03200000
  5464. -
  5465.  @ Number of syscalls accepted
  5466.  @
  5467.  #define NSYS_CALL    142
  5468. @@ -145,10 +143,10 @@
  5469.          bic    r4, r4, #0xff000000        @ mask off swi op code
  5470.          eor    r4, r4, #OS_NUMBER << 20    @ check OS number
  5471.          tst    r4, #0x00f00000
  5472. -        bne    bad
  5473. -retry:        cmp    r4, #NSYS_CALL            @ check upper syscall limit
  5474. -        bcs    swi_bad_call
  5475. -        bl    _arm3_flushcache
  5476. +        bne    Lbad
  5477. +Lretry:        cmp    r4, #NSYS_CALL            @ check upper syscall limit
  5478. +        bcs    Lswi_bad_call
  5479. +        bl    _armcache_flush
  5480.  
  5481.          ldr    r5, [pc, #LC1 - . - 8]
  5482.          ldr    r5, [r5]
  5483. @@ -157,7 +155,7 @@
  5484.  
  5485.          ldr    ip, [r5, #FLAGS]        @ check for syscall tracing
  5486.          tst    ip, #PF_TRACESYS
  5487. -        bne    trace_this_syscall
  5488. +        bne    Ltrace_this_syscall
  5489.  
  5490.          ldr    ip, [pc, #LC2 - . - 8]
  5491.          mov    r9, sp                @ hack for routines needing > 4 values
  5492. @@ -168,10 +166,10 @@
  5493.          rsbs    ip, ip, #0
  5494.          movne    r0, ip
  5495.          streq    r0, [sp, #0]            @ returned r0
  5496. -        bl    _arm3_flushcache
  5497. +        bl    _armcache_flush
  5498.          b    _ret_from_sys_call
  5499.  
  5500. -trace_this_syscall:
  5501. +Ltrace_this_syscall:
  5502.          ldr    r7, [sp, #S_IP]
  5503.          mov    r0, #0
  5504.          str    r0, [sp, #S_IP]
  5505. @@ -193,21 +191,21 @@
  5506.          str    r0, [sp, #S_IP]
  5507.          bl    _syscall_trace            @ trace exit [IP must != 0]
  5508.          str    r7, [sp, #S_IP]
  5509. -        bl    _arm3_flushcache
  5510. +        bl    _armcache_flush
  5511.          b    _ret_from_sys_call
  5512.  
  5513.  
  5514. -swi_bad_call:    cmp    r4, #(KSWI_SYS_BASE - KSWI_BASE)@ check for arm private syscalls
  5515. -        bcs    arm_sys_call
  5516. +Lswi_bad_call:    cmp    r4, #(KSWI_SYS_BASE - KSWI_BASE)@ check for arm private syscalls
  5517. +        bcs    Larm_sys_call
  5518.          bl    _sys_ni_syscall
  5519.          str    r0, [sp, #0]            @ returned r0
  5520.          b    _ret_from_sys_call
  5521.  
  5522. -bad:        bl    _deferred
  5523. +Lbad:        bl    _deferred
  5524.          ldmfd    sp, {r0 - r3}
  5525. -        b    retry
  5526. +        b    Lretry
  5527.  
  5528. -arm_sys_call:    bic    r0, r4, #0x000f0000
  5529. +Larm_sys_call:    bic    r0, r4, #0x000f0000
  5530.          mov    r1, sp
  5531.          bl    _arm_syscall
  5532.          b    _ret_from_sys_call
  5533. @@ -368,7 +366,7 @@
  5534.  
  5535.  fiqmsg:        .ascii    "*** Unexpeced FIQ\n\0"
  5536.  
  5537. -_unexp_fiq:    mov    r12, #IOC
  5538. +_unexp_fiq:    mov    r12, #IOC_BASE
  5539.          strb    r12, [r12, #0x38]    @ Disable FIQ register
  5540.          teqp    pc, #0x0c000003
  5541.          mov    r0, r0
  5542. @@ -383,7 +381,7 @@
  5543.          .global    _trap_init
  5544.  _trap_init:    stmfd    sp !,{r4 - r9,lr}    @ Save link register
  5545.          teqp    pc, #0x0c000003
  5546. -        mov    r0, #IOC
  5547. +        mov    r0, #IOC_BASE
  5548.          str    r0, [r0, #0x18]
  5549.          str    r0, [r0, #0x28]
  5550.          str    r0, [r0, #0x38]
  5551. @@ -407,7 +405,7 @@
  5552.          ldmfd    sp!, {r4 - r9, pc}^
  5553.  
  5554.  LC4:
  5555. -        .word    _irq_temp
  5556. +        .word    Lirq_temp
  5557.  LC5:
  5558.          .word    _irqjump
  5559.  
  5560. @@ -426,7 +424,7 @@
  5561.          ldr    lr, [pc, #LC4 - . - 8]
  5562.          ldr    lr, [lr]
  5563.          USER_SAVE_ALL
  5564. -urepeat:    mov    r4, #IOC            @ point at IOC
  5565. +urepeat:    mov    r4, #IOC_BASE        @ point at IOC
  5566.          ldrb    r1, [r4, #0x24]        @ get high priority first
  5567.          adr    r2, irq_prio_h
  5568.          teq    r1, #0
  5569. @@ -458,7 +456,7 @@
  5570.                  and    r2, lr, #3
  5571.          teq    r2, #3
  5572.          bne    irq_illegal_mode
  5573. -srepeat:    mov    r4, #IOC        @ point at IOC
  5574. +srepeat:    mov    r4, #IOC_BASE        @ point at IOC
  5575.          ldrb    r1, [r4, #0x24]        @ get high priority first
  5576.          adr    r2, irq_prio_h
  5577.          teq    r1, #0
  5578. @@ -582,14 +580,15 @@
  5579.          tst    r5, #1<<20        @ Check to see if it is a write instruction
  5580.          orreq    r2, r2, #0x20        @ Indicate write instruction
  5581.          tst    r5, #1 << 26        @ Check LDMSTM/LDRSTRLDCSTC
  5582. -        bne    data_ldrstrldcstc    @ If set, then it is not LDMSTM
  5583. +        bne    Ldata_ldrstrldcstc    @ If set, then it is not LDMSTM
  5584.  
  5585.          mov    r6, #1 << 15
  5586.          mov    r7, #0
  5587. -data_ldmstm_cr:    tst    r5, r6            @ Check this register
  5588. +Ldata_ldmstm_cr:
  5589. +        tst    r5, r6            @ Check this register
  5590.          addne    r7, r7, #4        @ If set, then another register
  5591.          movs    r6, r6, lsr#1
  5592. -        bne    data_ldmstm_cr
  5593. +        bne    Ldata_ldmstm_cr
  5594.          eor    r1, r5, r5, lsl#2
  5595.          tst    r1, #1<<23        @ Check inc/dec bit ^ writeback
  5596.          rsbeq    r7, r7, #0
  5597. @@ -608,22 +607,22 @@
  5598.          orr    r2, r2, #0x200
  5599.          b    _do_dataabort
  5600.  
  5601. -data_ldrstrldcstc:
  5602. +Ldata_ldrstrldcstc:
  5603.          mov    r6, r5, lsr#(16-2)    @ Get Rn
  5604.          and    r6, r6, #15*4        @ Mask out register
  5605.          teq    r6, #15*4        @ CHECK FOR PC
  5606.          ldr    r6, [r3, r6]        @ Get register
  5607.          biceq    r6, r6, #0xfc000003
  5608.          tst    r5, #1 << 24        @ Check index type bit
  5609. -        beq    ldrstrpost        @ Post indexing?
  5610. +        beq    Lldrstrpost        @ Post indexing?
  5611.          tst    r5, #1 << 27        @ Get LDRSTR/LDCSTC bit
  5612. -        bne    instrldcstc        @ If set, do LDC/STC instruction
  5613. +        bne    Linstrldcstc        @ If set, do LDC/STC instruction
  5614.          tst    r5, #1 << 25        @ Check immediate bit
  5615. -        bne    ldrstrregval        @ Register is specified
  5616. +        bne    Lldrstrregval        @ Register is specified
  5617.          mov    r1, #0xff
  5618.          orr    r1, r1, #0xf00
  5619.          and    r7, r5, r1
  5620. -ldrstrsubadd:
  5621. +Lldrstrsubadd:
  5622.          tst    r5, #1 << 23
  5623.          addne    r1, r6, r7
  5624.          movne    r0, r6
  5625. @@ -632,14 +631,14 @@
  5626.          orr    r2, r2, #0x300
  5627.          b    _do_dataabort
  5628.  
  5629. -ldrstrpost:    mov    r0, r6
  5630. +Lldrstrpost:    mov    r0, r6
  5631.          mov    r1, r0            @ Set higher address same
  5632.          tst    r5, #1 << 21
  5633.          bicne    r2, r2, #3        @ If T bit is set, force user mode
  5634.          orr    r2, r2, #0x400
  5635.          b    _do_dataabort
  5636.  
  5637. -ldrstrregval:    and    r7, r5,#15
  5638. +Lldrstrregval:    and    r7, r5,#15
  5639.          teq    r7, #15            @ CHECK FOR PC
  5640.          ldr    r7, [r3, r7, lsl#2]    @ Get Rm
  5641.          biceq    r7, r7, #0xfc000003
  5642. @@ -661,9 +660,9 @@
  5643.          orr    r2, r2, #0x500
  5644.          b    _do_dataabort
  5645.  
  5646. -instrldcstc:    and    r7, r5, #255        @ Get offset
  5647. +Linstrldcstc:    and    r7, r5, #255        @ Get offset
  5648.          orr    r2, r2, #0x600
  5649. -        B    ldrstrsubadd
  5650. +        B    Lldrstrsubadd
  5651.  
  5652.  @ ===============================================================================
  5653.  @
  5654. @@ -678,20 +677,20 @@
  5655.          .word    _current        @ +8
  5656.          .word    _init_task        @ +12
  5657.  
  5658. -reschedule:    bl    _schedule
  5659. +Lreschedule:    bl    _schedule
  5660.  
  5661.  _ret_from_sys_call:
  5662.          ldr    r4, [pc, #LC6 - . - 8]
  5663.          ldr    r5, [r4]
  5664.          teq    r5, #0
  5665. -        bne    ret_no_check
  5666. +        bne    Lret_no_check
  5667.          ldr    r6, [pc, #LC6 - . - 4]
  5668.          ldr    r7, [pc, #LC6 - . - 0]
  5669. -recheck_bh:    ldr    r0, [r6]
  5670. +Lrecheck_bh:    ldr    r0, [r6]
  5671.          ldr    r1, [r7]
  5672.          tst    r0, r1
  5673. -        beq    no_handle_bh
  5674. -handle_bottom_half:
  5675. +        beq    Lno_handle_bh
  5676. +Lhandle_bottom_half:
  5677.          add    r0, r5, #1
  5678.          str    r0, [r4]
  5679.          mov    r8, pc
  5680. @@ -699,32 +698,32 @@
  5681.          bl    _do_bottom_half
  5682.          teqp    r8, #0
  5683.          str    r5, [r4]
  5684. -        b    recheck_bh
  5685. -no_handle_bh:    teqp    pc, #0x00000003
  5686. +        b    Lrecheck_bh
  5687. +Lno_handle_bh:    teqp    pc, #0x00000003
  5688.          ldr    r0, [pc, #LC6 - . + 4]
  5689.          ldr    r0, [r0]
  5690.          teq    r0, #0
  5691. -        bne    reschedule
  5692. +        bne    Lreschedule
  5693.          ldr    r4, [pc, #LC6 - . + 8]
  5694.          ldr    r4, [r4]
  5695.          ldr    r0, [pc, #LC6 - . + 12]
  5696.          teq    r4, r0
  5697. -        beq    ret_no_check
  5698. +        beq    Lret_no_check
  5699.          ldr    r0, [r4, #STATE]
  5700.          teq    r0, #0
  5701. -        bne    reschedule
  5702. +        bne    Lreschedule
  5703.          ldr    r0, [r4, #COUNTER]
  5704.          teq    r0, #0
  5705. -        beq    reschedule
  5706. +        beq    Lreschedule
  5707.          ldr    r1, [r4, #SIGNAL]
  5708.          ldr    r0, [r4, #BLOCKED]
  5709.          bics    r1, r1, r0
  5710.          movne    r1, sp
  5711.          blne    _do_signal
  5712. -ret_no_check:    USER_RESTORE_ALL
  5713. +Lret_no_check:    USER_RESTORE_ALL
  5714.  
  5715. -        .global    _arm3_flushcache
  5716. -_arm3_flushcache:
  5717. +        .global    _armcache_flush
  5718. +_armcache_flush:
  5719.          mcr    15, 0, r0, c1, c0    @ flush cache
  5720.          movs    pc, lr
  5721.  
  5722. @@ -737,5 +736,5 @@
  5723.  _fp_save:    .word    _fpnull
  5724.  _fp_restore:    .word    _fpnull
  5725.  
  5726. -_irq_temp:    .word    0
  5727. +Lirq_temp:    .word    0
  5728.  
  5729. diff -urN linux.store/linux/changed linux/changed
  5730. --- linux.store/linux/changed    Thu Jan  1 01:00:00 1970
  5731. +++ linux/changed    Thu Mar 28 15:08:28 1996
  5732. @@ -0,0 +1,12 @@
  5733. +./arch/arm/drivers/block/fd1772.c.orig
  5734. +./arch/arm/drivers/block/hdsrch.c.orig
  5735. +./arch/arm/drivers/block/mfmhd.c.orig
  5736. +./arch/arm/drivers/block/blk.h.orig
  5737. +./arch/arm/drivers/char/console.c.orig
  5738. +./arch/arm/kernel/oldlatches.c.orig
  5739. +./arch/arm/kernel/dma.c.orig
  5740. +./arch/arm/lib/mfm.S.orig
  5741. +./arch/arm/lib/Makefile.orig
  5742. +./include/asm-arm/arch-arc/oldlatches.h.orig
  5743. +./include/asm-arm/arch-arc/system.h.orig
  5744. +./README.arm.orig
  5745. diff -urN linux.store/linux/drivers/char/conmakehash.c linux/drivers/char/conmakehash.c
  5746. --- linux.store/linux/drivers/char/conmakehash.c    Sat Feb 10 23:28:16 1996
  5747. +++ linux/drivers/char/conmakehash.c    Thu Mar 28 14:17:04 1996
  5748. @@ -286,7 +286,7 @@
  5749.           }
  5750.         printf("0x%04x", unitable[fp0][nent++]);
  5751.         if ( i == nuni-1 )
  5752. -         printf("\n};");
  5753. +         printf("\n};\n");
  5754.         else if ( i % 8 == 7 )
  5755.           printf(",\n\t");
  5756.         else
  5757. diff -urN linux.store/linux/include/asm-arm/arch-a5k/hardware.h linux/include/asm-arm/arch-a5k/hardware.h
  5758. --- linux.store/linux/include/asm-arm/arch-a5k/hardware.h    Thu Jan  1 01:00:00 1970
  5759. +++ linux/include/asm-arm/arch-a5k/hardware.h    Fri Mar 22 23:44:12 1996
  5760. @@ -0,0 +1,57 @@
  5761. +/*
  5762. + * linux/include/asm-arm/arch-a5k/hardware.h
  5763. + *
  5764. + * Copyright (C) 1996 Russell King.
  5765. + *
  5766. + * This file contains the hardware definitions of the A5000 series machines.
  5767. + */
  5768. +
  5769. +#ifndef __ASM_ARCH_HARDWARE_H
  5770. +#define __ASM_ARCH_HARDWARE_H
  5771. +
  5772. +/*
  5773. + * What hardware must be present
  5774. + */
  5775. +#define HAS_IOC
  5776. +#define HAS_PCIO
  5777. +#define HAS_MEMC1A
  5778. +/*
  5779. + * Optional hardware
  5780. + */
  5781. +#define HAS_EXPMASK
  5782. +
  5783. +#ifndef __ASSEMBLER__
  5784. +
  5785. +/*
  5786. + * IO definitions
  5787. + */
  5788. +#define IOCECIO_BASE        0x03240000
  5789. +#define EXPMASK_BASE        ((volatile unsigned char *)0x03360000)
  5790. +#define IOEB_BASE        ((volatile unsigned char *)0x03350050)
  5791. +#define IOC_BASE        ((volatile unsigned char *)0x03200000)
  5792. +#define PCIO_FLOPPYDMABASE    ((volatile unsigned char *)0x0302a000)
  5793. +#define PCIO_BASE        ((volatile unsigned char *)0x03010000)
  5794. +#define MEMCECIO_BASE        0x03000000
  5795. +
  5796. +#else
  5797. +
  5798. +#define IOEB_BASE        0x03350050
  5799. +#define IOC_BASE        0x03200000
  5800. +#define PCIO_FLOPPYDMABASE    0x0302a000
  5801. +#define PCIO_BASE        0x03010000
  5802. +
  5803. +#endif
  5804. +
  5805. +/*
  5806. + * RAM definitions
  5807. + */
  5808. +#define GET_MEMORY_PHYSICAL    (0x02000000)
  5809. +#define GET_MEMORY_START    ((unsigned long)&_end - 0x01800000 + KERNEL_BASE)
  5810. +#define GET_MEMORY_END(ps,np)    (GET_MEMORY_PHYSICAL + (ps) * (np))
  5811. +
  5812. +#define SCREEN_BASE        GET_MEMORY_PHYSICAL
  5813. +#define PARAMS_BASE        (GET_MEMORY_PHYSICAL + 0x7c000)
  5814. +#define KERNEL_BASE        (GET_MEMORY_PHYSICAL + 0x80000)
  5815. +
  5816. +#endif
  5817. +
  5818. diff -urN linux.store/linux/include/asm-arm/arch-a5k/shmparam.h linux/include/asm-arm/arch-a5k/shmparam.h
  5819. --- linux.store/linux/include/asm-arm/arch-a5k/shmparam.h    Thu Jan  1 01:00:00 1970
  5820. +++ linux/include/asm-arm/arch-a5k/shmparam.h    Thu Mar 28 11:30:58 1996
  5821. @@ -0,0 +1,5 @@
  5822. +/*
  5823. + * linux/include/asm-arm/arch-a5k/shmparam.h
  5824. + *
  5825. + * Copyright (c) 1996 Russell King.
  5826. + */
  5827. diff -urN linux.store/linux/include/asm-arm/arch-a5k/system.h linux/include/asm-arm/arch-a5k/system.h
  5828. --- linux.store/linux/include/asm-arm/arch-a5k/system.h    Thu Jan  1 01:00:00 1970
  5829. +++ linux/include/asm-arm/arch-a5k/system.h    Thu Mar 28 11:31:27 1996
  5830. @@ -0,0 +1,6 @@
  5831. +/*
  5832. + * linux/include/asm-arm/arch-a5k/system.h
  5833. + *
  5834. + * Copyright (c) 1996 Russell King
  5835. + */
  5836. +
  5837. diff -urN linux.store/linux/include/asm-arm/arch-arc/hardware.h linux/include/asm-arm/arch-arc/hardware.h
  5838. --- linux.store/linux/include/asm-arm/arch-arc/hardware.h    Thu Jan  1 01:00:00 1970
  5839. +++ linux/include/asm-arm/arch-arc/hardware.h    Fri Mar 22 22:32:41 1996
  5840. @@ -0,0 +1,47 @@
  5841. +/*
  5842. + * linux/include/asm-arm/arch-a5k/hardware.h
  5843. + *
  5844. + * Copyright (C) 1996 Russell King.
  5845. + *
  5846. + * This file contains the hardware definitions of the A5000 series machines.
  5847. + */
  5848. +
  5849. +#ifndef __ASM_ARCH_HARDWARE_H
  5850. +#define __ASM_ARCH_HARDWARE_H
  5851. +
  5852. +#define HAS_IOC
  5853. +#define HAS_MEMC1A
  5854. +#define HAS_PCIO
  5855. +
  5856. +#ifndef ASSEMBLER
  5857. +
  5858. +/*
  5859. + * IO definitions
  5860. + */
  5861. +#define IOEB_BASE        ((volatile unsigned char *)0x03350050)
  5862. +#define IOC_BASE        ((volatile unsigned char *)0x03200000)
  5863. +#define PCIO_FLOPPYDMABASE    ((volatile unsigned char *)0x0302a000)
  5864. +#define PCIO_BASE        ((volatile unsigned char *)0x03010000)
  5865. +
  5866. +#else
  5867. +
  5868. +#define IOEB_BASE        0x03350050
  5869. +#define IOC_BASE        0x03200000
  5870. +#define PCIO_FLOPPYDMABASE    0x0302a000
  5871. +#define PCIO_BASE        0x03010000
  5872. +
  5873. +#endif
  5874. +
  5875. +/*
  5876. + * RAM definitions
  5877. + */
  5878. +#define GET_MEMORY_PHYSICAL    (0x02000000)
  5879. +#define GET_MEMORY_START    ((unsigned long)&_end - 0x01800000 + KERNEL_BASE)
  5880. +#define GET_MEMORY_END(ps,np)    (GET_MEMORY_PHYSICAL + (ps) * (np))
  5881. +
  5882. +#define SCREEN_BASE        GET_MEMORY_PHYSICAL
  5883. +#define PARAMS_BASE        (GET_MEMORY_PHYSICAL + 0x7c000)
  5884. +#define KERNEL_BASE        (GET_MEMORY_PHYSICAL + 0x80000)
  5885. +
  5886. +#endif
  5887. +
  5888. diff -urN linux.store/linux/include/asm-arm/arch-arc/oldlatches.h linux/include/asm-arm/arch-arc/oldlatches.h
  5889. --- linux.store/linux/include/asm-arm/arch-arc/oldlatches.h    Wed Mar 13 23:55:11 1996
  5890. +++ linux/include/asm-arm/arch-arc/oldlatches.h    Thu Mar 28 14:24:56 1996
  5891. @@ -1,5 +1,5 @@
  5892.  #ifndef _ASM_ARM_ARCHARC_OLDLATCH_H
  5893. -#define _ASN_ARM_ARCHARC_OLDLATCH_H
  5894. +#define _ASM_ARM_ARCHARC_OLDLATCH_H
  5895.  
  5896.  #define LATCHA_FDSEL0    (1<<0)
  5897.  #define LATCHA_FDSEL1    (1<<1)
  5898. diff -urN linux.store/linux/include/asm-arm/arch-arc/shmparam.h linux/include/asm-arm/arch-arc/shmparam.h
  5899. --- linux.store/linux/include/asm-arm/arch-arc/shmparam.h    Thu Jan  1 01:00:00 1970
  5900. +++ linux/include/asm-arm/arch-arc/shmparam.h    Thu Mar 28 11:45:19 1996
  5901. @@ -0,0 +1,5 @@
  5902. +/*
  5903. + * linux/include/asm-arm/arch-arc/shmparam.h
  5904. + *
  5905. + * Copyright (c) 1996 Russell King.
  5906. + */
  5907. diff -urN linux.store/linux/include/asm-arm/arch-arc/system.h linux/include/asm-arm/arch-arc/system.h
  5908. --- linux.store/linux/include/asm-arm/arch-arc/system.h    Wed Mar 13 23:55:11 1996
  5909. +++ linux/include/asm-arm/arch-arc/system.h    Thu Mar 28 14:24:56 1996
  5910. @@ -5,5 +5,7 @@
  5911.  "    mov    %0, pc\n"        \
  5912.  "    orr %0, %0, #0x0c000000\n"    \
  5913.  "    teqp    %0, #0\n"        \
  5914. -      : "=r" (temp));
  5915. +      : "=r" (temp)    \
  5916. +    : );    \
  5917. +  } while(0)
  5918.  
  5919. diff -urN linux.store/linux/include/asm-arm/arch-rpc/system.h linux/include/asm-arm/arch-rpc/system.h
  5920. --- linux.store/linux/include/asm-arm/arch-rpc/system.h    Thu Jan  1 01:00:00 1970
  5921. +++ linux/include/asm-arm/arch-rpc/system.h    Thu Mar 28 11:45:43 1996
  5922. @@ -0,0 +1,5 @@
  5923. +/*
  5924. + * linux/include/asm-arm/arch-rpc/system.h
  5925. + *
  5926. + * Copyright (c) 1996 Russell King.
  5927. + */
  5928. diff -urN linux.store/linux/include/asm-arm/ecard.h linux/include/asm-arm/ecard.h
  5929. --- linux.store/linux/include/asm-arm/ecard.h    Sun Feb 11 09:32:54 1996
  5930. +++ linux/include/asm-arm/ecard.h    Fri Mar 22 23:20:03 1996
  5931. @@ -64,7 +64,7 @@
  5932.      struct ex_ecld ecld;
  5933.      unsigned char irq;
  5934.      unsigned char fiq;
  5935. -    unsigned char unused1;
  5936. +    unsigned char slot_no;
  5937.      unsigned char unused2;
  5938.      unsigned char *r_loader; /* loader program */
  5939.      volatile unsigned char *r_podaddr;
  5940. @@ -97,3 +97,12 @@
  5941.   * num: (n+1)'th id to find.
  5942.   */
  5943.  extern int ecard_readchunk(struct chunk_dir *cd, struct expansion_card *ec, int id, int num);
  5944. +
  5945. +/*
  5946. + * Obtain the address of a card
  5947. + */
  5948. +#define ECARD_SLOW    0
  5949. +#define ECARD_MEDIUM    1
  5950. +#define ECARD_FAST    2
  5951. +#define ECARD_SYNC    3
  5952. +extern unsigned char *ecard_address (int card, int memc, int speed);
  5953. diff -urN linux.store/linux/include/asm-arm/hardware.h linux/include/asm-arm/hardware.h
  5954. --- linux.store/linux/include/asm-arm/hardware.h    Thu Jan  1 01:00:00 1970
  5955. +++ linux/include/asm-arm/hardware.h    Fri Mar 22 23:01:27 1996
  5956. @@ -0,0 +1,85 @@
  5957. +/*
  5958. + * linux/include/asm-arm/hardware.h
  5959. + *
  5960. + * Copyright (C) 1996 Russell King
  5961. + *
  5962. + * Common hardware definitions
  5963. + */
  5964. +
  5965. +#ifndef __ASM_HARDWARE_H
  5966. +#define __ASM_HARDWARE_H
  5967. +
  5968. +#include <asm/arch/hardware.h>
  5969. +#include <asm/proc/hardware.h>
  5970. +
  5971. +/*
  5972. + * Use these macros to read/write the IOC.  All it does is perform the actual
  5973. + * read/write.
  5974. + */
  5975. +#ifdef HAS_IOC
  5976. +#ifndef ASSEMBER
  5977. +#define __IOC(offset)    (((volatile unsigned char *)IOC_BASE)[offset])
  5978. +#else
  5979. +#define __IOC(offset)    offset
  5980. +#endif
  5981. +
  5982. +#define IOC_CONTROL    __IOC(0x00)
  5983. +#define IOC_KARTTX    __IOC(0x04)
  5984. +#define IOC_KARTRX    __IOC(0x04)
  5985. +
  5986. +#define IOC_IRQSTATA    __IOC(0x10)
  5987. +#define IOC_IRQREQA    __IOC(0x14)
  5988. +#define IOC_IRQCLRA    __IOC(0x14)
  5989. +#define IOC_IRQMASKA    __IOC(0x18)
  5990. +
  5991. +#define IOC_IRQSTATB    __IOC(0x20)
  5992. +#define IOC_IRQREQB    __IOC(0x24)
  5993. +#define IOC_IRQMASKB    __IOC(0x28)
  5994. +
  5995. +#define IOC_FIQSTAT    __IOC(0x30)
  5996. +#define IOC_FIQREQ    __IOC(0x34)
  5997. +#define IOC_FIQMASK    __IOC(0x38)
  5998. +
  5999. +#define IOC_T0CNTL    __IOC(0x40)
  6000. +#define IOC_T0LTCHL    __IOC(0x40)
  6001. +#define IOC_T0CNTH    __IOC(0x44)
  6002. +#define IOC_T0LTCHH    __IOC(0x44)
  6003. +#define IOC_T0GO    __IOC(0x48)
  6004. +#define IOC_T0LATCH    __IOC(0x4c)
  6005. +
  6006. +#define IOC_T1CNTL    __IOC(0x50)
  6007. +#define IOC_T1LTCHL    __IOC(0x50)
  6008. +#define IOC_T1CNTH    __IOC(0x54)
  6009. +#define IOC_T1LTCHH    __IOC(0x54)
  6010. +#define IOC_T1GO    __IOC(0x58)
  6011. +#define IOC_T1LATCH    __IOC(0x5c)
  6012. +
  6013. +#define IOC_T2CNTL    __IOC(0x60)
  6014. +#define IOC_T2LTCHL    __IOC(0x60)
  6015. +#define IOC_T2CNTH    __IOC(0x64)
  6016. +#define IOC_T2LTCHH    __IOC(0x64)
  6017. +#define IOC_T2GO    __IOC(0x68)
  6018. +#define IOC_T2LATCH    __IOC(0x6c)
  6019. +
  6020. +#define IOC_T3CNTL    __IOC(0x70)
  6021. +#define IOC_T3LTCHL    __IOC(0x70)
  6022. +#define IOC_T3CNTH    __IOC(0x74)
  6023. +#define IOC_T3LTCHH    __IOC(0x74)
  6024. +#define IOC_T3GO    __IOC(0x78)
  6025. +#define IOC_T3LATCH    __IOC(0x7c)
  6026. +
  6027. +#endif
  6028. +
  6029. +#ifdef HAS_EXPMASK
  6030. +#ifndef ASSEMBER
  6031. +#define __EXPMASK(offset)    (((volatile unsigned char *)EXPMASK_BASE)[offset])
  6032. +#else
  6033. +#define __EXPMASK(offset)    offset
  6034. +#endif
  6035. +
  6036. +#define    EXPMASK_STATUS    __EXPMASK(0x00)
  6037. +#define EXPMASK_ENABLE    __EXPMASK(0x04)
  6038. +
  6039. +#endif
  6040. +
  6041. +#endif
  6042. diff -urN linux.store/linux/include/asm-arm/proc-arm2/hardware.h linux/include/asm-arm/proc-arm2/hardware.h
  6043. --- linux.store/linux/include/asm-arm/proc-arm2/hardware.h    Thu Jan  1 01:00:00 1970
  6044. +++ linux/include/asm-arm/proc-arm2/hardware.h    Fri Mar 22 22:39:08 1996
  6045. @@ -0,0 +1,15 @@
  6046. +/*
  6047. + * linux/include/asm-arm/proc-arm2/hardware.h
  6048. + *
  6049. + * Copyright (C) 1996 Russell King
  6050. + */
  6051. +
  6052. +#ifndef __ASM_PROC_HARDWARE_H
  6053. +#define __ASM_PROC_HARDWARE_H
  6054. +
  6055. +/*
  6056. + * No cache setup required
  6057. + */
  6058. +#define cache_setup(x)
  6059. +
  6060. +#endif
  6061. diff -urN linux.store/linux/include/asm-arm/proc-arm250/assembler.h linux/include/asm-arm/proc-arm250/assembler.h
  6062. --- linux.store/linux/include/asm-arm/proc-arm250/assembler.h    Thu Jan  1 01:00:00 1970
  6063. +++ linux/include/asm-arm/proc-arm250/assembler.h    Sun Feb 11 09:32:54 1996
  6064. @@ -0,0 +1,52 @@
  6065. +/*
  6066. + * linux/asm-arm/proc-arm3/assembler.h
  6067. + *
  6068. + * This file contains arm architecture specific defines
  6069. + * for the different processors
  6070. + */
  6071. +
  6072. +/*
  6073. + * LOADREGS: multiple register load (ldm) with pc in register list
  6074. + *        (takes account of ARM6 not using ^)
  6075. + *
  6076. + * RETINSTR: return instruction: adds the 's' in at the end of the
  6077. + *        instruction if this is not an ARM6
  6078. + *
  6079. + * SAVEIRQS: save IRQ state (not required on ARM2/ARM3 - done
  6080. + *        implicitly
  6081. + *
  6082. + * RESTOREIRQS: restore IRQ state (not required on ARM2/ARM3 - done
  6083. + *        implicitly with ldm ... ^ or movs.
  6084. + *
  6085. + * These next two need thinking about - can't easily use stack... (see system.S)
  6086. + * DISABLEIRQS: disable IRQS in SVC mode
  6087. + *
  6088. + * ENABLEIRQS: enable IRQS in SVC mode
  6089. + *
  6090. + * USERMODE: switch to USER mode
  6091. + *
  6092. + * SVCMODE: switch to SVC mode
  6093. + */
  6094. +
  6095. +#define LOADREGS(cond, base, reglist...)\
  6096. +    ldm##cond    base,reglist^
  6097. +
  6098. +#define RETINSTR(instr, regs...)\
  6099. +    instr##s    regs
  6100. +
  6101. +#define MODENOP
  6102. +
  6103. +#define SAVEIRQS
  6104. +#define RESTOREIRQS
  6105. +
  6106. +#define DISABLEIRQS\
  6107. +    teqp    pc, #0x08000003
  6108. +
  6109. +#define ENABLEIRQS\
  6110. +    teqp    pc, #0x00000003
  6111. +
  6112. +#define USERMODE\
  6113. +    teqp    pc, #0x00000000
  6114. +
  6115. +#define SVCMODE\
  6116. +    teqp    pc, #0x00000003
  6117. diff -urN linux.store/linux/include/asm-arm/proc-arm250/bugs.h linux/include/asm-arm/proc-arm250/bugs.h
  6118. --- linux.store/linux/include/asm-arm/proc-arm250/bugs.h    Thu Jan  1 01:00:00 1970
  6119. +++ linux/include/asm-arm/proc-arm250/bugs.h    Sun Feb 11 09:32:54 1996
  6120. @@ -0,0 +1,17 @@
  6121. +/*
  6122. + *  include/asm-arm/bugs.h
  6123. + *
  6124. + *  Copyright (C) 1995  Russell King
  6125. + */
  6126. +
  6127. +/*
  6128. + * This is included by init/main.c to check for architecture-dependent bugs.
  6129. + *
  6130. + * Needs:
  6131. + *      void check_bugs(void);
  6132. + */
  6133. +         
  6134. +static inline void check_bugs(void)
  6135. +{
  6136. +}
  6137. +
  6138. diff -urN linux.store/linux/include/asm-arm/proc-arm250/hardware.h linux/include/asm-arm/proc-arm250/hardware.h
  6139. --- linux.store/linux/include/asm-arm/proc-arm250/hardware.h    Thu Jan  1 01:00:00 1970
  6140. +++ linux/include/asm-arm/proc-arm250/hardware.h    Fri Mar 22 23:43:01 1996
  6141. @@ -0,0 +1,36 @@
  6142. +/*
  6143. + * linux/include/asm-arm/proc-arm3/hardware.h
  6144. + *
  6145. + * Copyright (C) 1996 Russell King
  6146. + */
  6147. +
  6148. +#ifndef __ASM_PROC_HARDWARE_H
  6149. +#define __ASM_PROC_HARDWARE_H
  6150. +
  6151. +#include <asm/procinfo.h>
  6152. +
  6153. +#ifndef __ASSEMBLER__
  6154. +/*
  6155. + * Need to setup cache on ARM3, but not the ARM250
  6156. + */
  6157. +extern __inline__ void cache_setup (int features)
  6158. +{
  6159. +    if (features & F_CACHE) {
  6160. +    __asm__ __volatile__("
  6161. +    mcr    15, 0, %0, c3, c0
  6162. +    mcr    15, 0, %1, c4, c0
  6163. +    mcr    15, 0, %2, c5, c0
  6164. +    mcr    15, 0, %3, c1, c0
  6165. +    mcr    15, 0, %3, c2, c0
  6166. +    " : : "r" (0x000e7fff), "r" (0x000e7fff), "r" (0xf0000000), "r" (3));
  6167. +    } else {
  6168. +        extern unsigned long armcache_flush[2];
  6169. +
  6170. +        armcache_flush[0] = armcache_flush[1];
  6171. +    }
  6172. +}
  6173. +
  6174. +#endif
  6175. +
  6176. +#endif
  6177. +
  6178. diff -urN linux.store/linux/include/asm-arm/proc-arm250/page.h linux/include/asm-arm/proc-arm250/page.h
  6179. --- linux.store/linux/include/asm-arm/proc-arm250/page.h    Thu Jan  1 01:00:00 1970
  6180. +++ linux/include/asm-arm/proc-arm250/page.h    Wed Mar 13 22:26:56 1996
  6181. @@ -0,0 +1,105 @@
  6182. +/*
  6183. + * linux/include/asm-arm/proc-arm3/page.h
  6184. + *
  6185. + * Copyright (C) 1995, 1996 Russell King
  6186. + */
  6187. +
  6188. +#ifndef __ASM_PROC_PAGE_H
  6189. +#define __ASM_PROC_PAGE_H
  6190. +
  6191. +#include <linux/config.h>
  6192. +
  6193. +/* PAGE_SHIFT determines the page size */
  6194. +#define PAGE_SHIFT    15
  6195. +
  6196. +#define LOGICAL_END    0x02000000
  6197. +
  6198. +#define PAGE_SIZE       (1UL << PAGE_SHIFT)
  6199. +#define PAGE_MASK       (~(PAGE_SIZE-1))
  6200. +
  6201. +#ifdef __KERNEL__
  6202. +
  6203. +#define CONFIG_STRICT_MM_TYPECHECKS
  6204. +
  6205. +#ifdef CONFIG_STRICT_MM_TYPECHECKS
  6206. +/*
  6207. + * These are used to make use of C type-checking..
  6208. + */
  6209. +typedef struct { unsigned long pte; } pte_t;
  6210. +typedef struct { unsigned long pmd; } pmd_t;
  6211. +typedef struct { unsigned long pgd; } pgd_t;
  6212. +typedef struct { unsigned long pgprot; } pgprot_t;
  6213. +
  6214. +#define pte_val(x)      ((x).pte)
  6215. +#define pmd_val(x)      ((x).pmd)
  6216. +#define pgd_val(x)      ((x).pgd)
  6217. +#define pgprot_val(x)   ((x).pgprot)
  6218. +
  6219. +#define __pte(x)        ((pte_t) { (x) } )
  6220. +#define __pmd(x)        ((pmd_t) { (x) } )
  6221. +#define __pgd(x)        ((pgd_t) { (x) } )
  6222. +#define __pgprot(x)     ((pgprot_t) { (x) } )
  6223. +
  6224. +#else
  6225. +/*
  6226. + * .. while these make it easier on the compiler
  6227. + */
  6228. +typedef unsigned long pte_t;
  6229. +typedef unsigned long pmd_t;
  6230. +typedef unsigned long pgd_t;
  6231. +typedef unsigned long pgprot_t;
  6232. +
  6233. +#define pte_val(x)      (x)
  6234. +#define pmd_val(x)      (x)
  6235. +#define pgd_val(x)      (x)
  6236. +#define pgprot_val(x)   (x)
  6237. +
  6238. +#define __pte(x)        (x)
  6239. +#define __pmd(x)        (x)
  6240. +#define __pgd(x)        (x)
  6241. +#define __pgprot(x)     (x)
  6242. +
  6243. +#endif
  6244. +
  6245. +extern void remap_task (pgd_t *);
  6246. +
  6247. +/*
  6248. + * TLB invalidation:
  6249. + *
  6250. + *  - invalidate() invalidates the current task TLBs
  6251. + *  - invalidate_all() invalidates all processes TLBs
  6252. + *  - invalidate_task(task) invalidates the specified tasks TLB's
  6253. + *  - invalidate_page(task, vmaddr) invalidates one page
  6254. + */
  6255. +#define invalidate() \
  6256. +    remap_task(current->mm->pgd)
  6257. +#define invalidate_all() invalidate()
  6258. +#define invalidate_task(task) \
  6259. +do { if ((task)->mm == current->mm) invalidate(); } while (0)
  6260. +#define invalidate_page(task,addr) \
  6261. +do { if ((task)->mm == current->mm) invalidate(); } while (0)
  6262. +
  6263. +/* Certain architectures need to do special things when pte's
  6264. + * within a page table are directly modified.  Thus, the following
  6265. + * hook is made available.
  6266. + */
  6267. +#define set_pte(pteptr, pteval) ((*(pteptr)) = (pteval))
  6268. +
  6269. +/* to align the pointer to the (next) page boundary */
  6270. +#define PAGE_ALIGN(addr)    (((addr)+PAGE_SIZE-1)&PAGE_MASK)
  6271. +
  6272. +/* This handles the memory map.. */
  6273. +#define PAGE_OFFSET        0x02000000
  6274. +#define MAP_NR(addr)        (((unsigned long)(addr) - PAGE_OFFSET) >> PAGE_SHIFT)
  6275. +
  6276. +typedef struct {
  6277. +    unsigned count:24,
  6278. +         age:6,
  6279. +         dirty:1,
  6280. +         reserved:1;
  6281. +} mem_map_t;
  6282. +
  6283. +#endif /* __KERNEL__ */
  6284. +
  6285. +#endif /* __ASM_PROC_PAGE_H */
  6286. +
  6287. diff -urN linux.store/linux/include/asm-arm/proc-arm250/param.h linux/include/asm-arm/proc-arm250/param.h
  6288. --- linux.store/linux/include/asm-arm/proc-arm250/param.h    Thu Jan  1 01:00:00 1970
  6289. +++ linux/include/asm-arm/proc-arm250/param.h    Sun Feb 11 09:32:54 1996
  6290. @@ -0,0 +1,27 @@
  6291. +/*
  6292. + * linux/include/asm-arm/proc-arm3/param.h
  6293. + *
  6294. + * Copyright (C) 1995, 1996 Russell King
  6295. + */
  6296. +
  6297. +#ifndef __ASM_PROC_PARAM_H
  6298. +#define __ASM_PROC_PARAM_H
  6299. +
  6300. +#ifndef HZ
  6301. +#define HZ 100
  6302. +#endif
  6303. +
  6304. +#define EXEC_PAGESIZE   32768
  6305. +
  6306. +#ifndef NGROUPS
  6307. +#define NGROUPS         32
  6308. +#endif
  6309. +
  6310. +#ifndef NOGROUP
  6311. +#define NOGROUP         (-1)
  6312. +#endif
  6313. +
  6314. +#define MAXHOSTNAMELEN  64      /* max length of hostname */
  6315. +
  6316. +#endif
  6317. +
  6318. diff -urN linux.store/linux/include/asm-arm/proc-arm250/pgtable.h linux/include/asm-arm/proc-arm250/pgtable.h
  6319. --- linux.store/linux/include/asm-arm/proc-arm250/pgtable.h    Thu Jan  1 01:00:00 1970
  6320. +++ linux/include/asm-arm/proc-arm250/pgtable.h    Sun Feb 11 09:32:54 1996
  6321. @@ -0,0 +1,291 @@
  6322. +/*
  6323. + * linux/include/asm-arm/proc-arm3/pgtable.h
  6324. + *
  6325. + * Copyright (C) 1995, 1996 Russell King
  6326. + */
  6327. +
  6328. +#ifndef __ASM_PROC_PGTABLE_H
  6329. +#define __ASM_PROC_PGTABLE_H
  6330. +
  6331. +/* PMD_SHIFT determines the size of the area a second-level page table can map */
  6332. +#define PMD_SHIFT       PAGE_SHIFT
  6333. +#define PMD_SIZE        (1UL << PMD_SHIFT)
  6334. +#define PMD_MASK        (~(PMD_SIZE-1))
  6335. +
  6336. +/* PGDIR_SHIFT determines what a third-level page table entry can map */
  6337. +#define PGDIR_SHIFT     PAGE_SHIFT
  6338. +#define PGDIR_SIZE      (1UL << PGDIR_SHIFT)
  6339. +#define PGDIR_MASK      (~(PGDIR_SIZE-1))
  6340. +
  6341. +/*
  6342. + * entries per page directory level: the i386 is two-level, so
  6343. + * we don't really have any PMD directory physically.
  6344. + */
  6345. +#define PTRS_PER_PTE    1
  6346. +#define PTRS_PER_PMD    1
  6347. +#define PTRS_PER_PGD    1024
  6348. +
  6349. +/* Just any arbitrary offset to the start of the vmalloc VM area: the
  6350. + * current 8MB value just means that there will be a 8MB "hole" after the
  6351. + * physical memory until the kernel virtual memory starts.  That means that
  6352. + * any out-of-bounds memory accesses will hopefully be caught.
  6353. + * The vmalloc() routines leaves a hole of 4kB between each vmalloced
  6354. + * area for the same reason. ;)
  6355. + */
  6356. +#define VMALLOC_START    0x01A00000
  6357. +#define VMALLOC_VMADDR(x) ((unsigned long)(x))
  6358. +
  6359. +#define _PAGE_PRESENT   0x001
  6360. +#define _PAGE_RW        0x002
  6361. +#define _PAGE_USER      0x004
  6362. +#define _PAGE_PCD       0x010
  6363. +#define _PAGE_ACCESSED  0x020
  6364. +#define _PAGE_DIRTY     0x040
  6365. +#define _PAGE_COW       0x200   /* implemented in software (one of the AVL bits) */
  6366. +
  6367. +#define _PAGE_TABLE     (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
  6368. +#define _PAGE_CHG_MASK  (PAGE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
  6369. +
  6370. +#define PAGE_NONE       __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED)
  6371. +#define PAGE_SHARED     __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
  6372. +#define PAGE_COPY       __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_COW)
  6373. +#define PAGE_READONLY   __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
  6374. +#define PAGE_KERNEL     __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
  6375. +
  6376. +/*
  6377. + * The i386 can't do page protection for execute, and considers that the same are read.
  6378. + * Also, write permissions imply read permissions. This is the closest we can get..
  6379. + */
  6380. +#define __P000  PAGE_NONE
  6381. +#define __P001  PAGE_READONLY
  6382. +#define __P010  PAGE_COPY
  6383. +#define __P011  PAGE_COPY
  6384. +#define __P100  PAGE_READONLY
  6385. +#define __P101  PAGE_READONLY
  6386. +#define __P110  PAGE_COPY
  6387. +#define __P111  PAGE_COPY
  6388. +
  6389. +#define __S000  PAGE_NONE
  6390. +#define __S001  PAGE_READONLY
  6391. +#define __S010  PAGE_SHARED
  6392. +#define __S011  PAGE_SHARED
  6393. +#define __S100  PAGE_READONLY
  6394. +#define __S101  PAGE_READONLY
  6395. +#define __S110  PAGE_SHARED
  6396. +#define __S111  PAGE_SHARED
  6397. +
  6398. +/*
  6399. + * Define this if things work differently on a i386 and a i486:
  6400. + * it will (on a i486) warn about kernel memory accesses that are
  6401. + * done without a 'verify_area(VERIFY_WRITE,..)'
  6402. + */
  6403. +#undef CONFIG_TEST_VERIFY_AREA
  6404. +
  6405. +#ifndef not_yet_checked
  6406. +/* page table for 0-4MB for everybody */
  6407. +extern unsigned long pg0[1024];
  6408. +#endif
  6409. +
  6410. +/*
  6411. + * BAD_PAGE is used for a bogus page.
  6412. + *
  6413. + * ZERO_PAGE is a global shared page that is always zero: used
  6414. + * for zero-mapped memory areas etc..
  6415. + */
  6416. +extern pte_t __bad_page(void);
  6417. +extern unsigned long __zero_page(void);
  6418. +
  6419. +#define BAD_PAGE __bad_page()
  6420. +#define ZERO_PAGE __zero_page()
  6421. +
  6422. +/* number of bits that fit into a memory pointer */
  6423. +#define BITS_PER_PTR                    (8*sizeof(unsigned long))
  6424. +
  6425. +/* to align the pointer to a pointer address */
  6426. +#define PTR_MASK                        (~(sizeof(void*)-1))
  6427. +
  6428. +/* sizeof(void*)==1<<SIZEOF_PTR_LOG2 */
  6429. +/* 64-bit machines, beware!  SRB. */
  6430. +#define SIZEOF_PTR_LOG2                 2
  6431. +
  6432. +/* to set the page-dir */
  6433. +#define SET_PAGE_DIR(tsk,pgdir) \
  6434. +do { \
  6435. +    if ((tsk) == current) \
  6436. +        remap_task((pgdir)); \
  6437. +} while (0)
  6438. +
  6439. +extern unsigned long physical_start;
  6440. +extern unsigned long physical_end;
  6441. +
  6442. +extern inline int pte_none(pte_t pte)           { return !pte_val(pte); }
  6443. +extern inline int pte_present(pte_t pte)        { return pte_val(pte) & _PAGE_PRESENT; }
  6444. +extern inline int pte_inuse(pte_t *ptep)        { return mem_map[MAP_NR(ptep)].reserved || mem_map[MAP_NR(ptep)].count != 1; }
  6445. +extern inline void pte_clear(pte_t *ptep)       { pte_val(*ptep) = 0; }
  6446. +extern inline void pte_reuse(pte_t * ptep)
  6447. +{
  6448. +    if (!mem_map[MAP_NR(ptep)].reserved)
  6449. +        mem_map[MAP_NR(ptep)].count++;
  6450. +}
  6451. +
  6452. +extern inline int pmd_none(pmd_t pmd)           { return 0; }
  6453. +extern inline int pmd_bad(pmd_t pmd)            { return 0; }
  6454. +extern inline int pmd_present(pmd_t pmd)        { return 1; }
  6455. +extern inline int pmd_inuse(pmd_t *pmdp)        { return 0; }
  6456. +extern inline void pmd_clear(pmd_t * pmdp)      { }
  6457. +extern inline void pmd_reuse(pmd_t * pmdp)      { }
  6458. +
  6459. +
  6460. +/*
  6461. + * The "pgd_xxx()" functions here are trivial for a folded two-level
  6462. + * setup: the pgd is never bad, and a pmd always exists (as it's folded
  6463. + * into the pgd entry)
  6464. + */
  6465. +extern inline int pgd_none(pgd_t pgd)           { return 0; }
  6466. +extern inline int pgd_bad(pgd_t pgd)            { return 0; }
  6467. +extern inline int pgd_present(pgd_t pgd)        { return 1; }
  6468. +extern inline int pgd_inuse(pgd_t * pgdp)       { return 0; }
  6469. +extern inline void pgd_clear(pgd_t * pgdp)      { }
  6470. +
  6471. +/*
  6472. + * The following only work if pte_present() is true.
  6473. + * Undefined behaviour if not..
  6474. + */
  6475. +extern inline int pte_read(pte_t pte)           { return pte_val(pte) & _PAGE_USER; }
  6476. +extern inline int pte_write(pte_t pte)          { return pte_val(pte) & _PAGE_RW; }
  6477. +extern inline int pte_exec(pte_t pte)           { return pte_val(pte) & _PAGE_USER; }
  6478. +extern inline int pte_dirty(pte_t pte)          { return pte_val(pte) & _PAGE_DIRTY; }
  6479. +extern inline int pte_young(pte_t pte)          { return pte_val(pte) & _PAGE_ACCESSED; }
  6480. +extern inline int pte_cow(pte_t pte)            { return pte_val(pte) & _PAGE_COW; }
  6481. +
  6482. +extern inline pte_t pte_wrprotect(pte_t pte)    { pte_val(pte) &= ~_PAGE_RW; return pte; }
  6483. +extern inline pte_t pte_rdprotect(pte_t pte)    { pte_val(pte) &= ~_PAGE_USER; return pte; }
  6484. +extern inline pte_t pte_exprotect(pte_t pte)    { pte_val(pte) &= ~_PAGE_USER; return pte; }
  6485. +extern inline pte_t pte_mkclean(pte_t pte)      { pte_val(pte) &= ~_PAGE_DIRTY; return pte; }
  6486. +extern inline pte_t pte_mkold(pte_t pte)        { pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
  6487. +extern inline pte_t pte_uncow(pte_t pte)        { pte_val(pte) &= ~_PAGE_COW; return pte; }
  6488. +extern inline pte_t pte_mkwrite(pte_t pte)      { pte_val(pte) |= _PAGE_RW; return pte; }
  6489. +extern inline pte_t pte_mkread(pte_t pte)       { pte_val(pte) |= _PAGE_USER; return pte; }
  6490. +extern inline pte_t pte_mkexec(pte_t pte)       { pte_val(pte) |= _PAGE_USER; return pte; }
  6491. +extern inline pte_t pte_mkdirty(pte_t pte)      { pte_val(pte) |= _PAGE_DIRTY; return pte; }
  6492. +extern inline pte_t pte_mkyoung(pte_t pte)      { pte_val(pte) |= _PAGE_ACCESSED; return pte; }
  6493. +extern inline pte_t pte_mkcow(pte_t pte)        { pte_val(pte) |= _PAGE_COW; return pte; }
  6494. +
  6495. +/*
  6496. + * Conversion functions: convert a page and protection to a page entry,
  6497. + * and a page entry and page directory to the page they refer to.
  6498. + */
  6499. +extern inline pte_t mk_pte(unsigned long page, pgprot_t pgprot)
  6500. +{ pte_t pte; pte_val(pte) = page | pgprot_val(pgprot); return pte; }
  6501. +
  6502. +extern inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
  6503. +{ pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot); return pte; }
  6504. +
  6505. +extern inline unsigned long pte_page(pte_t pte)
  6506. +{ return pte_val(pte) & PAGE_MASK; }
  6507. +
  6508. +extern inline unsigned long pmd_page(pmd_t pmd)
  6509. +{ return pmd_val(pmd) & PAGE_MASK; }
  6510. +
  6511. +/* to find an entry in a page-table-directory */
  6512. +extern inline pgd_t * pgd_offset(struct mm_struct * mm, unsigned long address)
  6513. +{
  6514. +        return mm->pgd + (address >> PGDIR_SHIFT);
  6515. +}
  6516. +
  6517. +/* Find an entry in the second-level page table.. */
  6518. +extern inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
  6519. +{
  6520. +        return (pmd_t *) dir;
  6521. +}
  6522. +
  6523. +/* Find an entry in the third-level page table.. */
  6524. +extern inline pte_t * pte_offset(pmd_t * dir, unsigned long address)
  6525. +{
  6526. +        return (pte_t *) dir;
  6527. +}
  6528. +
  6529. +/*
  6530. + * Allocate and free page tables. The xxx_kernel() versions are
  6531. + * used to allocate a kernel page table - this turns on ASN bits
  6532. + * if any, and marks the page tables reserved.
  6533. + */
  6534. +extern inline void pte_free_kernel(pte_t * pte)
  6535. +{
  6536. +    pte_val(*pte) = 0;
  6537. +}
  6538. +
  6539. +extern inline pte_t * pte_alloc_kernel(pmd_t * pmd, unsigned long address)
  6540. +{
  6541. +    return (pte_t *) pmd;
  6542. +}
  6543. +
  6544. +/*
  6545. + * allocating and freeing a pmd is trivial: the 1-entry pmd is
  6546. + * inside the pgd, so has no extra memory associated with it.
  6547. + */
  6548. +extern inline void pmd_free_kernel(pmd_t * pmd)
  6549. +{
  6550. +}
  6551. +
  6552. +extern inline pmd_t * pmd_alloc_kernel(pgd_t * pgd, unsigned long address)
  6553. +{
  6554. +        return (pmd_t *) pgd;
  6555. +}
  6556. +
  6557. +extern inline void pte_free(pte_t * pte)
  6558. +{
  6559. +}
  6560. +
  6561. +extern inline pte_t * pte_alloc(pmd_t * pmd, unsigned long address)
  6562. +{
  6563. +    return (pte_t *) pmd;
  6564. +}
  6565. +
  6566. +/*
  6567. + * allocating and freeing a pmd is trivial: the 1-entry pmd is
  6568. + * inside the pgd, so has no extra memory associated with it.
  6569. + */
  6570. +extern inline void pmd_free(pmd_t * pmd)
  6571. +{
  6572. +}
  6573. +
  6574. +extern inline pmd_t * pmd_alloc(pgd_t * pgd, unsigned long address)
  6575. +{
  6576. +        return (pmd_t *) pgd;
  6577. +}
  6578. +
  6579. +extern inline void pgd_free(pgd_t * pgd)
  6580. +{
  6581. +    extern void kfree(void *);
  6582. +    kfree((void *)pgd);
  6583. +}
  6584. +
  6585. +extern inline pgd_t * pgd_alloc(void)
  6586. +{
  6587. +    pgd_t *pgd;
  6588. +    extern void *kmalloc(unsigned int, int);
  6589. +    
  6590. +        pgd = (pgd_t *) kmalloc(32*1024*1024*4/PAGE_SIZE, GFP_KERNEL);
  6591. +        memset(pgd, 0, 32*1024*1024*4/PAGE_SIZE);
  6592. +
  6593. +        return pgd;
  6594. +}
  6595. +
  6596. +extern pgd_t swapper_pg_dir[1024];
  6597. +
  6598. +/*
  6599. + * The i386 doesn't have any external MMU info: the kernel page
  6600. + * tables contain all the necessary information.
  6601. + */
  6602. +extern inline void update_mmu_cache(struct vm_area_struct * vma,
  6603. +        unsigned long address, pte_t pte)
  6604. +{
  6605. +}
  6606. +
  6607. +#define SWP_TYPE(entry) (((entry) >> 1) & 0x7f)
  6608. +#define SWP_OFFSET(entry) ((entry) >> 8)
  6609. +#define SWP_ENTRY(type,offset) (((type) << 1) | ((offset) <<  8))
  6610. +
  6611. +#endif /* __ASM_PROC_PAGE_H */
  6612. +
  6613. diff -urN linux.store/linux/include/asm-arm/proc-arm250/ptrace.h linux/include/asm-arm/proc-arm250/ptrace.h
  6614. --- linux.store/linux/include/asm-arm/proc-arm250/ptrace.h    Thu Jan  1 01:00:00 1970
  6615. +++ linux/include/asm-arm/proc-arm250/ptrace.h    Sun Feb 11 09:32:54 1996
  6616. @@ -0,0 +1,14 @@
  6617. +/*
  6618. + * linux/include/asm-arm/proc-arm3/ptrace.h
  6619. + *
  6620. + * Copyright (C) 1996 Russell King
  6621. + */
  6622. +
  6623. +#ifndef __ASM_PROC_PTRACE_H
  6624. +#define __ASM_PROC_PTRACE_H
  6625. +
  6626. +#define user_mode(regs)            (((regs)->ARM_pc & 3) == 0)
  6627. +#define instruction_pointer(regs)    ((regs)->ARM_pc & 0x03fffffc)
  6628. +
  6629. +#endif
  6630. +
  6631. diff -urN linux.store/linux/include/asm-arm/proc-arm250/segment.h linux/include/asm-arm/proc-arm250/segment.h
  6632. --- linux.store/linux/include/asm-arm/proc-arm250/segment.h    Thu Jan  1 01:00:00 1970
  6633. +++ linux/include/asm-arm/proc-arm250/segment.h    Sun Feb 11 09:32:54 1996
  6634. @@ -0,0 +1,121 @@
  6635. +/*
  6636. + * linux/include/asm-arm/proc-arm3/segment.h
  6637. + *
  6638. + * Copyright (C) 1996 Russell King
  6639. + */
  6640. +
  6641. +#ifndef __ASM_PROC_SEGMENT_H
  6642. +#define __ASM_PROC_SEGMENT_H
  6643. +
  6644. +static inline void __put_user(unsigned long x, void * y, int size)
  6645. +{
  6646. +    if (IS_USER_SEG) {
  6647. +        switch (size) {
  6648. +            case 1:
  6649. +                __asm__(
  6650. +                " strbt    %0, [%1]\n"
  6651. +                : : "r" (x), "r" (y)
  6652. +                : "lr", "cc");
  6653. +                break;
  6654. +            case 2:
  6655. +                { register unsigned long tmp;
  6656. +                __asm__ __volatile__(
  6657. +                " strbt %1, [%2], #1\n"
  6658. +                " mov   %0, %1, lsr #8\n"
  6659. +                " strbt %0, [%2]\n"
  6660. +                : "=&r" (tmp)
  6661. +                : "r" (x), "r" (y)
  6662. +                : "2", "lr", "cc");
  6663. +                }
  6664. +                break;
  6665. +            case 4:
  6666. +                if ((int)y & 3) {
  6667. +                register unsigned long tmp;
  6668. +                __asm__ __volatile__(
  6669. +                " strbt %1, [%2], #1\n"
  6670. +                " mov   %0, %1, lsr #8\n"
  6671. +                " strbt %0, [%2], #1\n"
  6672. +                " mov   %0, %0, lsr #8\n"
  6673. +                " strbt %0, [%2], #1\n"
  6674. +                " mov   %0, %0, lsr #8\n"
  6675. +                " strbt %0, [%2]\n"
  6676. +                : "=&r" (tmp)
  6677. +                : "r" (x), "r" (y)
  6678. +                : "2", "lr", "cc");
  6679. +                } else {
  6680. +                __asm__(
  6681. +                " strt  %0, [%1]\n"
  6682. +                : : "r" (x), "r" (y)
  6683. +                : "lr", "cc");
  6684. +                }
  6685. +                break;
  6686. +            default:
  6687. +                bad_user_access_length();
  6688. +        }
  6689. +    } else {
  6690. +        switch (size) {
  6691. +            case 1: *(unsigned char *)y = x; break;
  6692. +            case 2: *(unsigned short *)y = x; break;
  6693. +            case 4: *(unsigned long *)y = x; break;
  6694. +            default:
  6695. +                bad_user_access_length();
  6696. +        }
  6697. +    }
  6698. +}
  6699. +
  6700. +static inline unsigned long __get_user(const void *y, int size)
  6701. +{
  6702. +    unsigned long result1, result2;
  6703. +
  6704. +    if (IS_USER_SEG) {
  6705. +        switch (size) {
  6706. +            case 1:
  6707. +                __asm__(
  6708. +                " ldrbt %0, [%1]\n"
  6709. +                : "=r" (result1)
  6710. +                : "r" (y)
  6711. +                : "lr", "cc");
  6712. +                return result1;
  6713. +            case 2:
  6714. +                __asm__(
  6715. +                " ldrbt %0, [%2], #1\n"
  6716. +                " ldrbt %1, [%2]\n"
  6717. +                " orr   %0, %0, %1, lsl #8\n"
  6718. +                : "=&r" (result1), "=r" (result2)
  6719. +                : "r" (y)
  6720. +                : "lr", "cc");
  6721. +                return result1;
  6722. +            case 4:
  6723. +                if ((int)y & 3) {
  6724. +                __asm__(
  6725. +                " ldrt %0, [%2], #4\n"
  6726. +                " ldrt %1, [%2]\n"
  6727. +                : "=&r" (result1), "=r" (result2)
  6728. +                : "r" ((int)y & ~3)
  6729. +                : "lr", "cc");
  6730. +                result1 >>= ((int)y & 3)*8;
  6731. +                return result1 | (result2 << (32-((int)y & 3)*8));
  6732. +                } else {
  6733. +                __asm__(
  6734. +                " ldrt %0, [%1]\n"
  6735. +                : "=r" (result1)
  6736. +                : "r" (y)
  6737. +                : "lr", "cc");
  6738. +                return result1;
  6739. +                }
  6740. +            default:
  6741. +                return bad_user_access_length();
  6742. +        }
  6743. +    } else {
  6744. +        switch (size) {
  6745. +            case 1: return *(unsigned char *)y; break;
  6746. +            case 2: return *(unsigned short *)y; break;
  6747. +            case 4: return *(unsigned long *)y; break;
  6748. +            default:
  6749. +                return bad_user_access_length();
  6750. +        }
  6751. +    }
  6752. +}        
  6753. +
  6754. +#endif /* __ASM_PROC_SEGMENT_H */
  6755. +
  6756. diff -urN linux.store/linux/include/asm-arm/proc-arm250/shmparam.h linux/include/asm-arm/proc-arm250/shmparam.h
  6757. --- linux.store/linux/include/asm-arm/proc-arm250/shmparam.h    Thu Jan  1 01:00:00 1970
  6758. +++ linux/include/asm-arm/proc-arm250/shmparam.h    Sun Feb 11 09:32:54 1996
  6759. @@ -0,0 +1,18 @@
  6760. +/*
  6761. + * linux/include/asm-arm/proc-arm3/shmparam.h
  6762. + *
  6763. + * Copyright (C) 1996 Russell King
  6764. + *
  6765. + * definitions for the shared process memory on the ARM3
  6766. + */
  6767. +
  6768. +#ifndef __ASM_PROC_SHMPARAM_H
  6769. +#define __ASM_PROC_SHMPARAM_H
  6770. +#ifndef SHM_RANGE_START
  6771. +#define SHM_RANGE_START    0x00a00000
  6772. +#define SHM_RANGE_END    0x00c00000
  6773. +#endif
  6774. +
  6775. +#endif
  6776. +
  6777. diff -urN linux.store/linux/include/asm-arm/proc-arm250/system.h linux/include/asm-arm/proc-arm250/system.h
  6778. --- linux.store/linux/include/asm-arm/proc-arm250/system.h    Thu Jan  1 01:00:00 1970
  6779. +++ linux/include/asm-arm/proc-arm250/system.h    Sun Feb 11 09:32:54 1996
  6780. @@ -0,0 +1,124 @@
  6781. +/*
  6782. + * linux/include/asm-arm/proc-arm3/system.h
  6783. + *
  6784. + * Copyright (C) 1995, 1996 Russell King
  6785. + */
  6786. +
  6787. +#ifndef __ASM_PROC_SYSTEM_H
  6788. +#define __ASM_PROC_SYSTEM_H
  6789. +
  6790. +static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
  6791. +{
  6792. +    switch (size) {
  6793. +        case 1:
  6794. +            __asm__ __volatile__(
  6795. +            " swpb   %0, %1, [%2]\n\t"
  6796. +            : "=r" (x)
  6797. +            : "r" (x), "r" (ptr)
  6798. +            : "memory");
  6799. +            break;
  6800. +        case 2: { unsigned long temp0, temp1;
  6801. +            if (((long)ptr) & 1)
  6802. +            {
  6803. +                void *pc;
  6804. +                __asm__("mov\t%0, pc": "=r" (pc));
  6805. +                arm_malalignedptr("xchg", pc, ptr);
  6806. +            }
  6807. +            __asm__ __volatile__(
  6808. +            " mov   %0, pc\n"
  6809. +            " orr   %1, %0, #0x08000000\n"
  6810. +            " teqp  %1, #0\n"
  6811. +            " mov   %1, %3\n"
  6812. +            " ldr    %2, [%4]\n"
  6813. +            " strb  %1, [%4]\n"
  6814. +            " mov   %1, %1, lsr #8\n"
  6815. +            " strb  %1, [%4, #1]\n"
  6816. +            " teqp  %0, #0\n"
  6817. +            : "=r" (temp0), "=r" (temp1), "=r" (x)
  6818. +            : "r" (x), "r" (ptr)
  6819. +            : "memory");
  6820. +            x &= 0xffff;
  6821. +            break;
  6822. +            }
  6823. +        case 4: if (((long)ptr) & 3)
  6824. +            {
  6825. +                void *pc;
  6826. +                __asm__("mov\t%0, pc": "=r" (pc));
  6827. +                arm_malalignedptr("xchg", pc, ptr);
  6828. +            }
  6829. +            __asm__ __volatile__(
  6830. +            " swp   %0, %1, [%2]\n"
  6831. +            : "=r" (x)
  6832. +            : "r" (x), "r" (ptr)
  6833. +            : "memory");
  6834. +            break;
  6835. +        default:
  6836. +            {
  6837. +                void *pc;
  6838. +                __asm__("mov\t%0, pc": "=r" (pc));
  6839. +                arm_invalidptr("xchg", pc, size);
  6840. +                x = 0;
  6841. +            }
  6842. +    }
  6843. +    return x;
  6844. +}
  6845. +
  6846. +/*
  6847. + * A couple of speedups for the ARM
  6848. + */
  6849. +#define save_flags_cli(x)        \
  6850. +    do {                \
  6851. +      unsigned long temp;        \
  6852. +      __asm__ __volatile__(        \
  6853. +"    mov    %0, pc\n"        \
  6854. +"    orr    %1, %0, #0x08000000\n"    \
  6855. +"    and    %0, %0, #0x0c000000\n"    \
  6856. +"    teqp    %1, #0\n"        \
  6857. +      : "=r" (x), "=r" (temp));    \
  6858. +    } while (0)
  6859. +    
  6860. +
  6861. +#define sti()                \
  6862. +    do {                \
  6863. +      unsigned long temp;        \
  6864. +      __asm__ __volatile__(        \
  6865. +"    mov    %0, pc\n"        \
  6866. +"    bic    %0, %0, #0x08000000\n"    \
  6867. +"    teqp    %0, #0\n"        \
  6868. +      : "=r" (temp)            \
  6869. +      : );                \
  6870. +    } while(0)
  6871. +
  6872. +#define cli()                \
  6873. +    do {                \
  6874. +      unsigned long temp;        \
  6875. +      __asm__ __volatile__(        \
  6876. +"    mov    %0, pc\n"        \
  6877. +"    orr    %0, %0, #0x08000000\n"    \
  6878. +"    teqp    %0, #0\n"        \
  6879. +      : "=r" (temp)            \
  6880. +      : );                \
  6881. +    } while(0)
  6882. +
  6883. +#define save_flags(x)            \
  6884. +    do {                \
  6885. +      __asm__ __volatile__(        \
  6886. +"    mov    %0, pc\n"        \
  6887. +"    and    %0, %0, #0x0c000000\n"    \
  6888. +      : "=r" (x) : );        \
  6889. +    } while (0)
  6890. +
  6891. +#define restore_flags(x)        \
  6892. +    do {                \
  6893. +      unsigned long temp;        \
  6894. +      __asm__ __volatile__(        \
  6895. +"    mov    %0, pc\n"        \
  6896. +"    bic    %0, %0, #0x0c000000\n"    \
  6897. +"    orr    %0, %0, %1\n"        \
  6898. +"    teqp    %0, #0\n"        \
  6899. +      : "=r" (temp)            \
  6900. +      : "r" (x)            \
  6901. +      : "cc");            \
  6902. +    } while (0)
  6903. +
  6904. +#endif
  6905. diff -urN linux.store/linux/include/asm-arm/proc-arm3/hardware.h linux/include/asm-arm/proc-arm3/hardware.h
  6906. --- linux.store/linux/include/asm-arm/proc-arm3/hardware.h    Thu Jan  1 01:00:00 1970
  6907. +++ linux/include/asm-arm/proc-arm3/hardware.h    Fri Mar 22 23:43:01 1996
  6908. @@ -0,0 +1,36 @@
  6909. +/*
  6910. + * linux/include/asm-arm/proc-arm3/hardware.h
  6911. + *
  6912. + * Copyright (C) 1996 Russell King
  6913. + */
  6914. +
  6915. +#ifndef __ASM_PROC_HARDWARE_H
  6916. +#define __ASM_PROC_HARDWARE_H
  6917. +
  6918. +#include <asm/procinfo.h>
  6919. +
  6920. +#ifndef __ASSEMBLER__
  6921. +/*
  6922. + * Need to setup cache on ARM3, but not the ARM250
  6923. + */
  6924. +extern __inline__ void cache_setup (int features)
  6925. +{
  6926. +    if (features & F_CACHE) {
  6927. +    __asm__ __volatile__("
  6928. +    mcr    15, 0, %0, c3, c0
  6929. +    mcr    15, 0, %1, c4, c0
  6930. +    mcr    15, 0, %2, c5, c0
  6931. +    mcr    15, 0, %3, c1, c0
  6932. +    mcr    15, 0, %3, c2, c0
  6933. +    " : : "r" (0x000e7fff), "r" (0x000e7fff), "r" (0xf0000000), "r" (3));
  6934. +    } else {
  6935. +        extern unsigned long armcache_flush[2];
  6936. +
  6937. +        armcache_flush[0] = armcache_flush[1];
  6938. +    }
  6939. +}
  6940. +
  6941. +#endif
  6942. +
  6943. +#endif
  6944. +
  6945. diff -urN linux.store/linux/include/asm-arm/proc-arm6/bugs.h linux/include/asm-arm/proc-arm6/bugs.h
  6946. --- linux.store/linux/include/asm-arm/proc-arm6/bugs.h    Thu Jan  1 01:00:00 1970
  6947. +++ linux/include/asm-arm/proc-arm6/bugs.h    Sun Mar 17 16:22:43 1996
  6948. @@ -0,0 +1,18 @@
  6949. +/*
  6950. + *  include/asm-arm/proc-arm6/bugs.h
  6951. + *
  6952. + *  Copyright (C) 1995  Russell King
  6953. + */
  6954. +
  6955. +/*
  6956. + * This is included by init/main.c to check for architecture-dependent bugs.
  6957. + *
  6958. + *      void check_bugs(void);
  6959. + * For now, it just loops indefinitely...
  6960. + */
  6961. +         
  6962. +static inline void check_bugs(void)
  6963. +{
  6964. +while (1);
  6965. +}
  6966. +
  6967. diff -urN linux.store/linux/include/asm-arm/proc-arm6/param.h linux/include/asm-arm/proc-arm6/param.h
  6968. --- linux.store/linux/include/asm-arm/proc-arm6/param.h    Wed Mar 13 23:55:17 1996
  6969. +++ linux/include/asm-arm/proc-arm6/param.h    Sun Mar 17 15:41:52 1996
  6970. @@ -5,7 +5,7 @@
  6971.  #define HZ 100
  6972.  #endif
  6973.  
  6974. -#define EXEC_PAGESIZE   32768
  6975. +#define EXEC_PAGESIZE   4096
  6976.  
  6977.  #ifndef NGROUPS
  6978.  #define NGROUPS         32
  6979. diff -urN linux.store/linux/include/asm-arm/proc-arm6/ptrace.h linux/include/asm-arm/proc-arm6/ptrace.h
  6980. --- linux.store/linux/include/asm-arm/proc-arm6/ptrace.h    Wed Mar 13 23:55:17 1996
  6981. +++ linux/include/asm-arm/proc-arm6/ptrace.h    Sun Mar 17 15:50:10 1996
  6982. @@ -7,9 +7,22 @@
  6983.  #ifndef __ASM_PROC_PTRACE_H
  6984.  #define __ASM_PROC_PTRACE_H
  6985.  
  6986. -#error Have to modify this
  6987. -#define user_mode(regs)            (((regs)->ARM_pc & 3) == 0)
  6988. -#define instruction_pointer(regs)    ((regs)->ARM_pc & 0x03fffffc)
  6989. +#define USR_MODE    0x10
  6990. +#define FIQ_MODE    0x11
  6991. +#define IRQ_MODE    0x12
  6992. +#define SVC_MODE    0x13
  6993. +#define ABT_MODE    0x17
  6994. +#define UND_MODE    0x1B
  6995. +
  6996. +#define user_mode(regs)    \
  6997. +    ({ unsigned long reg;
  6998. +    __asm__ __volatile__("\
  6999. +    mrs    %0, CPSR\n\
  7000. +    and    %0, %0, #31\n\"
  7001. +    : "=r" (reg));\
  7002. +    return reg == USR_MODE; })
  7003. +    
  7004. +#define instruction_pointer(regs)    ((regs)->ARM_pc)
  7005.  
  7006.  #endif
  7007.  
  7008. diff -urN linux.store/linux/include/asm-arm/proc-arm6/segment.h linux/include/asm-arm/proc-arm6/segment.h
  7009. --- linux.store/linux/include/asm-arm/proc-arm6/segment.h    Thu Jan  1 01:00:00 1970
  7010. +++ linux/include/asm-arm/proc-arm6/segment.h    Sun Mar 17 15:51:14 1996
  7011. @@ -0,0 +1,121 @@
  7012. +/*
  7013. + * linux/include/asm-arm/proc-arm6/segment.h
  7014. + *
  7015. + * Copyright (C) 1996 Russell King
  7016. + */
  7017. +
  7018. +#ifndef __ASM_PROC_SEGMENT_H
  7019. +#define __ASM_PROC_SEGMENT_H
  7020. +
  7021. +static inline void __put_user(unsigned long x, void * y, int size)
  7022. +{
  7023. +    if (IS_USER_SEG) {
  7024. +        switch (size) {
  7025. +            case 1:
  7026. +                __asm__(
  7027. +                " strbt    %0, [%1]\n"
  7028. +                : : "r" (x), "r" (y)
  7029. +                : "lr", "cc");
  7030. +                break;
  7031. +            case 2:
  7032. +                { register unsigned long tmp;
  7033. +                __asm__ __volatile__(
  7034. +                " strbt %1, [%2], #1\n"
  7035. +                " mov   %0, %1, lsr #8\n"
  7036. +                " strbt %0, [%2]\n"
  7037. +                : "=&r" (tmp)
  7038. +                : "r" (x), "r" (y)
  7039. +                : "2", "lr", "cc");
  7040. +                }
  7041. +                break;
  7042. +            case 4:
  7043. +                if ((int)y & 3) {
  7044. +                register unsigned long tmp;
  7045. +                __asm__ __volatile__(
  7046. +                " strbt %1, [%2], #1\n"
  7047. +                " mov   %0, %1, lsr #8\n"
  7048. +                " strbt %0, [%2], #1\n"
  7049. +                " mov   %0, %0, lsr #8\n"
  7050. +                " strbt %0, [%2], #1\n"
  7051. +                " mov   %0, %0, lsr #8\n"
  7052. +                " strbt %0, [%2]\n"
  7053. +                : "=&r" (tmp)
  7054. +                : "r" (x), "r" (y)
  7055. +                : "2", "lr", "cc");
  7056. +                } else {
  7057. +                __asm__(
  7058. +                " strt  %0, [%1]\n"
  7059. +                : : "r" (x), "r" (y)
  7060. +                : "lr", "cc");
  7061. +                }
  7062. +                break;
  7063. +            default:
  7064. +                bad_user_access_length();
  7065. +        }
  7066. +    } else {
  7067. +        switch (size) {
  7068. +            case 1: *(unsigned char *)y = x; break;
  7069. +            case 2: *(unsigned short *)y = x; break;
  7070. +            case 4: *(unsigned long *)y = x; break;
  7071. +            default:
  7072. +                bad_user_access_length();
  7073. +        }
  7074. +    }
  7075. +}
  7076. +
  7077. +static inline unsigned long __get_user(const void *y, int size)
  7078. +{
  7079. +    unsigned long result1, result2;
  7080. +
  7081. +    if (IS_USER_SEG) {
  7082. +        switch (size) {
  7083. +            case 1:
  7084. +                __asm__(
  7085. +                " ldrbt %0, [%1]\n"
  7086. +                : "=r" (result1)
  7087. +                : "r" (y)
  7088. +                : "lr", "cc");
  7089. +                return result1;
  7090. +            case 2:
  7091. +                __asm__(
  7092. +                " ldrbt %0, [%2], #1\n"
  7093. +                " ldrbt %1, [%2]\n"
  7094. +                " orr   %0, %0, %1, lsl #8\n"
  7095. +                : "=&r" (result1), "=r" (result2)
  7096. +                : "r" (y)
  7097. +                : "lr", "cc");
  7098. +                return result1;
  7099. +            case 4:
  7100. +                if ((int)y & 3) {
  7101. +                __asm__(
  7102. +                " ldrt %0, [%2], #4\n"
  7103. +                " ldrt %1, [%2]\n"
  7104. +                : "=&r" (result1), "=r" (result2)
  7105. +                : "r" ((int)y & ~3)
  7106. +                : "lr", "cc");
  7107. +                result1 >>= ((int)y & 3)*8;
  7108. +                return result1 | (result2 << (32-((int)y & 3)*8));
  7109. +                } else {
  7110. +                __asm__(
  7111. +                " ldrt %0, [%1]\n"
  7112. +                : "=r" (result1)
  7113. +                : "r" (y)
  7114. +                : "lr", "cc");
  7115. +                return result1;
  7116. +                }
  7117. +            default:
  7118. +                return bad_user_access_length();
  7119. +        }
  7120. +    } else {
  7121. +        switch (size) {
  7122. +            case 1: return *(unsigned char *)y; break;
  7123. +            case 2: return *(unsigned short *)y; break;
  7124. +            case 4: return *(unsigned long *)y; break;
  7125. +            default:
  7126. +                return bad_user_access_length();
  7127. +        }
  7128. +    }
  7129. +}        
  7130. +
  7131. +#endif /* __ASM_PROC_SEGMENT_H */
  7132. +
  7133. diff -urN linux.store/linux/include/asm-arm/proc-arm6/system.h linux/include/asm-arm/proc-arm6/system.h
  7134. --- linux.store/linux/include/asm-arm/proc-arm6/system.h    Thu Jan  1 01:00:00 1970
  7135. +++ linux/include/asm-arm/proc-arm6/system.h    Sun Mar 17 16:17:05 1996
  7136. @@ -0,0 +1,139 @@
  7137. +/*
  7138. + * linux/include/asm-arm/proc-arm6/system.h
  7139. + *
  7140. + * Copyright (C) 1996 Russell King
  7141. + */
  7142. +
  7143. +#ifndef __ASM_PROC_SYSTEM_H
  7144. +#define __ASM_PROC_SYSTEM_H
  7145. +
  7146. +static inline unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
  7147. +{
  7148. +    switch (size) {
  7149. +        case 1:
  7150. +            __asm__ __volatile__(
  7151. +            " swpb   %0, %1, [%2]\n\t"
  7152. +            : "=r" (x)
  7153. +            : "r" (x), "r" (ptr)
  7154. +            : "memory");
  7155. +            break;
  7156. +        case 2: { unsigned long temp0, temp1;
  7157. +            if (((long)ptr) & 1)
  7158. +            {
  7159. +                void *pc;
  7160. +                __asm__("mov\t%0, pc": "=r" (pc));
  7161. +                arm_malalignedptr("xchg", pc, ptr);
  7162. +            }
  7163. +            __asm__ __volatile__(
  7164. +            " mov   %0, pc\n"
  7165. +            " orr   %1, %0, #0x08000000\n"
  7166. +            " teqp  %1, #0\n"
  7167. +            " mov   %1, %3\n"
  7168. +            " ldr    %2, [%4]\n"
  7169. +            " strb  %1, [%4]\n"
  7170. +            " mov   %1, %1, lsr #8\n"
  7171. +            " strb  %1, [%4, #1]\n"
  7172. +            " teqp  %0, #0\n"
  7173. +            : "=r" (temp0), "=r" (temp1), "=r" (x)
  7174. +            : "r" (x), "r" (ptr)
  7175. +            : "memory");
  7176. +            x &= 0xffff;
  7177. +            break;
  7178. +            }
  7179. +        case 4: if (((long)ptr) & 3)
  7180. +            {
  7181. +                void *pc;
  7182. +                __asm__("mov\t%0, pc": "=r" (pc));
  7183. +                arm_malalignedptr("xchg", pc, ptr);
  7184. +            }
  7185. +            __asm__ __volatile__(
  7186. +            " swp   %0, %1, [%2]\n"
  7187. +            : "=r" (x)
  7188. +            : "r" (x), "r" (ptr)
  7189. +            : "memory");
  7190. +            break;
  7191. +        default:
  7192. +            {
  7193. +                void *pc;
  7194. +                __asm__("mov\t%0, pc": "=r" (pc));
  7195. +                arm_invalidptr("xchg", pc, size);
  7196. +                x = 0;
  7197. +            }
  7198. +    }
  7199. +    return x;
  7200. +}
  7201. +
  7202. +/*
  7203. + * A couple of speedups for the ARM
  7204. + */
  7205. +
  7206. +/*
  7207. + * Save the current interrupt enable state & disable IRQs
  7208. + */
  7209. +#define save_flags_cli(x)        \
  7210. +    do {                \
  7211. +      unsigned long temp;        \
  7212. +      __asm__ __volatile__(        \
  7213. +"    mrs    %0, CPSR\n"        \
  7214. +"    orr    %1, %0, #128\n"        \
  7215. +"    and    %0, %0, #192\n"        \
  7216. +"    msr    CPSR, %0\n"        \
  7217. +      : "=r" (x), "=r" (temp));    \
  7218. +    } while (0)
  7219. +    
  7220. +/*
  7221. + * Enable IRQs
  7222. + */
  7223. +#define sti()                \
  7224. +    do {                \
  7225. +      unsigned long temp;        \
  7226. +      __asm__ __volatile__(        \
  7227. +"    mrs    %0, CPSR\n"        \
  7228. +"    bic    %0, %0, #128\n"        \
  7229. +"    msr    CPSR, %0\n"        \
  7230. +      : "=r" (temp)            \
  7231. +      : );                \
  7232. +    } while(0)
  7233. +
  7234. +/*
  7235. + * Disable IRQs
  7236. + */    
  7237. +#define cli()                \
  7238. +    do {                \
  7239. +      unsigned long temp;        \
  7240. +      __asm__ __volatile__(        \
  7241. +"    mrs    %0, CPSR\n"        \
  7242. +"    orr    %0, %0, #128\n"        \
  7243. +"    msr    CPSR, %0\n"        \
  7244. +      : "=r" (temp)            \
  7245. +      : );                \
  7246. +    } while(0)
  7247. +
  7248. +/*
  7249. + * save current IRQ & FIQ state
  7250. + */
  7251. +#define save_flags(x)            \
  7252. +    do {                \
  7253. +      __asm__ __volatile__(        \
  7254. +"    mrs    %0, CPSR"        \
  7255. +"    and    %0, %0, #192\n"    \
  7256. +      : "=r" (x) : );        \
  7257. +    } while (0)
  7258. +
  7259. +/*
  7260. + * restore saved IRQ & FIQ state
  7261. + */
  7262. +#define restore_flags(x)        \
  7263. +    do {                \
  7264. +      unsigned long temp;        \
  7265. +      __asm__ __volatile__(        \
  7266. +"    mrs    %0, CPSR\n"        \
  7267. +"    bic    %0, %0, #192\n"        \
  7268. +"    orr    %0, %0, %1\n"        \
  7269. +"    msr    CPSR, %0\n"        \
  7270. +      : "=r" (temp)            \
  7271. +      : "r" (x)            \
  7272. +      : "cc");            \
  7273. +    } while (0)
  7274. +
  7275. +#endif
  7276. diff -urN linux.store/linux/include/asm-arm/procinfo.h linux/include/asm-arm/procinfo.h
  7277. --- linux.store/linux/include/asm-arm/procinfo.h    Thu Jan  1 01:00:00 1970
  7278. +++ linux/include/asm-arm/procinfo.h    Fri Mar 22 23:42:37 1996
  7279. @@ -0,0 +1,29 @@
  7280. +/*
  7281. + * linux/include/asm-arm/procinfo.h
  7282. + *
  7283. + * Copyright (C) 1996 Russell King
  7284. + */
  7285. +
  7286. +#ifndef __ASM_PROCINFO_H
  7287. +#define __ASM_PROCINFO_H
  7288. +
  7289. +#define F_MEMC   (1<<0)
  7290. +#define F_MMU    (1<<1)
  7291. +#define F_32BIT  (1<<2)
  7292. +#define F_CACHE  (1<<3)
  7293. +#define F_IOEB   (1<<31)
  7294. +
  7295. +#ifndef __ASSEMBLER__
  7296. +
  7297. +struct armversions {
  7298. +    unsigned long id;
  7299. +    unsigned long mask;
  7300. +    unsigned long features;
  7301. +    const char *manu;
  7302. +    const char *name;
  7303. +};
  7304. +
  7305. +#endif
  7306. +
  7307. +#endif
  7308. +
  7309. diff -urN linux.store/linux/kernel/ksyms.c linux/kernel/ksyms.c
  7310. --- linux.store/linux/kernel/ksyms.c    Sun Feb 11 09:33:02 1996
  7311. +++ linux/kernel/ksyms.c    Fri Mar 22 23:29:14 1996
  7312. @@ -536,6 +536,7 @@
  7313.      /* expansion card support */
  7314.      X(ecard_find),
  7315.      X(ecard_readchunk),
  7316. +    X(ecard_address),
  7317.      X(udelay),
  7318.  
  7319.      /* user mem (segment) */
  7320. diff -urN linux.store/linux/mm/swap.c linux/mm/swap.c
  7321. --- linux.store/linux/mm/swap.c    Thu Feb 22 23:30:57 1996
  7322. +++ linux/mm/swap.c    Fri Mar 22 23:46:49 1996
  7323. @@ -211,17 +211,17 @@
  7324.          kstat.pswpout++;
  7325.  #if defined(__arm__) && defined (__arm3__)
  7326.      if (rw == WRITE) {
  7327. -        extern void arm3_flushcache (void);
  7328. +        extern void armcache_flush (void);
  7329.          /*
  7330.           * Seeing as we might be swapping out some memory from
  7331.           * physical addresses, and it is cached, and mapped into
  7332.           * logical addresses and cached there as well, we *must*
  7333. -         * flush the cache so that we read the page correctly.
  7334. +         * flush the cache so that we write the page correctly.
  7335.           * No need to do this when we read, since the page has
  7336.           * to be put into logical mem, which requires invalidating
  7337.           * the memory map, which in turn flushes the cache.
  7338.           */
  7339. -        arm3_flushcache ();
  7340. +        armcache_flush ();
  7341.      }
  7342.  #endif
  7343.      
  7344.