source: patches/silo-1.4.14-fixes-3.patch@ a3e5d4f

clfs-2.1 clfs-3.0.0-systemd clfs-3.0.0-sysvinit systemd sysvinit
Last change on this file since a3e5d4f was a3e5d4f, checked in by William Harrington <kb0iic@…>, 12 years ago

Add header information to silo-1.4.14-fixes-3.patch

  • Property mode set to 100644
File size: 31.0 KB
RevLine 
[a3e5d4f]1Submitted By: William Harrington <kb0iic at gmail dot com>
2Date: 2012-09-01
3Initial Package Version: 1.4.14
4Upstream Status: Unknown
5Origin: git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/davem/silo
6Description: Fixes for current silo.1.4.14 not yet released.
7
[711fda6]8diff -Naur silo-1.4.14.orig/Rules.make silo-1.4.14/Rules.make
9--- silo-1.4.14.orig/Rules.make 2008-06-12 16:39:12.000000000 +0000
10+++ silo-1.4.14/Rules.make 2012-09-01 19:14:27.000000000 +0000
11@@ -1,4 +1,4 @@
12-VERSION=1.4.14
13+VERSION=1.4.14_git20120901
14 IMGVERSION=0.99
15 SHELL=/bin/bash
16 RM=rm -f
17@@ -18,8 +18,8 @@
18 > /dev/null 2>&1; then echo "y"; else echo "n"; fi;)
19
20 CFLAGS = -Os -Wall -I. -I../include -fomit-frame-pointer \
21- -fno-strict-aliasing -DSMALL_RELOC=$(SMALL_RELOC) \
22- -DLARGE_RELOC=$(LARGE_RELOC)
23+ -fno-strict-aliasing -U_FORTIFY_SOURCE \
24+ -DSMALL_RELOC=$(SMALL_RELOC) -DLARGE_RELOC=$(LARGE_RELOC)
25
26 ifeq ($(call cc-option-yn, -fno-stack-protector),y)
27 CFLAGS += -fno-stack-protector
28diff -Naur silo-1.4.14.orig/common/.gitignore silo-1.4.14/common/.gitignore
29--- silo-1.4.14.orig/common/.gitignore 1970-01-01 00:00:00.000000000 +0000
30+++ silo-1.4.14/common/.gitignore 2012-09-01 19:05:11.000000000 +0000
31@@ -0,0 +1,4 @@
32+#
33+# Generated files
34+#
35+bin2h
36diff -Naur silo-1.4.14.orig/common/divdi3.S silo-1.4.14/common/divdi3.S
37--- silo-1.4.14.orig/common/divdi3.S 2008-06-12 16:39:12.000000000 +0000
38+++ silo-1.4.14/common/divdi3.S 2012-09-01 19:06:01.000000000 +0000
39@@ -20,6 +20,8 @@
40 .data
41 .align 8
42 .globl __clz_tab
43+ .register %g2,#scratch
44+ .register %g3,#scratch
45 __clz_tab:
46 .byte 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
47 .byte 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6
48diff -Naur silo-1.4.14.orig/common/malloc.c silo-1.4.14/common/malloc.c
49--- silo-1.4.14.orig/common/malloc.c 2008-06-12 16:39:12.000000000 +0000
50+++ silo-1.4.14/common/malloc.c 2012-09-01 19:05:11.000000000 +0000
51@@ -18,6 +18,8 @@
52 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
53 USA. */
54
55+#include <stringops.h>
56+
57 #ifndef MALLOC_BASE
58 extern unsigned long _start;
59 static char *malloc_ptr = ((char *)&_start) + 0x30000;
60@@ -27,6 +29,12 @@
61
62 static char *last_alloc = 0;
63
64+static char *align_ptr_to(char *ptr, unsigned long align)
65+{
66+ return (char *) ((((unsigned long) ptr) + (align - 1UL)) &
67+ ~(align - 1UL));
68+}
69+
70 void *malloc (int size)
71 {
72 char *caddr;
73@@ -34,10 +42,51 @@
74 caddr = malloc_ptr;
75 malloc_ptr += size;
76 last_alloc = caddr;
77- malloc_ptr = (char *) ((((unsigned long) malloc_ptr) + 7) & (~7));
78+ malloc_ptr = align_ptr_to(malloc_ptr, 8UL);
79 return caddr;
80 }
81
82+void *calloc (int nmemb, int memb_size)
83+{
84+ char *ret;
85+ int size;
86+
87+ if (!nmemb || !memb_size)
88+ return (void *) 0;
89+
90+ size = nmemb * memb_size;
91+ ret = malloc(size);
92+
93+ if (ret)
94+ memset(ret, 0, size);
95+
96+ return ret;
97+}
98+
99+int posix_memalign(void **memptr, unsigned long alignment, unsigned long size)
100+{
101+ char *caddr;
102+
103+ if (alignment & (alignment - 1UL))
104+ return -1;
105+ if (alignment & (sizeof(void *) - 1UL))
106+ return -1;
107+
108+ if (size == 0) {
109+ *memptr = (void *) 0;
110+ return 0;
111+ }
112+
113+ caddr = align_ptr_to(malloc_ptr, alignment);
114+ malloc_ptr = (caddr + size);
115+ last_alloc = caddr;
116+ malloc_ptr = align_ptr_to(malloc_ptr, 8UL);
117+
118+ *memptr = caddr;
119+
120+ return 0;
121+}
122+
123 void free (void *m)
124 {
125 if (m == last_alloc)
126diff -Naur silo-1.4.14.orig/common/printf.c silo-1.4.14/common/printf.c
127--- silo-1.4.14.orig/common/printf.c 2008-06-12 16:39:12.000000000 +0000
128+++ silo-1.4.14/common/printf.c 2012-09-01 19:05:11.000000000 +0000
129@@ -21,6 +21,7 @@
130 USA. */
131
132 #include "promlib.h"
133+#include <stringops.h>
134
135 /*
136 * This part is rewritten by Igor Timkin <ivt@msu.su>. Than I
137@@ -147,3 +148,91 @@
138 vprintf (fmt, x1);
139 va_end (x1);
140 }
141+
142+static int sprintn (char *str, long long n, int b)
143+{
144+ static char prbuf[33];
145+ register char *cp;
146+ int count = 0;
147+
148+ if (b == 10 && n < 0) {
149+ memset (str + count, '-', 1);
150+ count++;
151+ n = -n;
152+ }
153+ cp = prbuf;
154+ do
155+ *cp++ = "0123456789ABCDEF"[(unsigned int) (((unsigned long)n) % b)];
156+ while ((n = ((unsigned long long)n) / b & 0x0FFFFFFFFFFFFFFFULL));
157+ do {
158+ memset (str + count, *--cp, 1);
159+ count++;
160+ } while (cp > prbuf);
161+
162+ return count;
163+}
164+
165+int vsprintf (char *str, char *fmt, va_list adx)
166+{
167+ register int c;
168+ char *s;
169+ int count = 0;
170+
171+ for (;;) {
172+ while ((c = *fmt++) != '%') {
173+ memset (str + count, c, 1);
174+ if (c == '\0') {
175+ return count;
176+ }
177+ }
178+ c = *fmt++;
179+ if (c == 'd' || c == 'o' || c == 'x' || c == 'X') {
180+ count += sprintn (str + count, (long long) va_arg (adx, unsigned),
181+ c == 'o' ? 8 : (c == 'd' ? 10 : 16));
182+ } else if (c == 'c') {
183+ memset (str + count, va_arg (adx, unsigned), 1);
184+ count++;
185+ } else if (c == 's') {
186+ if ((s = va_arg (adx, char *)) == NULL)
187+ s = (char *)"(null)";
188+ while ((c = *s++)) {
189+ memset (str + count, c, 1);
190+ count++;
191+ }
192+ } else if (c == 'l' || c == 'O') {
193+ count += sprintn (str + count, (long long) va_arg (adx, long), c == 'l' ? 10 : 8);
194+ } else if (c == 'L') {
195+ int hex = 0;
196+ if (*fmt == 'x') {
197+ fmt++;
198+ hex = 1;
199+ }
200+ count += sprintn (str + count, (long long) va_arg (adx, long long), hex ? 16 : 10);
201+ } else {
202+ /* This is basically what libc's printf does */
203+ memset (str + count, '%', 1);
204+ count++;
205+ memset (str + count, c, 1);
206+ count++;
207+ }
208+ }
209+
210+ return count;
211+}
212+
213+/*
214+ * Scaled down version of C Library sprintf.
215+ * Only %c %s %d (==%u) %o %x %X %l %O are recognized.
216+ */
217+
218+int sprintf (char *s, char *format, ...)
219+{
220+ va_list arg;
221+ int done;
222+
223+ va_start (arg, format);
224+ done = vsprintf (s, format, arg);
225+ va_end (arg);
226+
227+ return done;
228+}
229diff -Naur silo-1.4.14.orig/common/udivdi3.S silo-1.4.14/common/udivdi3.S
230--- silo-1.4.14.orig/common/udivdi3.S 2008-06-12 16:39:12.000000000 +0000
231+++ silo-1.4.14/common/udivdi3.S 2012-09-01 19:09:16.000000000 +0000
232@@ -20,6 +20,8 @@
233 .text
234 .align 4
235 .globl __udivdi3
236+ .register %g2,#scratch
237+ .register %g3,#scratch
238 __udivdi3:
239 save %sp,-104,%sp
240 mov %i3,%o3
241diff -Naur silo-1.4.14.orig/first/.gitignore silo-1.4.14/first/.gitignore
242--- silo-1.4.14.orig/first/.gitignore 1970-01-01 00:00:00.000000000 +0000
243+++ silo-1.4.14/first/.gitignore 2012-09-01 19:05:11.000000000 +0000
244@@ -0,0 +1,16 @@
245+#
246+# Generated files
247+#
248+fd
249+fd.b
250+fd.h
251+first
252+first.b
253+first.h
254+generic
255+generic.b
256+generic.h
257+ieee32.b
258+ultra
259+ultra.b
260+ultra.h
261diff -Naur silo-1.4.14.orig/first-isofs/.gitignore silo-1.4.14/first-isofs/.gitignore
262--- silo-1.4.14.orig/first-isofs/.gitignore 1970-01-01 00:00:00.000000000 +0000
263+++ silo-1.4.14/first-isofs/.gitignore 2012-09-01 19:05:11.000000000 +0000
264@@ -0,0 +1,5 @@
265+#
266+# Generated files
267+#
268+isofs
269+isofs.b
270diff -Naur silo-1.4.14.orig/include/ext2fs/ext2fs.h silo-1.4.14/include/ext2fs/ext2fs.h
271--- silo-1.4.14.orig/include/ext2fs/ext2fs.h 2008-06-12 16:39:12.000000000 +0000
272+++ silo-1.4.14/include/ext2fs/ext2fs.h 2012-09-01 19:05:11.000000000 +0000
273@@ -39,7 +39,7 @@
274 */
275 #define EXT2_LIB_CURRENT_REV 0
276
277-#ifdef HAVE_SYS_TYPES_H
278+#if defined(HAVE_SYS_TYPES_H)
279 #include <sys/types.h>
280 #endif
281
282diff -Naur silo-1.4.14.orig/include/silo.h silo-1.4.14/include/silo.h
283--- silo-1.4.14.orig/include/silo.h 2008-06-12 16:39:12.000000000 +0000
284+++ silo-1.4.14/include/silo.h 2012-09-01 19:05:11.000000000 +0000
285@@ -87,6 +87,8 @@
286 void silo_disk_close(void);
287 /* printf.c */
288 int vprintf (char *, va_list);
289+int vsprintf (char *str, char *fmt, va_list adx);
290+int sprintf (char *s, char *format, ...);
291 int putchar (int);
292 /* malloc.c */
293 void *malloc (int);
294@@ -123,6 +125,7 @@
295 int decompress (char *, char *, unsigned char (*)(void), void (*)(void));
296 /* main.c */
297 extern enum arch architecture;
298+extern int sun4v_cpu;
299 /* timer.c */
300 int init_timer ();
301 void close_timer ();
302diff -Naur silo-1.4.14.orig/include/stringops.h silo-1.4.14/include/stringops.h
303--- silo-1.4.14.orig/include/stringops.h 2008-06-12 16:39:12.000000000 +0000
304+++ silo-1.4.14/include/stringops.h 2012-09-01 19:05:11.000000000 +0000
305@@ -2,14 +2,13 @@
306 #define __STRINGOPS_H
307
308 #include <silo.h>
309+#include <stddef.h>
310
311 /* common */
312 #ifndef __SIZE_TYPE__
313 #define __SIZE_TYPE__ long unsigned int
314 #endif
315-#ifndef _LINUX_TYPES_H
316 typedef __SIZE_TYPE__ size_t;
317-#endif
318
319 /* stringops1.c */
320 char *strcpy(char *, const char *);
321diff -Naur silo-1.4.14.orig/second/.gitignore silo-1.4.14/second/.gitignore
322--- silo-1.4.14.orig/second/.gitignore 1970-01-01 00:00:00.000000000 +0000
323+++ silo-1.4.14/second/.gitignore 2012-09-01 19:05:11.000000000 +0000
324@@ -0,0 +1,12 @@
325+#
326+# Generated files
327+#
328+second
329+second.b
330+second.b2
331+second2
332+silotftp
333+silotftp.b
334+silotftp.b2
335+silotftp2
336+util
337diff -Naur silo-1.4.14.orig/second/Makefile silo-1.4.14/second/Makefile
338--- silo-1.4.14.orig/second/Makefile 2008-06-12 16:39:12.000000000 +0000
339+++ silo-1.4.14/second/Makefile 2012-09-01 19:05:11.000000000 +0000
340@@ -58,13 +58,13 @@
341 $(AR) rc $@ $(FS_OBJS)
342
343 second: $(OBJS) mark.o
344- $(LD) $(LDFLAGS_SMALL) -Bstatic -o second $(OBJS) -lext2fs mark.o
345- $(LD) $(LDFLAGS_LARGE) -Bstatic -o second2 $(OBJS) -lext2fs mark.o
346+ $(LD) $(LDFLAGS_SMALL) -Bstatic -o second $(OBJS) mark.o `$(CC) -print-libgcc-file-name`
347+ $(LD) $(LDFLAGS_LARGE) -Bstatic -o second2 $(OBJS) mark.o `$(CC) -print-libgcc-file-name`
348 $(NM) second | grep -v '*ABS*' | sort > second.map
349
350 silotftp: $(OBJSNET) mark.o
351- $(LD) $(LDFLAGS_SMALL) -Bstatic -o silotftp $(OBJSNET) -lext2fs mark.o
352- $(LD) $(LDFLAGS_LARGE) -Bstatic -o silotftp2 $(OBJSNET) -lext2fs mark.o
353+ $(LD) $(LDFLAGS_SMALL) -Bstatic -o silotftp $(OBJSNET) mark.o `$(CC) -print-libgcc-file-name`
354+ $(LD) $(LDFLAGS_LARGE) -Bstatic -o silotftp2 $(OBJSNET) mark.o `$(CC) -print-libgcc-file-name`
355 $(NM) silotftp | grep -v '*ABS*' | sort > silotftp.map
356
357 second.l: second
358diff -Naur silo-1.4.14.orig/second/file.c silo-1.4.14/second/file.c
359--- silo-1.4.14.orig/second/file.c 2008-06-12 16:39:12.000000000 +0000
360+++ silo-1.4.14/second/file.c 2012-09-01 19:05:11.000000000 +0000
361@@ -19,6 +19,7 @@
362 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
363 USA. */
364
365+#include <sys/types.h>
366 #include <silo.h>
367 #include <file.h>
368 #include <stringops.h>
369diff -Naur silo-1.4.14.orig/second/fs/ext2.c silo-1.4.14/second/fs/ext2.c
370--- silo-1.4.14.orig/second/fs/ext2.c 2008-06-12 16:39:12.000000000 +0000
371+++ silo-1.4.14/second/fs/ext2.c 2012-09-01 19:05:11.000000000 +0000
372@@ -3,6 +3,7 @@
373 Copyright (C) 1996 Maurizio Plaza
374 1996,1997,1999 Jakub Jelinek
375 2001 Ben Collins
376+ 2012 David S. Miller
377
378 This program is free software; you can redistribute it and/or modify
379 it under the terms of the GNU General Public License as published by
380@@ -27,118 +28,654 @@
381 static ino_t inode = 0;
382 struct fs_ops ext2_fs_ops;
383
384-void com_err (const char *a, long i, const char *fmt,...)
385+#define EXT2_SUPER_MAGIC 0xEF53
386+
387+static __u32 ext2_to_cpu_32(__u32 v)
388 {
389- printf ((char *) fmt);
390+ const __u8 *p = (const __u8 *) &v;
391+
392+ return ((__u32)p[3] << 24 |
393+ (__u32)p[2] << 16 |
394+ (__u32)p[1] << 8 |
395+ (__u32)p[0]);
396 }
397
398-static void ext2fs_error (int errcode)
399+static __u16 ext2_to_cpu_16(__u16 v)
400 {
401-#if 0
402- int i;
403- for (i = 0; i < sizeof (ext2errors) / sizeof (ext2errors[0]); i++)
404- if (ext2errors[i].errnum == errcode) {
405- printf ("%s", ext2errors [i].desc);
406- return;
407- }
408-#endif
409- printf ("Unknown ext2 error: %d", errcode);
410+ const __u8 *p = (const __u8 *) &v;
411+
412+ return ((__u16)p[1] << 8) | ((__u16)p[0]);
413 }
414
415-static int open_ext2 (char *device)
416+struct silo_ext2_state {
417+ struct ext2_super_block *super;
418+
419+ void *scratch_block[4];
420+ __u32 scratch_block_blk[4];
421+
422+ __u32 inode_size;
423+ __u32 block_size;
424+ __u32 addr_per_block;
425+ __u32 addr_per_block_bits;
426+ __u32 desc_per_block;
427+ __u32 desc_per_block_bits;
428+};
429+static struct silo_ext2_state *sstate;
430+
431+static __u32 ext2_inode_size(struct silo_ext2_state *s)
432 {
433- int retval;
434+ __u32 rev = ext2_to_cpu_32(s->super->s_rev_level);
435
436- retval = ext2fs_open (device, EXT2_FLAG_DIRTY, 0, 0, silo_io_manager, &fs);
437- if (retval == EXT2_ET_BAD_MAGIC)
438- return 0;
439- if (retval) {
440- printf ("\n");
441- ext2fs_error (retval);
442- printf ("\n");
443- return 0;
444- }
445- root = EXT2_ROOT_INO;
446- return 1;
447+ if (rev == 0)
448+ return 128;
449+
450+ return ext2_to_cpu_16(s->super->s_inode_size);
451 }
452
453-static int dump_block_ext2 (ext2_filsys fs, blk_t *blocknr,
454- int blockcnt, void *private)
455+static __u32 ext2_block_size(struct silo_ext2_state *s)
456 {
457- return dump_block(blocknr, blockcnt);
458+ __u32 x = ext2_to_cpu_32(s->super->s_log_block_size);
459+
460+ x += 1;
461+
462+ return ((__u32) 1 << x) * 512;
463 }
464
465-static int dump_ext2 (void)
466+static void read_scratch_block(struct silo_ext2_state *s, __u32 block, int N)
467 {
468- if (ext2fs_block_iterate (fs, inode, 0, 0, dump_block_ext2, 0))
469+ if (s->scratch_block_blk[N] == block)
470+ return;
471+ io_channel_read_blk(fs->io, block, 1, s->scratch_block[N]);
472+ s->scratch_block_blk[N] = block;
473+}
474+
475+static void read_data(struct silo_ext2_state *s, __u32 block, __u32 off, __u32 len, void *buf)
476+{
477+ read_scratch_block(s, block, 0);
478+ memcpy(buf, s->scratch_block[0] + off, len);
479+}
480+
481+static int has_extents(struct ext2_inode *ip)
482+{
483+ if (ext2_to_cpu_32(ip->i_flags) & 0x80000)
484+ return 1;
485 return 0;
486+}
487+
488+#define EXT4_EXT_MAGIC 0xf30a
489+
490+struct ext4_extent_header {
491+ __u16 eh_magic;
492+ __u16 eh_entries;
493+ __u16 eh_max;
494+ __u16 eh_depth;
495+ __u32 eh_generation;
496+};
497+
498+struct ext4_extent_idx {
499+ __u32 ei_block;
500+ __u32 ei_leaf_lo;
501+ __u16 ei_leaf_hi;
502+ __u16 ei_unused;
503+};
504+
505+struct ext4_extent {
506+ __u32 ee_block;
507+ __u16 ee_len;
508+ __u16 ee_start_hi;
509+ __u32 ee_start_lo;
510+};
511+
512+static struct ext4_extent_header *search_leaf(struct silo_ext2_state *s,
513+ struct ext2_inode *ip,
514+ unsigned long long file_block)
515+{
516+ struct ext4_extent_header *ehp;
517+
518+ ehp = (struct ext4_extent_header *) &ip->i_block[0];
519+ for (;;) {
520+ unsigned long long ext_block, hi, lo;
521+ struct ext4_extent_idx *idxp;
522+ int i;
523+
524+ idxp = (struct ext4_extent_idx *) (ehp + 1);
525+
526+ if (ext2_to_cpu_16(ehp->eh_magic) != EXT4_EXT_MAGIC)
527+ return (struct ext4_extent_header *) 0;
528+
529+ if (ehp->eh_depth == ext2_to_cpu_16(0))
530+ return ehp;
531+
532+ for (i = 0; i < ext2_to_cpu_16(ehp->eh_entries); i++, idxp++)
533+ if (file_block < ext2_to_cpu_32(idxp->ei_block))
534+ break;
535+
536+ if (i == 0)
537+ return (struct ext4_extent_header *) 0;
538+
539+ idxp -= 1;
540+
541+ hi = ((unsigned long long)ext2_to_cpu_16(idxp->ei_leaf_hi)) << 32;
542+ lo = ext2_to_cpu_32(idxp->ei_leaf_lo);
543+ ext_block = hi | lo;
544+
545+ read_scratch_block(s, ext_block, 0);
546+ ehp = (struct ext4_extent_header *) s->scratch_block[0];
547+ }
548+}
549+
550+#define BLOCK_MAP_ERROR (~0ULL)
551+
552+static int block_to_path(struct silo_ext2_state *s, struct ext2_inode *ip,
553+ int offsets[4], long file_block)
554+{
555+ int ptrs_bits = s->addr_per_block_bits;
556+ int ptrs = s->addr_per_block;
557+ const long direct_blocks = EXT2_NDIR_BLOCKS,
558+ indirect_blocks = ptrs,
559+ double_blocks = (1 << (ptrs_bits * 2));
560+ int n = 0;
561+
562+ if (file_block < 0) {
563+ printf("EXT2: Illegal file block %ld\n", file_block);
564+ } else if (file_block < direct_blocks) {
565+ offsets[n++] = file_block;
566+ } else if ((file_block -= direct_blocks) < indirect_blocks) {
567+ offsets[n++] = EXT2_IND_BLOCK;
568+ offsets[n++] = file_block;
569+ } else if ((file_block -= indirect_blocks) < double_blocks) {
570+ offsets[n++] = EXT2_DIND_BLOCK;
571+ offsets[n++] = file_block >> ptrs_bits;
572+ offsets[n++] = file_block & (ptrs - 1);
573+ } else if (((file_block -= double_blocks) >> (ptrs_bits * 2)) < ptrs) {
574+ offsets[n++] = EXT2_TIND_BLOCK;
575+ offsets[n++] = file_block >> (ptrs_bits * 2);
576+ offsets[n++] = (file_block >> ptrs_bits) & (ptrs - 1);
577+ offsets[n++] = file_block & (ptrs - 1);
578+ } else {
579+ printf("EXT2: File block %ld is too big\n", file_block);
580+ }
581+
582+ return n;
583+}
584+
585+static unsigned long long resolve_path(struct silo_ext2_state *s,
586+ struct ext2_inode *ip,
587+ int *offsets, int depth)
588+{
589+ __u32 *p = ip->i_block + *offsets;
590+
591+ while (--depth) {
592+ __u32 block = ext2_to_cpu_32(*p);
593+
594+ read_scratch_block(s, block, depth);
595+ p = (__u32 *) s->scratch_block[depth] + *++offsets;
596+ }
597+
598+ return ext2_to_cpu_32(*p);
599+}
600+
601+static unsigned long long resolve_extent(struct silo_ext2_state *s,
602+ struct ext4_extent_header *ehp,
603+ unsigned long long file_block)
604+{
605+ unsigned long long hi, lo;
606+ struct ext4_extent *ep;
607+ int i;
608+
609+ ep = (struct ext4_extent *) (ehp + 1);
610+
611+ for (i = 0; i < ext2_to_cpu_16(ehp->eh_entries); i++, ep++)
612+ if (file_block < ext2_to_cpu_32(ep->ee_block))
613+ break;
614+
615+ if (i == 0)
616+ return BLOCK_MAP_ERROR;
617+
618+ ep -= 1;
619+ file_block -= ext2_to_cpu_32(ep->ee_block);
620+ if (file_block >= ext2_to_cpu_16(ep->ee_len))
621+ return BLOCK_MAP_ERROR;
622
623- return dump_finish ();
624+ hi = ((unsigned long long)ext2_to_cpu_16(ep->ee_start_hi)) << 32;
625+ lo = ext2_to_cpu_32(ep->ee_start_lo);
626+
627+ return (hi | lo) + file_block;
628 }
629
630-static int ls_ext2_proc(struct ext2_dir_entry *dirent, int offset,
631- int blocksize, char *buf, void *private)
632+static unsigned long long file_to_disk_block(struct silo_ext2_state *s,
633+ struct ext2_inode *ip,
634+ unsigned long long file_block)
635 {
636- struct ext2_inode ino;
637- int sl = 0, name_len = dirent->name_len & 0xFF;
638- char name[256], symlink[256];
639+ if (has_extents(ip)) {
640+ struct ext4_extent_header *ehp = search_leaf(s, ip, file_block);
641
642- strncpy(name, dirent->name, name_len);
643- name[name_len] = 0;
644+ if (ehp)
645+ return resolve_extent(s, ehp, file_block);
646
647- if (ext2fs_read_inode(fs, dirent->inode, &ino))
648- strcpy (name, "--- error ---");
649+ printf("EXT2: Extent leaf search for block %d failed\n",
650+ (int) file_block);
651
652- if (LINUX_S_ISLNK (ino.i_mode)) {
653- sl = 1;
654- if (ext2fs_inode_data_blocks(fs, &ino)) {
655- if (io_channel_read_blk(fs->io, ino.i_block[0], 1, symlink))
656- ino.i_size = 0;
657+ return BLOCK_MAP_ERROR;
658 } else {
659- strncpy (symlink, (char *)&(ino.i_block[0]),ino.i_size);
660+ int depth, offsets[4];
661+
662+ depth = block_to_path(s, ip, offsets, file_block);
663+ if (depth)
664+ return resolve_path(s, ip, offsets, depth);
665+
666+ printf("EXT2: block --> path on block %d failed\n",
667+ (int) file_block);
668+
669+ return BLOCK_MAP_ERROR;
670+ }
671+}
672+
673+static void read_file(struct silo_ext2_state *s, struct ext2_inode *ip,
674+ __u32 off, __u32 len, void *buf)
675+{
676+ unsigned long long disk_block;
677+
678+ disk_block = file_to_disk_block(s, ip, off / s->block_size);
679+
680+ read_scratch_block(s, disk_block, 0);
681+ memcpy(buf, s->scratch_block[0] + (off % s->block_size), len);
682+}
683+
684+static void read_group(struct silo_ext2_state *s, __u32 grp_no,
685+ struct ext2_group_desc *grp)
686+{
687+ __u32 first = ext2_to_cpu_32(s->super->s_first_data_block);
688+ __u32 blk, offset;
689+
690+ blk = first + 1 + (grp_no >> s->desc_per_block_bits);
691+ offset = (grp_no & (s->desc_per_block - 1)) * sizeof(*grp);
692+
693+ read_data(s, blk, offset, sizeof(*grp), grp);
694+}
695+
696+static void read_inode(struct silo_ext2_state *s, __u32 ino, struct ext2_inode *ip)
697+{
698+ __u32 grp_no, blk_no, inode_in_block, ipg, ipb;
699+ struct ext2_super_block *sb = s->super;
700+ struct ext2_group_desc gd;
701+
702+ ipg = ext2_to_cpu_32(sb->s_inodes_per_group);
703+
704+ grp_no = (ino - 1) / ipg;
705+ read_group(s, grp_no, &gd);
706+
707+ blk_no = (ino - 1) % ipg;
708+ inode_in_block = blk_no;
709+
710+ ipb = s->block_size / s->inode_size;
711+ blk_no /= ipb;
712+ inode_in_block %= ipb;
713+
714+ read_data(s,
715+ ext2_to_cpu_32(gd.bg_inode_table) + blk_no,
716+ inode_in_block * s->inode_size,
717+ sizeof(struct ext2_inode), ip);
718+}
719+
720+static int calc_ilog2(__u32 n)
721+{
722+ int i = 0;
723+
724+ while ((n >>= 1) != 0)
725+ i++;
726+
727+ return i;
728+}
729+
730+static int open_ext2(char *device)
731+{
732+ struct silo_ext2_state *s = malloc(sizeof(*s));
733+ struct ext2_super_block *sb;
734+ int err, i;
735+
736+ if (!s) {
737+ printf("Cannot allocate silo_ext2_state\n");
738+ return 0;
739+ }
740+ memset(s, 0, sizeof(*s));
741+
742+ fs = malloc(sizeof(*fs));
743+ if (!fs) {
744+ printf("Cannot allocate ext2_filsys\n");
745+ goto out_free_s;
746+ }
747+ memset(fs, 0, sizeof(*fs));
748+ err = silo_io_manager->open(device, 0, &fs->io);
749+ if (err) {
750+ printf("I/O manager open failed (err=%d)\n", err);
751+ goto out_free_fs;
752+ }
753+ fs->io->app_data = fs;
754+
755+ sb = s->super = malloc(1024);
756+ if (!sb) {
757+ printf("Cannot allocate ext2 super block\n");
758+ goto out_free_fs;
759+ }
760+
761+ io_channel_set_blksize(fs->io, 1024);
762+ err = io_channel_read_blk(fs->io, 1, -1024, sb);
763+
764+ if (ext2_to_cpu_16(sb->s_magic) != EXT2_SUPER_MAGIC) {
765+ printf("EXT2 superblock magic is wrong\n");
766+ goto out_free_super;
767+ }
768+
769+ s->inode_size = ext2_inode_size(s);
770+ s->block_size = ext2_block_size(s);
771+
772+ io_channel_set_blksize(fs->io, s->block_size);
773+
774+ s->addr_per_block = s->block_size / sizeof(__u32);
775+ s->addr_per_block_bits = calc_ilog2(s->addr_per_block);
776+ s->desc_per_block = s->block_size / sizeof(struct ext2_group_desc);
777+ s->desc_per_block_bits = calc_ilog2(s->desc_per_block);
778+
779+ s->scratch_block[0] = malloc(s->block_size * 4);
780+ if (!s->scratch_block[0]) {
781+ printf("Cannot allocate ext2 scratch blocks\n");
782+ goto out_free_super;
783+ }
784+ for (i = 1; i < 4; i++)
785+ s->scratch_block[i] =
786+ s->scratch_block[i - 1] + s->block_size;
787+ for (i = 0; i < 4; i++)
788+ s->scratch_block_blk[i] = ~(__u32)0;
789+
790+ root = EXT2_ROOT_INO;
791+
792+ sstate = s;
793+
794+ return 1;
795+
796+out_free_super:
797+ free(s->super);
798+
799+out_free_fs:
800+ free(fs);
801+ fs = NULL;
802+
803+out_free_s:
804+ free(s);
805+ return 0;
806+}
807+
808+void close_ext2 (void)
809+{
810+ struct silo_ext2_state *s = sstate;
811+
812+ if (s) {
813+ free(s->scratch_block[0]);
814+ free(s->super);
815+ free(s);
816+
817+ sstate = (struct silo_ext2_state *) 0;
818 }
819- symlink[ino.i_size] = 0;
820- }
821+}
822+
823+static int dump_ext2 (void)
824+{
825+ struct silo_ext2_state *s = sstate;
826+ struct ext2_inode ei;
827+ long file_offset;
828+ int sz, blk_sz;
829+ int blk_cnt;
830+
831+ read_inode(s, inode, &ei);
832+
833+ sz = ext2_to_cpu_32(ei.i_size);
834+ blk_sz = s->block_size;
835+
836+ blk_cnt = 0;
837+ for (file_offset = 0; file_offset < sz; file_offset += blk_sz) {
838+ blk_t disk_block;
839+
840+ disk_block = file_to_disk_block(s, &ei,
841+ file_offset / blk_sz);
842+ if (disk_block == BLOCK_MAP_ERROR)
843+ return 0;
844+
845+ if (disk_block)
846+ dump_block(&disk_block, blk_cnt);
847+
848+ blk_cnt++;
849+ }
850+
851+ return dump_finish ();
852+}
853+
854+static char *read_symlink(struct silo_ext2_state *s, struct ext2_inode *ip, char *namebuf)
855+{
856+ __u32 isize = ext2_to_cpu_32(ip->i_size);
857+
858+ if (isize <= 60)
859+ return (char *) &ip->i_block[0];
860+
861+ read_data(s, ext2_to_cpu_32(ip->i_block[0]), 0, isize, namebuf);
862+
863+ return namebuf;
864+}
865+
866+static int is_symlink(__u16 mode)
867+{
868+ if ((mode & 0xf000) == 0xa000)
869+ return 1;
870+ return 0;
871+}
872+
873+typedef int (*dir_callback_t)(struct silo_ext2_state *, struct ext2_dir_entry_2 *, void *);
874+
875+static int ls_callback(struct silo_ext2_state *s, struct ext2_dir_entry_2 *dirent, void *priv_data)
876+{
877+ struct ext2_inode e_ino;
878+ char *sym = (char *) 0;
879+ char symlink_buf[256];
880+
881+ read_inode(s, ext2_to_cpu_32(dirent->inode), &e_ino);
882+
883+ if (is_symlink(ext2_to_cpu_16(e_ino.i_mode)))
884+ sym = read_symlink(s, &e_ino, symlink_buf);
885+
886+ register_silo_inode(ext2_to_cpu_32(e_ino.i_mtime),
887+ ext2_to_cpu_32(e_ino.i_size),
888+ ext2_to_cpu_16(e_ino.i_mode),
889+ ext2_to_cpu_16(e_ino.i_uid),
890+ ext2_to_cpu_16(e_ino.i_gid),
891+ dirent->name, sym);
892+ return 0;
893+}
894+
895+static void iterate_dir(struct silo_ext2_state *s, __u32 ino, dir_callback_t cb, void *cb_arg)
896+{
897+ struct ext2_dir_entry_2 e;
898+ struct ext2_inode ei;
899+ __u32 off, size;
900
901- register_silo_inode(ino.i_mtime, ino.i_size, ino.i_mode, ino.i_uid,
902- ino.i_gid, name, sl ? symlink : NULL);
903+ read_inode(s, ino, &ei);
904+ size = ext2_to_cpu_32(ei.i_size);
905
906- return 0;
907+ for (off = 0; off < size; ) {
908+ read_file(s, &ei, off, 8, &e);
909+
910+ if (ext2_to_cpu_16(e.rec_len) == 0)
911+ break;
912+
913+ if (ext2_to_cpu_32(e.inode) == 0 ||
914+ e.name_len == 0) {
915+ off += ext2_to_cpu_16(e.rec_len);
916+ continue;
917+ }
918+
919+ read_file(s, &ei, off + 8, e.name_len, &e.name[0]);
920+ e.name[e.name_len] = 0;
921+
922+ if (cb(s, &e, cb_arg))
923+ break;
924+
925+ off += ext2_to_cpu_16(e.rec_len);
926+ }
927 }
928
929 static int ls_ext2 (void)
930 {
931- return ext2fs_dir_iterate (fs, inode, DIRENT_FLAG_INCLUDE_EMPTY,
932- 0, ls_ext2_proc, NULL);
933+ struct silo_ext2_state *s = sstate;
934+
935+ iterate_dir(s, inode, ls_callback, 0);
936+
937+ return 0;
938+}
939+
940+static int ino_size_ext2 (void)
941+{
942+ struct silo_ext2_state *s = sstate;
943+ struct ext2_inode ei = { };
944+
945+ read_inode(s, inode, &ei);
946+
947+ return ext2_to_cpu_32(ei.i_size);
948+}
949+
950+struct namei_cb_arg {
951+ const char *name;
952+ int len;
953+ ino_t *ino;
954+ int found;
955+};
956+
957+static int lookup_cb(struct silo_ext2_state *s, struct ext2_dir_entry_2 *dirent, void *priv_data)
958+{
959+ struct namei_cb_arg *p = priv_data;
960+
961+ if (p->len != dirent->name_len)
962+ return 0;
963+ if (strncmp(p->name, dirent->name, p->len))
964+ return 0;
965+ p->found = 1;
966+ *p->ino = ext2_to_cpu_32(dirent->inode);
967+ return 1;
968 }
969
970-static int ino_size_ext2 (void) {
971- struct ext2_inode ei;
972- int retval;
973+static int do_lookup(struct silo_ext2_state *s, __u32 dir_ino, const char *name,
974+ int namelen, ino_t *ret_ino)
975+{
976+ struct namei_cb_arg arg;
977+
978+ arg.name = name;
979+ arg.len = namelen;
980+ arg.ino = ret_ino;
981+ arg.found = 0;
982+
983+ iterate_dir(s, dir_ino, lookup_cb, &arg);
984
985- if ((retval = ext2fs_read_inode (fs, inode, &ei))) {
986- printf ("\n");
987- ext2fs_error (retval);
988- printf ("\n");
989+ return arg.found ? 0 : -1;
990+}
991+
992+static int open_namei(struct silo_ext2_state *s, const char *name,
993+ int namelen, ino_t root, ino_t base, ino_t *ret_ino);
994+
995+static int follow_link(struct silo_ext2_state *s, ino_t root, ino_t dir,
996+ ino_t inode, ino_t *res_inode)
997+{
998+ struct ext2_inode ei = { };
999+ char symlink_buf[256];
1000+ char *sym;
1001+
1002+ read_inode(s, inode, &ei);
1003+ if (!is_symlink(ext2_to_cpu_16(ei.i_mode))) {
1004+ *res_inode = inode;
1005+ return 0;
1006+ }
1007+ sym = read_symlink(s, &ei, symlink_buf);
1008+ return open_namei(s, sym, ext2_to_cpu_32(ei.i_size), root, dir, res_inode);
1009+}
1010+
1011+static int dir_namei(struct silo_ext2_state *s, ino_t root, ino_t dir,
1012+ const char *pathname, int pathlen,
1013+ const char **name, int *namelen,
1014+ ino_t *res_inode)
1015+{
1016+ const char *thisname;
1017+ int len, retval;
1018+ ino_t inode;
1019+ char c;
1020+
1021+ if ((c = *pathname) == '/') {
1022+ dir = root;
1023+ pathname++;
1024+ pathlen--;
1025+ }
1026+ while (1) {
1027+ thisname = pathname;
1028+ for (len = 0; --pathlen >= 0; len++) {
1029+ c = *pathname++;
1030+ if (c == '/')
1031+ break;
1032+ }
1033+ if (pathlen < 0)
1034+ break;
1035+ retval = do_lookup(s, dir, thisname, len, &inode);
1036+ if (retval)
1037+ return retval;
1038+ retval = follow_link(s, root, dir, inode, &dir);
1039+ if (retval)
1040+ return retval;
1041+ }
1042+ *name = thisname;
1043+ *namelen = len;
1044+ *res_inode = dir;
1045 return 0;
1046- }
1047- return ei.i_size;
1048 }
1049
1050-static int namei_follow_ext2 (const char *filename) {
1051- int ret = ext2fs_namei_follow (fs, root, root, filename, &inode);
1052+static int open_namei(struct silo_ext2_state *s, const char *name,
1053+ int namelen, ino_t root, ino_t base, ino_t *ret_ino)
1054+{
1055+ const char *base_name;
1056+ ino_t dir_ino, inode;
1057+ int ret;
1058+
1059+ ret = dir_namei(s, root, base, name, namelen,
1060+ &base_name, &namelen, &dir_ino);
1061+ if (ret)
1062+ return ret;
1063+
1064+ if (!namelen) {
1065+ *ret_ino = dir_ino;
1066+ return 0;
1067+ }
1068
1069- ext2_fs_ops.have_inode = (inode) ? 1 : 0;
1070+ ret = do_lookup(s, dir_ino, base_name, namelen, &inode);
1071+ if (ret)
1072+ return ret;
1073+
1074+ ret = follow_link(s, root, dir_ino, inode, &inode);
1075+ if (ret)
1076+ return ret;
1077
1078- return ret;
1079+ *ret_ino = inode;
1080+ return 0;
1081 }
1082
1083-static void print_error_ext2 (int error_val) {
1084- ext2fs_error (error_val);
1085+static int namei_follow_ext2 (const char *filename)
1086+{
1087+ int ret;
1088+
1089+ ret = open_namei(sstate, filename, strlen(filename),
1090+ root, root, &inode);
1091+
1092+ ext2_fs_ops.have_inode = inode ? 1 : 0;
1093+
1094+ return ret;
1095 }
1096
1097-void close_ext2 (void) {
1098- ext2fs_close(fs);
1099+static void print_error_ext2 (int error_val)
1100+{
1101+ printf("error: %d", error_val);
1102 }
1103
1104 struct fs_ops ext2_fs_ops = {
1105@@ -152,14 +689,3 @@
1106 .namei_follow = namei_follow_ext2,
1107 .have_inode = 0,
1108 };
1109-
1110-/* These are silly stubs to satisfy libext2fs symbols */
1111-unsigned long time(void)
1112-{
1113- return 0;
1114-}
1115-
1116-void *realloc(void *p, int size)
1117-{
1118- return NULL;
1119-}
1120diff -Naur silo-1.4.14.orig/second/ls.c silo-1.4.14/second/ls.c
1121--- silo-1.4.14.orig/second/ls.c 2008-06-12 16:39:12.000000000 +0000
1122+++ silo-1.4.14/second/ls.c 2012-09-01 19:05:11.000000000 +0000
1123@@ -18,6 +18,7 @@
1124 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1125 USA. */
1126
1127+#include <sys/types.h>
1128 #include <silo.h>
1129 #include <stringops.h>
1130
1131diff -Naur silo-1.4.14.orig/second/main.c silo-1.4.14/second/main.c
1132--- silo-1.4.14.orig/second/main.c 2008-06-12 16:39:12.000000000 +0000
1133+++ silo-1.4.14/second/main.c 2012-09-01 19:05:11.000000000 +0000
1134@@ -25,8 +25,7 @@
1135 /* TODO: This file is a good candidate for rewrite from scratch. */
1136
1137 #include <silo.h>
1138-#include <asm/page.h>
1139-#include <linux/elf.h>
1140+#include <elf.h>
1141 #include <stringops.h>
1142
1143 #ifndef NULL
1144@@ -65,6 +64,7 @@
1145 CMD_LS
1146 } load_cmd;
1147 enum arch architecture;
1148+int sun4v_cpu;
1149 static int timer_status = 0;
1150 static char *initrd_start;
1151 static int initrd_size;
1152diff -Naur silo-1.4.14.orig/second/misc.c silo-1.4.14/second/misc.c
1153--- silo-1.4.14.orig/second/misc.c 2008-06-12 16:39:12.000000000 +0000
1154+++ silo-1.4.14/second/misc.c 2012-09-01 19:05:11.000000000 +0000
1155@@ -501,7 +501,7 @@
1156 if ((i = prom_searchsiblings(i, "MicroSPARC-IIep")) != 0) {
1157 return sun4p;
1158 }
1159- return sun4u;
1160+ buffer[4] = 'u';
1161 }
1162 i = prom_getproperty (prom_root_node, "compatability", buffer, 8);
1163
1164@@ -517,8 +517,10 @@
1165 return sun4d;
1166 case 'e':
1167 return sun4e;
1168- case 'u':
1169 case 'v':
1170+ sun4v_cpu = 1;
1171+ /* FALLTHRU */
1172+ case 'u':
1173 return sun4u;
1174 default:
1175 for(i = 0; i < NUM_SUN_MACHINES; i++)
1176diff -Naur silo-1.4.14.orig/second/muldi3.S silo-1.4.14/second/muldi3.S
1177--- silo-1.4.14.orig/second/muldi3.S 2008-06-12 16:39:12.000000000 +0000
1178+++ silo-1.4.14/second/muldi3.S 2012-09-01 19:11:45.000000000 +0000
1179@@ -20,6 +20,8 @@
1180 .text
1181 .align 4
1182 .globl __muldi3
1183+ .register %g2,#scratch
1184+ .register %g3,#scratch
1185 __muldi3:
1186 save %sp, -104, %sp
1187 wr %g0, %i1, %y
1188diff -Naur silo-1.4.14.orig/second/timer.c silo-1.4.14/second/timer.c
1189--- silo-1.4.14.orig/second/timer.c 2008-06-12 16:39:12.000000000 +0000
1190+++ silo-1.4.14/second/timer.c 2012-09-01 19:05:11.000000000 +0000
1191@@ -156,7 +156,7 @@
1192 }
1193 if (!foundcpu || !clock_frequency)
1194 clock_frequency = prom_getint(prom_root_node, "clock-frequency") / 100;
1195- if (notimer) {
1196+ if (notimer && !sun4v_cpu) {
1197 sun4u_notimer = 1;
1198 __asm__ __volatile__ ("\t"
1199 "rd %%tick_cmpr, %%g1\n\t"
1200diff -Naur silo-1.4.14.orig/silo/.gitignore silo-1.4.14/silo/.gitignore
1201--- silo-1.4.14.orig/silo/.gitignore 1970-01-01 00:00:00.000000000 +0000
1202+++ silo-1.4.14/silo/.gitignore 2012-09-01 19:05:11.000000000 +0000
1203@@ -0,0 +1,6 @@
1204+#
1205+# Generated files
1206+#
1207+floppy.h
1208+silo
1209+silocheck
1210diff -Naur silo-1.4.14.orig/tilo/.gitignore silo-1.4.14/tilo/.gitignore
1211--- silo-1.4.14.orig/tilo/.gitignore 1970-01-01 00:00:00.000000000 +0000
1212+++ silo-1.4.14/tilo/.gitignore 2012-09-01 19:05:11.000000000 +0000
1213@@ -0,0 +1,10 @@
1214+#
1215+# Generated files
1216+#
1217+b.h
1218+b.out
1219+b2.h
1220+b2.out
1221+boot
1222+boot2
1223+maketilo
Note: See TracBrowser for help on using the repository browser.