Date:2010-08-05 22:19:58 (2 years 9 months ago)
Author:Bas Wijnen
Commit:7659673f33303ffcadaa282e8cb8ba292de302d3
Message:start wrapper; proper serial port baudrate

Files: .gitignore (1 diff)
Makefile (1 diff)
iris.hhp (3 diffs)
mips/boot.S (1 diff)
mips/nanonote/Makefile.arch (5 diffs)
mips/nanonote/board.ccp (1 diff)
mips/nanonote/jz4740.hhp (1 diff)
mips/nanonote/server/Makefile.am (1 diff)
mips/nanonote/server/usb-server.ccp (5 diffs)
mips/start.S (1 diff)
source/nand.ccp (2 diffs)

Change Details

.gitignore
11iris
2iris.raw
3iris.raw.gz
42uimage
53*.o
64*.elf
75*.cc
86*.hh
7*.gz
8*.raw
99source/charset.data
1010mips/nanonote/sdram-setup.raw
1111nanonote-boot
Makefile
6060    rm -rf fs/
6161
6262debug:
63    stty -F $(SERIAL) raw 9600
63    stty -F $(SERIAL) raw 57600
6464    while : ; do cat $(SERIAL) ; done
6565
6666.PHONY: clean
iris.hhp
591591#ifndef __KERNEL__
592592#if 1
593593// Use a define instead of an inline function, because this is better visible in disassembly, even when not optimizing.
594#define kdebug_char(c) do { unsigned d = (c); __asm__ volatile ("move $a0, $zero\nlw $a1, %0\nbreak" :: "m"(d) : "a0", "a1", "memory"); } while (0)
594#define kdebug_char(_c) do { unsigned _d = (_c); __asm__ volatile ("move $a0, $zero\nlw $a1, %0\nbreak" :: "m"(_d) : "a0", "a1", "memory"); } while (0)
595595#else
596#define kdebug_char(c) do {} while (0)
596#define kdebug_char(_c) do {} while (0)
597597#endif
598598#define kdebug(str) do { const char *s = (str); while (*s) { kdebug_char (*s); ++s; } } while (0)
599599#define __stringify2(x) #x
...... 
602602
603603static void kdebug_num (unsigned n, unsigned digits = 8):
604604    unsigned i
605    const char *encode = "0123456789abcdef"
605    char const *encode = "0123456789abcdef"
606606    for i = 0; i < digits; ++i:
607607        kdebug_char (encode[(n >> (4 * ((digits - 1) - i))) & 0xf])
608608
...... 
620620        while true:
621621            wait ()
622622
623    inline void debug_num (unsigned num, unsigned base):
624        char const *encode = "0123456789abcdef"
625        unsigned digits = 1
626        unsigned power = base
627        while power <= num:
628            power *= base
629            ++digits
630        for unsigned i = 0; i < digits; ++i:
631            power /= base
632            unsigned d = num / power
633            kdebug_char (encode[d])
634            num -= d * power
635
636    inline void debug (const char *f, ...):
637        unsigned *last = (unsigned *)&f
638        while *f:
639            if *f == '%':
640                ++f
641                switch *f:
642                    case '%':
643                        kdebug_char ('%')
644                        break
645                    case 'd':
646                        ++last
647                        debug_num (*last, 10)
648                        break
649                    case 'x':
650                        ++last
651                        debug_num (*last, 0x10)
652                        break
653                    case 's':
654                        ++last
655                        kdebug ((char *)*last)
656                        break
657                    default:
658                        panic (*f, "invalid character in dbg format string")
659            else:
660                kdebug_char (*f)
661            ++f
662
623663#endif
624664#endif
mips/boot.S
11// Iris: micro-kernel for a capability-based operating system.
2// mips/trendtac/boot.S: Kernel entry point, called by the boot loader.
2// mips/boot.S: Kernel entry point, called by the boot loader.
33// Copyright 2009 Bas Wijnen <wijnen@debian.org>
44//
55// This program is free software: you can redistribute it and/or modify
mips/nanonote/Makefile.arch
1515# You should have received a copy of the GNU General Public License
1616# along with this program. If not, see <http://www.gnu.org/licenses/>.
1717
18start_load = 0xa0600000
1819load = 0x80000000
19#UDC_BOOT = set
20#UDC_BOOT = comment this out for nand boot
2021
2122ARCH_CPPFLAGS = -I. -Imips -Imips/nanonote -Wa,-mips32 -DNANONOTE -DUSE_SERIAL
2223CROSS = mipsel-linux-gnu-
2324OBJDUMP = $(CROSS)objdump
2425junk = mdebug.abi32 reginfo comment pdr
2526OBJCOPYFLAGS = $(addprefix --remove-section=.,$(junk))
26LDFLAGS = --omagic -Ttext $(load)
27iris.elf: LDFLAGS = --omagic -Ttext $(load)
28mips/start.elf: LDFLAGS = --omagic -Ttext $(start_load)
2729
2830arch_iris_sources = mips/interrupts.cc mips/arch.cc
2931boot_sources = mips/init.cc mips/nanonote/board.cc
...... 
4446threadlist = mips/nanonote/threadlist-sd
4547ARCH_CXXFLAGS = -DNUM_THREADS=4
4648all: iris-sd.tar
47iris-sd.tar: $(addprefix fs/,$(addsuffix .elf,$(programs))) iris.raw fs/init.config
48    mkimage -A mips -T kernel -a $(load) -e a$(shell /bin/sh -c '$(OBJDUMP) -t iris.elf | grep __start$$ | cut -b2-8') -n Iris -d iris.raw fs/uimage | sed -e 's/:/;/g'
49iris-sd.tar: $(addprefix fs/,$(addsuffix .elf,$(programs))) mips/start.raw.gz fs/init.config
50    mkimage -A mips -T kernel -a $(start_load) -e a$(shell /bin/sh -c '$(OBJDUMP) -t mips/start.elf | grep __start$$ | cut -b2-8') -n Iris -d mips/start.raw.gz fs/uimage | sed -e 's/:/;/g'
4951    cd fs && tar cvf ../$@ uimage init.config $(addsuffix .elf,$(programs)) --dereference
5052endif
5153
52test: iris.raw mips/nanonote/server/usb-server mips/nanonote/sdram-setup.raw $(addsuffix .elf,$(addprefix fs/,$(programs))) fs/init.config
53    echo "reboot 0xa$(shell /bin/sh -c '$(OBJDUMP) -t iris.elf | grep __start$$ | cut -b2-8')" | nc localhost 5050
54mips/start.o:mips/start.S Makefile Makefile.arch iris.raw
55    $(CC) $(CPPFLAGS) -DSTART=0xa$(shell /bin/sh -c '$(OBJDUMP) -t iris.elf | grep __start$$ | cut -b2-8') -c $< -o $@
56
57test: mips/start.raw mips/start.elf mips/nanonote/server/usb-server mips/nanonote/sdram-setup.raw $(addsuffix .elf,$(addprefix fs/,$(programs))) fs/init.config
58    echo "reboot $(start_load) 0xa$(shell /bin/sh -c '$(OBJDUMP) -t mips/start.elf | grep __start$$ | cut -b2-8') $<" | nc localhost 5050
5459
5560mips/nanonote/server/usb-server: mips/nanonote/server/usb-server.ccp mips/nanonote/server/Makefile.am mips/nanonote/server/configure.ac devices.hh
5661    $(MAKE) -C mips/nanonote/server
...... 
6368%.raw: %.elf
6469    $(OBJCOPY) -S $(OBJCOPYFLAGS) -Obinary $< $@
6570
71%.raw.gz: %.raw
72    gzip < $< > $@
73
6674nanonote-boot: mips/nanonote/nanonote-boot.cc mips/nanonote/sdram-setup.raw
6775    g++ `pkg-config --cflags --libs shevek` $< -o $@ -D'STAGE1="$<"' -lusb
6876
...... 
8492    $< > $@
8593
8694%.o:%.S Makefile Makefile.arch mips/arch.hh
87    $(CC) $(CPPFLAGS) $(TARGET_FLAGS) -DKERNEL_STACK_SIZE=0x2000 -c $< -o $@
95    $(CC) $(CPPFLAGS) $(TARGET_FLAGS) -DKERNEL_STACK_SIZE=0x1000 -c $< -o $@
8896
8997# entry.o must be the first file. threadlist.o must be the first of the init objects (which can be freed after loading).
9098iris.elf: mips/entry.o $(subst .cc,.o,$(iris_sources)) $(threadlist).o mips/boot.o $(subst .cc,.o,$(boot_sources))
9199    $(LD) $(LDFLAGS) $^ -o $@
92100
101mips/start.elf: mips/start.o
102    $(LD) $(LDFLAGS) $^ -o $@
103
93104server:
94105    while mips/nanonote/server/usb-server ; do : ; done
95106
...... 
100111    x-terminal-emulator -e make debug &
101112    x-terminal-emulator -e make servers &
102113
103ARCH_CLEAN_FILES = $(boot_sources) $(addsuffix .elf,$(boot_threads)) $(arch_headers) devices.hh keys.hh mips/*.o mips/nanonote/*.o source/charset.data iris.elf iris.raw mips/nanonote/sdram-setup.elf mips/nanonote/sdram-setup.raw
114ARCH_CLEAN_FILES = $(boot_sources) $(addsuffix .elf,$(boot_threads)) $(arch_headers) devices.hh keys.hh mips/*.o mips/nanonote/*.o source/charset.data iris.elf iris.raw mips/nanonote/sdram-setup.elf mips/nanonote/sdram-setup.raw mips/start.elf mips/start.raw
104115
105116.PRECIOUS: mips/arch.hh mips/nanonote/jz4740.hh mips/nanonote/board.hh
106117.PHONY: test all monitor server servers setup
mips/nanonote/board.ccp
7171    UART0_FCR = 0
7272    UART0_MCR = 0
7373    UART0_SIRCR = 0
74    UART0_UMR = 0
7574    UART0_UACR = 0
75    UART0_UMR = 1
7676    UART0_LCR = UARTLCR_WLEN_8 | UARTLCR_STOP1 | UARTLCR_DLAB
77    unsigned uart_div = 3000000 / 16 / 9600
78    UART0_DLHR = uart_div >> 8
79    UART0_DLLR = uart_div
77    unsigned const baud = 57600
78    unsigned uart_div = 12000000 / baud
79    UART0_DLHR = (uart_div >> 8) & 0xff
80    UART0_DLLR = uart_div & 0xff
8081    UART0_LCR = UARTLCR_WLEN_8 | UARTLCR_STOP1
8182    UART0_FCR = UARTFCR_UUE | UARTFCR_FE | UARTFCR_RFLS | UARTFCR_TFLS
8283    kdebug ("\n\nSerial port initialized\n")
mips/nanonote/jz4740.hhp
23462346//**************************************************************************
23472347static void pll_init ():
23482348    // The cpu clock frequency
2349    unsigned const cpu_clock = 336000000
2350    //unsigned const cpu_clock = 200000000
2351    //unsigned const pixclock = 13500000
2352    unsigned const pixclock = 25846153
2349    //unsigned const cpu_clock = 336000000
2350    //unsigned const pixclock = 25846153
2351    unsigned const cpu_clock = 200000000
2352    unsigned const pixclock = 13500000
23532353    // Configure the pll frequency to cpu_clock.
23542354    CPM_CPPCR = ((cpu_clock * 2 / JZ_EXTAL - 2) << CPM_CPPCR_PLLM_BIT) | (0 << CPM_CPPCR_PLLN_BIT) | (0 << CPM_CPPCR_PLLOD_BIT) | (0x20 << CPM_CPPCR_PLLST_BIT) | CPM_CPPCR_PLLEN
23552355    // Set up dividers; see documentation for the meaning of all the values.
mips/nanonote/server/Makefile.am
2020bin_PROGRAMS = usb-server
2121
2222usb_server_SOURCES = usb-server.cc
23usb_server_CPPFLAGS = $(SHEVEK_CFLAGS) -DSTAGE1_FILE=\"mips/nanonote/sdram-setup.raw\" -DSTAGE2_FILE=\"iris.raw\" -I../../..
23usb_server_CPPFLAGS = $(SHEVEK_CFLAGS) -DSTAGE1_FILE=\"mips/nanonote/sdram-setup.raw\" -DSTAGE2_FILE=\"mips/start.raw\" -I../../..
2424usb_server_LDFLAGS = $(SHEVEK_LIBS) -lusb
2525
2626PYPP = /usr/bin/pypp
mips/nanonote/server/usb-server.ccp
4040    static int const run_vendor = 0xfffe
4141    static int const run_product = 0x0002
4242    static unsigned const timeout = 10000
43    void boot (unsigned entry)
43    void boot (std::string const &filename, unsigned load, unsigned entry)
4444    data (std::string const &port):
4545        handle = NULL
4646        server = shevek::server <client, data *>::create ()
...... 
4949
5050    private:
5151    static unsigned const STAGE1_LOAD = 0x80002000
52    static unsigned const STAGE2_LOAD = 0x80000000
5352    static unsigned const STAGE1_ENTRY = STAGE1_LOAD
5453    enum requests:
5554        VR_GET_CPU_INFO = 0
...... 
212211        keep = is_stdio
213212    void read (std::string const &line):
214213        shevek::istring l (line)
215        unsigned entry
216        if l ("reboot %x%", entry):
217            get_server ()->data ()->boot (entry)
214        unsigned load, entry
215        std::string filename
216        if l ("reboot %x %x %r%", load, entry, filename):
217            get_server ()->data ()->boot (filename, load, entry)
218218        else if l ("shutdown%"):
219219            std::cerr << "shutting down\n"
220220            shevek::end_loop ()
...... 
266266            sleep (1)
267267    std::cerr << shevek::ostring ("giving up finding device %04x:%04x\n", vendor, product)
268268
269void data::boot (unsigned entry):
270    std::cerr << "booting " << shevek::ostring ("%x", entry) << "\n"
269void data::boot (std::string const &filename, unsigned load, unsigned entry):
270    std::cerr << "booting " << shevek::ostring ("%s from %x@%x", Glib::ustring (filename), load, entry) << "\n"
271271    if handle:
272272        usb_release_interface (handle, 0)
273273        usb_close (handle)
...... 
294294    std::ostringstream stage2
295295    usb_release_interface (handle, 0)
296296    file.close ()
297    file.open (STAGE2_FILE)
297    file.open (filename.c_str ())
298298    stage2 << file.rdbuf ()
299    std::cerr << "sending Iris\n"
300    send_file (STAGE2_LOAD, stage2.str ().size (), stage2.str ().data ())
299    std::cerr << shevek::ostring ("sending Iris (size 0x%x)\n", stage2.str ().size ())
300    send_file (load, stage2.str ().size (), stage2.str ().data ())
301301    std::cerr << "flushing caches\n"
302302    request (VR_FLUSH_CACHES)
303303    std::cerr << "running Iris\n"
mips/start.S
1// Iris: micro-kernel for a capability-based operating system.
2// mips/start.S: kernel starter at high address.
3// Copyright 2009 Bas Wijnen <wijnen@debian.org>
4//
5// This program is free software: you can redistribute it and/or modify
6// it under the terms of the GNU General Public License as published by
7// the Free Software Foundation, either version 3 of the License, or
8// (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU General Public License
16// along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18    .globl __start
19    .set noreorder
20
21__start:
22    bal 1f
23// For some reason the disassembler considers everything
24// after __start non-code until the next label. So I add a label.
25start_hack_for_disassembler:
26    nop
27    .word _gp
281: lw $gp, 0($ra)
29
30    li $a0, 0xa0000000
31    la $a1, image
32    la $a2, image_end
33
341: lw $a3, 0($a1)
35    sw $a3, 0($a0)
36    addiu $a1, 4
37    bne $a1, $a2, 1b
38    addiu $a0, 4
39
40    li $t9, START
41    jr $t9
42    nop
43
44image:
45    .incbin "iris.raw"
46image_end:
source/nand.ccp
8080static void unbusy ():
8181    while !(gpio_get_port (2) & (1 << 30)):
8282        Iris::schedule ()
83    Iris::schedule ()
84
85static void addr (unsigned d):
86    unbusy ()
87    *address = d
88    unbusy ()
89
90static void cmd (unsigned d):
91    unbusy ()
92    *command = d
93    unbusy ()
94
95static void wdata (unsigned d):
96    unbusy ()
97    *data = d
98    unbusy ()
99
100static unsigned rdata ():
101    unbusy ()
102    unsigned ret = *data
103    unbusy ()
104    return ret
83105
84106static void reset ():
85107    Iris::Page data_page = Iris::my_memory.create_page ()
...... 
104126    EMC_NFCSR = EMC_NFCSR_NFE1 | EMC_NFCSR_NFCE1
105127
106128    // Reset nand.
107    *command = CMD_RESET
108    unbusy ()
129    cmd (CMD_RESET)
109130
110    *command = CMD_READID
111    *address = 0
112    unsigned d = *data
131    cmd (CMD_READID)
132    addr (0)
133    unsigned d = rdata ()
113134    //unsigned maker = d
114    d = *data
135    d = rdata ()
115136    //unsigned device = d
116    d = *data
137    d = rdata ()
117138    //unsigned internal_chip_number = 1 << (d & 0x3)
118139    //unsigned cell_type = 2 << ((d >> 2) & 0x3)
119140    //unsigned simultaneously_programmed_pages = 1 << ((d >> 4) & 0x3)
120141    //bool can_interleave_program_between_chips = d & 0x40
121142    //bool can_cache_program = d & 0x80
122    d = *data
143    d = rdata ()
123144    page_bits = 10 + (d & 3)
124    kdebug ("page bits: ")
125    kdebug_num (page_bits)
126    kdebug ("\n")
145    Iris::debug ("page bits: %d\n", page_bits)
127146    redundant_bits = (d & 4 ? 4 : 3)
128    block_bits = 64 + ((d >> 4) & 3)
147    Iris::debug ("redundant bits: %d\n", redundant_bits)
148    block_bits = 16 + ((d >> 4) & 3)
149    Iris::debug ("block bits: %d\n", block_bits)
129150    word_size = (d & 0x40 ? 16 : 8)
151    Iris::debug ("word size: %d\n", word_size)
130152    //unsigned serial_access_minimum = (d & 0x80 ? 25 : 50)
131    d = *data
153    d = rdata ()
132154    //unsigned num_planes = 1 << ((d >> 2) & 3)
133155    //unsigned plane_bits = 26 + ((d >> 4) & 7)
134156
135157static void read (unsigned a, char *buffer):
136158    unsigned column = a & ((1 << page_bits) - 1)
137159    unsigned row = a >> page_bits
138    kdebug ("reading: ")
139    kdebug_num (a)
140    kdebug ("/")
141    kdebug_num (row)
142    kdebug ("/")
143    kdebug_num (column)
144    kdebug (": ")
145    *command = CMD_READ0
146    *address = column
147    *address = column >> 8
148    *address = row
149    *address = row >> 8
150    *address = row >> 16
151    *command = CMD_READSTART
160    //Iris::debug ("reading: %x/%x/%x: ", a, row, column)
161    cmd (CMD_READ0)
162    addr (column)
163    addr (column >> 8)
164    addr (row)
165    addr (row >> 8)
166    addr (row >> 16)
167    cmd (CMD_READSTART)
152168    EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_DECODING | EMC_NFECR_ERST
153    // Wait for nand to be ready.
154    unbusy ()
155169    for unsigned t = 0; t < 0x200; ++t:
156        buffer[t] = *data
170        buffer[t] = rdata ()
157171    char error[9]
158    unsigned errcol = (1 << page_bits) + (column >> 5)
159    *command = CMD_RNDOUT
160    *address = errcol
161    *address = errcol >> 8
162    *command = CMD_RNDOUTSTART
172    // Spare space (starts at 1 << page_bits)
173    // 0: unused
174    // 2: detect valid data (at least 1 byte == 0 means valid)
175    // 5: unused
176    // 6: 9-byte ecc of 1st 512 bytes
177    // 15: 9-byte ecc of 2nd 512 bytes
178    // 24: 9-byte ecc of 3rd 512 bytes
179    // 33: 9-byte ecc of 4th 512 bytes
180    // 42: unused
181    // 64: end of space
182    unsigned errcol = (1 << page_bits) + (column >> 9) * 9 + 6
183    cmd (CMD_RNDOUT)
184    addr (errcol)
185    addr (errcol >> 8)
186    cmd (CMD_RNDOUTSTART)
163187    for unsigned t = 0; t < 9; ++t:
164        error[t] = *data
188        error[t] = rdata ()
165189    EMC_NFPAR (0) = ((unsigned *)error)[0]
166190    EMC_NFPAR (1) = ((unsigned *)error)[1]
167191    EMC_NFPAR (2) = error[9]
168192    EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_DECODING | EMC_NFECR_PRDY
169193    while !(EMC_NFINTS & EMC_NFINTS_DECF):
170194        Iris::schedule ()
171    // delay...
172    //Iris::schedule ()
173195    unsigned errs = (EMC_NFINTS & EMC_NFINTS_ERRCNT_MASK) >> EMC_NFINTS_ERRCNT_BIT
196    for unsigned i = 0; i < errs; ++i:
197        Iris::debug ("correcting %x on %x\n", EMC_NFERR (i) & 0xff, EMC_NFERR (i) >> 16)
198        buffer[EMC_NFERR (i) >> 16] ^= EMC_NFERR (i) & 0xff
199
200static void write (unsigned a, char *buffer):
201    unsigned row = a >> page_bits
202    //Iris::debug ("writing: %x/%x: ", a, row)
203    cmd (CMD_SEQIN)
204    addr (0)
205    addr (0)
206    addr (row)
207    addr (row >> 8)
208    addr (row >> 16)
209    char ecc[4][9]
210    for unsigned i = 0; i < 0x4; ++i:
211        EMC_NFECR = EMC_NFECR_ECCE | EMC_NFECR_RS | EMC_NFECR_RS_ENCODING | EMC_NFECR_ERST
212        for unsigned j = 0; j < 0x200; ++j:
213            wdata (buffer[i * 0x200 + j])
214        while !(EMC_NFINTS & EMC_NFINTS_ENCF):
215            Iris::schedule ()
216        ((unsigned *)ecc[i])[0] = EMC_NFPAR (0)
217        ((unsigned *)ecc[i])[1] = EMC_NFPAR (1)
218        ecc[i][9] = EMC_NFPAR (2)
219    // Spare space (starts at 1 << page_bits)
220    // 0: unused
221    // 2: detect valid data (at least 1 byte == 0 means valid)
222    // 5: unused
223    // 6: 9-byte ecc of 1st 512 bytes
224    // 15: 9-byte ecc of 2nd 512 bytes
225    // 24: 9-byte ecc of 3rd 512 bytes
226    // 33: 9-byte ecc of 4th 512 bytes
227    // 42: unused
228    // 64: end of space
229    for unsigned i = 0; i < 6; ++i:
230        wdata (0)
231    for unsigned i = 0; i < 4; ++i:
232        for unsigned j = 0; j < 9; ++j:
233            wdata (ecc[i][j])
234    cmd (CMD_PAGEPROG)
235    Iris::debug ("nand program %d done\n", a)
236
237static void erase (unsigned a):
238    unsigned row = a >> page_bits
239    cmd (CMD_ERASE1)
240    addr (row)
241    addr (row >> 8)
242    addr (row >> 16)
243    cmd (CMD_ERASE2)
244    Iris::debug ("nand erase %d done\n", a)
174245
175246Iris::Num start ():
176    kdebug ("reading nand in 10 seconds\n")
247    kdebug ("starting nand operation in 10 seconds\n")
177248    Iris::sleep (10 * HZ)
178249    map_emc ()
179250    map_gpio ()
180251
252    // Arbitrary addresses where the pages are mapped.
181253    command = (volatile char *)0x15000
182254    address = (volatile char *)0x16000
183255    data = (volatile char *)0x17000
184256
185257    reset ()
186258
187    char buffer[0x200]
259    char buffer[0x800]
260
261    //erase (0)
188262
189263    // Send nand contents to serial port.
190264    for unsigned a = 0; a < 0x4000; a += 0x200:
191265        read (a, buffer)
192        //for unsigned s = 0; s < 0x10; ++s:
193            for unsigned t = 0; t < 0x10; ++t:
266        for unsigned s = 0; s < 0x10; ++s:
267            for unsigned t = 0; t < 0x20; ++t:
194268                kdebug (" ")
195                kdebug_num (buffer[0 * 0x20 + t], 2)
269                kdebug_num (buffer[s * 0x20 + t], 2)
196270            kdebug ("\n")
197        //kdebug ("\n")
271        kdebug ("\n")
198272    // Exit.
199273    return 0

Archive Download the corresponding diff file

Branches:
master



interactive