From: Iruata Souza <iru.muzgo@gmail.com>
To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net>
Subject: Re: [9fans] bootiso.s fixed
Date: Wed, 7 Apr 2010 22:14:16 -0300 [thread overview]
Message-ID: <y2qd1c554291004071814kaa251c59i9c6006d1a75781e0@mail.gmail.com> (raw)
In-Reply-To: <9724ac79049bc26a724978dd60a219b2@gmx.de>
i guess this email was for me. ;]
On Wed, Apr 7, 2010 at 7:52 PM, <cinap_lenrek@gmx.de> wrote:
> found it!
>
> the problem was the LBPB() to load byte 0 from the pvd for comparsion.
> i loaded it into rBX instead of rBL. found this out after dumping the
> buffer and noticed that the contents where the same on t23 and amd
> machine.
>
> it all works now. tested on t23, bochs, and amd machine and its
> blazing fast :)
>
> updated the tarballs:
>
> /n/sources/contrib/cinap_lenrek/tuttleboot.tgz
> http://9hal.ath.cx/usr/cinap_lenrek/tuttleboot.tgz
>
> attached the file and the diff to this mail...
>
> --
> cinap
>
> #include "x16.h"
> #include "mem.h"
>
> /*
> * simple Plan 9 bootblock for ISO9660 that can load a uncompressed a.out kernel
> * image. looks for 386/9pcload. if heres no 386 it searches 9pcload in the root.
> * this is a non floppy emulation el torito bootblock!
> *
> * Diagnostics are:
> * ♥ alive!
> * ? i/o error, will retry
> * ! i/o error, giving up
> * F bad a.out magic
> * S could not find the file
> *
> */
>
> #define DATA32SEL SELECTOR(1, SELGDT, 0)
> #define EXEC32SEL SELECTOR(2, SELGDT, 0)
> #define EXEC16SEL SELECTOR(3, SELGDT, 0)
>
> #define FARRET \
> BYTE $0xCB
> #define SWAPB(r) \
> BYTE $0x0F; BYTE $(0xC8|r)
> #define XORAL(i) \
> BYTE $0x34; BYTE $i
>
> /* 2048 byte sectors */
> #define SECTSHIFT 0x0B
> #define BY2SECT (1<<SECTSHIFT)
>
> /*
> * Data is kept on the stack, indexed by rBP.
> */
> #define Xdap 0x00 /* disc address packet */
> #define Xdrive 0x12 /* boot drive, passed by BIOS or MBR */
> #define Xentry 0x14 /* a.out entry, text, data*/
> #define Xtextsz 0x18
> #define Xdatasz 0x1c
> #define Xload 0x20 /* load pointer */
> #define Xcount 0x24 /* # of sectors to load */
> #define Xbuf 0x28
> #define Xtotal (Xbuf+BY2SECT)
>
> /* a.out header offsets */
> #define Amagic 0x00
> #define Atextsz 0x04
> #define Adatasz 0x08
> #define Aentry 0x14
> #define Aouthdr 0x20
>
> TEXT magic(SB), $0
> /* jmp .+ 0x3E (_start0x40); nop; nop; nop; nop; nop; nop */
> BYTE $0xEB; BYTE $0x3E; BYTE $0x90; BYTE $0x90
> BYTE $0x90; BYTE $0x90; BYTE $0x90; BYTE $0x90
>
> TEXT bipvd(SB), $0
> LONG $0x00000000
> TEXT bibootfile(SB), $0
> LONG $0x00000000
> TEXT bibootfilelen(SB), $0
> LONG $0x00000000
> TEXT bichecksum(SB), $0
> LONG $0x00000000
> TEXT bireserved(SB), $0
> LONG $0x00000000
> LONG $0x00000000
> LONG $0x00000000
> LONG $0x00000000
> LONG $0x00000000
> LONG $0x00000000
> LONG $0x00000000
> LONG $0x00000000
> LONG $0x00000000
> LONG $0x00000000
>
> _start0x40:
> CLI
>
> /* be carefull! do not trash rDL until we reached start() */
> LWI(magic-Xtotal(SB), rSP)
> MW(rSP, rBP)
> LWI(start(SB), rAX)
>
> _farret16:
> CLR(rCX)
> MTSR(rCX, rDS)
> MTSR(rCX, rES)
> MTSR(rCX, rSS)
> PUSHR(rCX)
> PUSHR(rAX)
> FARRET
>
> TEXT return16(SB), $0
> MFCR(rCR0, rAX)
> XORAL(1)
> MTCR(rAX, rCR0)
> LWI(return16ret(SB), rAX)
> JMP _farret16
>
> TEXT return16ret(SB), $0
> STI
> RET
>
> TEXT start(SB), $0
> STI
>
> SBPB(rDL, Xdrive)
>
> /* alive! */
> LWI(0x0E03, rAX)
> BIOSCALL(0x10)
>
> /* A20! we has to enable itt! */
> LWI(0x2401, rAX)
> BIOSCALL(0x15)
>
> /* find the primary volume descriptor */
> CLR(rDX)
> LWI(0x0010, rAX)
>
> LWI(0xFF, rCX)
> CLR(rBX)
> _nextpvd:
> CALL16(BIOSread(SB))
> LBPB(Xbuf, rBL)
> CMPI(1, rBX)
> JEQ _pvdfound
> CLR(rBX)
> ADDI(1, rAX)
> ADC(rBX, rDX)
> LOOP _nextpvd
>
> CALL16(srcherror(SB))
>
> _pvdfound:
> /* load lba and length of root directory */
> LBPW((Xbuf+156+2), rAX)
> LBPW((Xbuf+156+4), rDX)
> LBPW((Xbuf+156+10), rCX)
> LBPW((Xbuf+156+12), rBX)
>
> CALL16(walk(SB))
> CALL16(srcherror(SB))
>
> TEXT load(SB), $0
> CLR(rCX)
> SBPWI(0xFFFF, Xcount+0)
> SBPWI(0xFFFF, Xcount+2)
> CALL16(BIOSread(SB))
>
> _loop:
> PUSHA
> CALL16(BIOSread(SB))
> CALL16(movehigh(SB))
> POPA
> ADDI(1, rAX)
> ADC(rCX, rDX)
> JMP _loop
>
> TEXT BIOSread(SB), $0
>
> LWI(5, rDI) /* retry count (ATAPI ZIPs suck) */
>
> _retry:
> PUSHA
> PUSHS(rDS)
> PUSHS(rES)
> PUSHS(rFS)
> PUSHS(rGS)
>
> SBPW(rAX, Xdap+8)
> SBPW(rDX, Xdap+10)
> SBPWI(0x0010, Xdap+0) /* reserved + packet size */
> SBPWI(0x0001, Xdap+2) /* # of blocks to transfer */
> MW(rBP, rSI)
> ADDI(Xbuf, rSI)
> SBPW(rSI, Xdap+4) /* transfer buffer :offset */
> MFSR(rSS, rSI) /* transfer buffer seg: */
> SBPW(rSI, Xdap+6)
>
> MW(rBP, rSI) /* Xdap == BP */
> LBPB(Xdrive, rDL)
> LWI(0x4200, rAX)
>
> BIOSCALL(0x13)
> JCC _readok
>
> _reset:
> LWI((0x0E00+'?'), rAX)
> BIOSCALL(0x10)
>
> /* reset the drive */
> LBPB(Xdrive, rDL)
> CLR(rAX)
> BIOSCALL(0x13)
>
> POPS(rGS)
> POPS(rFS)
> POPS(rES)
> POPS(rDS)
> POPA
>
> DEC(rDI)
> JNE _retry
>
> TEXT ioerror(SB), $0
> LBI('!', rAL)
> JMP _error
>
> TEXT fmterror(SB), $0
> LBI('F', rAL)
> JMP _error
>
> TEXT srcherror(SB), $0
> LBI('S', rAL)
> JMP _error
>
> _error:
> /* print error code */
> LBI(0x0E, rAH)
> BIOSCALL(0x10)
>
> /* wait for almost any key */
> CLR(rAX)
> BIOSCALL(0x16)
>
> /* reset */
> LWI(0x0472, rBX) /* warm-start code address */
> LWI(0x1234, rAX) /* warm-start code */
> POKEW /* MOVW AX, ES:[BX] */
> FARJUMP16(0xFFFF, 0x0000)
>
> _readok:
> POPS(rGS)
> POPS(rFS)
> POPS(rES)
> POPS(rDS)
> POPA
>
> RET
>
> TEXT walk(SB), $0
> PUSHR(rAX)
> PUSHR(rDX)
> PUSHR(rCX)
> PUSHR(rBX)
>
> CALL16(BIOSread(SB))
> MW(rBP, rBX)
> ADDI(Xbuf, rBX)
> MW(rBX, rDI)
>
> TEXT walknext(SB), $0
> MW(rDI, rSI)
>
> MW(rSI, rAX)
> SUB(rBX, rAX)
> CMPI(BY2SECT, rAX)
> JGE _nextsector
> CLR(rCX)
> LXB(0, xSI, rCL)
> ORB(rCL, rCL)
> JEQ _nextsector
> ADD(rCX, rDI)
>
> PUSHI(walktest(SB))
> RET
>
> _nextsector:
> POPR(rBX)
> POPR(rCX)
> POPR(rDX)
> POPR(rAX)
>
> OR(rCX, rCX)
> JNE _contwalk
> OR(rBX, rBX)
> JEQ _retwalk
> DEC(rBX)
> _contwalk:
> SUBI(BY2SECT, rCX)
>
> CLR(rDI)
> ADDI(1, rAX)
> ADC(rDI, rDX)
> PUSHI(walk(SB))
> _retwalk:
> RET
>
> TEXT walktest(SB), $0
> PUSHA
>
> LXW(2, xSI, rAX)
> LXW(4, xSI, rDX)
> LXW(10, xSI, rCX)
> LXW(12, xSI, rBX)
>
> PUSHA
> CLR(rCX)
> LXB(25, xSI, rCL)
> ANDI(2, rCX)
> POPA
> JEQ _notdir
>
> PUSHA
> LWI(dirname(SB), rDX)
> CALL16(cmpiname(SB))
> POPA
> JNE _skipdir
>
> ADDI((2*12), rSP)
> PUSHI(walk(SB))
> RET
>
> _notdir:
> PUSHA
> LWI(filename(SB), rDX)
> CALL16(cmpiname(SB))
> POPA
> JNE _skipdir
>
> CALL16(load(SB))
> /* no return */
>
> _skipdir:
> POPA
> PUSHI(walknext(SB))
> RET
>
> TEXT cmpiname(SB), $0
> CLR(rBX)
> CLR(rAX)
>
> CLR(rCX)
> LXB(32, xSI, rCL)
> ADDI(33, rSI)
> MW(rDX, rDI)
>
> PUSHR(rDI)
> PUSHR(rCX)
> _lenloop:
> LXB(0, xDI, rAL)
> OR(rAX, rAX)
> JEQ _endlen
> DEC(rCX)
> INC(rDI)
> JMP _lenloop
> _endlen:
> OR(rCX, rCX)
> POPR(rCX)
> POPR(rDI)
> JNE _ret
>
> _cmploop:
> LXB(0, xSI, rAL)
> LXB(0, xDI, rBL)
> CMPI('a', rAX)
> JLT _nocasea
> CMPI('z', rAX)
> JGT _nocasea
> ADDI(('A' - 'a'), rAX)
> _nocasea:
> CMPI('a', rBX)
> JLT _nocaseb
> CMPI('z', rBX)
> JGT _nocaseb
> ADDI(('A' - 'a'), rBX)
> _nocaseb:
> CMP(rAX, rBX)
> JNE _ret
> INC(rSI)
> INC(rDI)
> LOOP _cmploop
> OR(rCX, rCX)
> _ret:
> RET
>
> TEXT movehigh(SB), $0
> CLI
> LGDT(tgdtptr(SB))
>
> MFCR(rCR0, rAX)
> XORAL(1)
> MTCR(rAX, rCR0)
>
> FARJUMP32(EXEC32SEL, movehigh32(SB))
>
> TEXT movehigh32(SB), $0
> /* upper bits seem to be fucked */
> ANDL $0xFFFF, BP
> ANDL $0xFFFF, SP
>
> MOVL $DATA32SEL, AX
> MOVW AX, DS
> MOVW AX, ES
> MOVW AX, SS
>
> MOVL Xload(BP), DI
> MOVL Xcount(BP), BX
>
> MOVL BP, SI
> ADDL $Xbuf, SI
>
> CMPL BX, $0
> JEQ _boot
> JGT _movedata
>
> MOVL Amagic(SI), AX
> CMPL AX, $0xeb010000
> JNE _fmterror
>
> MOVL Aentry(SI), DI
> SWAPB(rDI)
> ANDL $~0xF0000000, DI
> MOVL DI, Xentry(BP)
> SUBL $Aouthdr, DI
>
> MOVL Atextsz(SI), BX
> SWAPB(rBX)
> MOVL BX, Xtextsz(BP)
>
> MOVL Adatasz(SI), CX
> SWAPB(rCX)
> MOVL CX, Xdatasz(BP)
>
> ADDL CX, BX
> ADDL $(BY2SECT-1), BX
> SHRL $SECTSHIFT, BX
>
> _movedata:
> MOVL $BY2SECT, CX
> REP; MOVSB
> DECL BX
>
> MOVL DI, Xload(BP)
> MOVL BX, Xcount(BP)
>
> _return:
> /* Move back to 16 bit code segment from protected mode */
> BYTE $0xEA; LONG $return16(SB); WORD $EXEC16SEL
>
> _fmterror:
> /* patch the 16 bit caller pc to point to the error function */
> MOVL $fmterror(SB), AX
> MOVW AX, 0(SP)
> JMP _return
>
> _boot:
> /*
> * we have to move the data segment to a page aligned
> * address.
> */
> MOVL Xentry(BP), SI
> MOVL SI, AX
> ADDL Xtextsz(BP), SI
> MOVL SI, DI
> ADDL $(BY2PG-1), DI
> ANDL $(~(BY2PG-1)), DI
> MOVL Xdatasz(BP), CX
> DECL CX
> ADDL CX, SI
> ADDL CX, DI
> INCL CX
> STD
> REP; MOVSB
> JMP *AX
>
> TEXT tgdt(SB),$0
> /* null descriptor */
> LONG $0
> LONG $0
>
> /* data segment descriptor for 4 gigabytes (PL 0) */
> LONG $(0xFFFF)
> LONG $(SEGG|SEGB|(0xF<<16)|SEGP|SEGPL(0)|SEGDATA|SEGW)
>
> /* exec segment descriptor for 4 gigabytes (PL 0) */
> LONG $(0xFFFF)
> LONG $(SEGG|SEGD|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
>
> /* exec segment descriptor for 4 gigabytes (PL 0) 16-bit */
> LONG $(0xFFFF)
> LONG $(SEGG|(0xF<<16)|SEGP|SEGPL(0)|SEGEXEC|SEGR)
>
> TEXT tgdtptr(SB),$0
> WORD $(4*8)
> LONG $tgdt(SB)
>
> TEXT dirname(SB), $0
> BYTE $'3'; BYTE $'8'; BYTE $'6'; BYTE $'\z'
>
> TEXT filename(SB), $0
> BYTE $'9'; BYTE $'p'; BYTE $'c'; BYTE $'l'
> BYTE $'o'; BYTE $'a'; BYTE $'d'; BYTE $'\z'
> /n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:120,133 - bootiso.s:120,135
> CLR(rDX)
> LWI(0x0010, rAX)
>
> - LWI(100, rCX)
> + LWI(0xFF, rCX)
> + CLR(rBX)
> _nextpvd:
> CALL16(BIOSread(SB))
> - LBPB(Xbuf, rBX)
> + LBPB(Xbuf, rBL)
> CMPI(1, rBX)
> JEQ _pvdfound
> + CLR(rBX)
> ADDI(1, rAX)
> - ADC(rCX, rDX)
> + ADC(rBX, rDX)
> LOOP _nextpvd
>
> CALL16(srcherror(SB))
> /n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:158,167 - bootiso.s:160,174
> JMP _loop
>
> TEXT BIOSread(SB), $0
> +
> LWI(5, rDI) /* retry count (ATAPI ZIPs suck) */
>
> _retry:
> PUSHA
> + PUSHS(rDS)
> + PUSHS(rES)
> + PUSHS(rFS)
> + PUSHS(rGS)
>
> SBPW(rAX, Xdap+8)
> SBPW(rDX, Xdap+10)
> /n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:170,187 - bootiso.s:177,195
> MW(rBP, rSI)
> ADDI(Xbuf, rSI)
> SBPW(rSI, Xdap+4) /* transfer buffer :offset */
> - MFSR(rES, rSI) /* transfer buffer seg: */
> + MFSR(rSS, rSI) /* transfer buffer seg: */
> SBPW(rSI, Xdap+6)
>
> MW(rBP, rSI) /* Xdap == BP */
> LBPB(Xdrive, rDL)
> - LBI(0x42, rAH)
> + LWI(0x4200, rAX)
> +
> BIOSCALL(0x13)
> - JCC _popret
> + JCC _readok
>
> _reset:
> LWI((0x0E00+'?'), rAX)
> - BIOSCALL(0x10)
> + BIOSCALL(0x10)
>
> /* reset the drive */
> LBPB(Xdrive, rDL)
> /n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:188,194 - bootiso.s:196,207
> CLR(rAX)
> BIOSCALL(0x13)
>
> + POPS(rGS)
> + POPS(rFS)
> + POPS(rES)
> + POPS(rDS)
> POPA
> +
> DEC(rDI)
> JNE _retry
>
> /n/dump/2010/0407/usr/cinap_lenrek/code/tuttleboot/sys/src/boot/pc/bootiso.s:219,226 - bootiso.s:232,244
> POKEW /* MOVW AX, ES:[BX] */
> FARJUMP16(0xFFFF, 0x0000)
>
> - _popret:
> + _readok:
> + POPS(rGS)
> + POPS(rFS)
> + POPS(rES)
> + POPS(rDS)
> POPA
> +
> RET
>
> TEXT walk(SB), $0
>
next prev parent reply other threads:[~2010-04-08 1:14 UTC|newest]
Thread overview: 109+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-11-21 21:33 [9fans] using acme/Mail from plan9port in Linux Lorenzo Bolla
2009-11-21 22:27 ` Mathieu Lonjaret
2009-12-17 7:48 ` Jason Catena
2010-03-23 11:18 ` hugo rivera
2010-03-23 13:02 ` Mathieu Lonjaret
2010-03-23 13:27 ` hugo rivera
2010-03-23 13:37 ` Mathieu Lonjaret
2010-03-23 14:29 ` erik quanstrom
2010-03-23 15:13 ` Steve Simon
2010-03-23 15:41 ` David Leimbach
2010-03-23 16:10 ` Steve Simon
2010-03-23 16:41 ` Russ Cox
2010-03-23 17:02 ` hugo rivera
2010-03-23 19:47 ` Russ Cox
2010-03-24 9:50 ` [9fans] VIA Rhine II support? EBo
2010-03-24 10:24 ` Federico G. Benavento
2010-03-25 18:56 ` Harri Haataja
2010-03-25 19:08 ` EBo
2010-03-24 9:59 ` [9fans] native install EBo
2010-03-24 14:56 ` David Leimbach
2010-03-24 15:17 ` Richard Miller
2010-03-24 15:22 ` Francisco J Ballesteros
2010-03-24 16:00 ` erik quanstrom
2010-03-24 16:05 ` Steve Simon
2010-03-24 19:18 ` Gabriel Diaz Lopez de la Llave
2010-03-24 19:48 ` Steve Simon
2010-03-24 20:17 ` Lyndon Nerenberg (VE6BBM/VE7TFX)
2010-03-24 21:49 ` David du Colombier
2010-04-09 19:36 ` Tom West
2010-04-09 20:20 ` EBo
2010-04-10 2:26 ` erik quanstrom
2010-04-10 9:21 ` Gabriel Diaz
2010-04-10 12:54 ` erik quanstrom
2010-04-10 16:28 ` Gabriel Diaz
2010-04-10 19:38 ` erik quanstrom
2010-04-11 12:37 ` Gabriel Diaz Lopez de la Llave
2010-04-11 15:36 ` erik quanstrom
2010-04-11 15:37 ` Gabriel Diaz Lopez de la Llave
2010-04-11 15:40 ` erik quanstrom
2010-03-24 20:11 ` EBo
2010-03-24 20:19 ` John Floren
2010-03-24 20:41 ` erik quanstrom
2010-03-25 1:21 ` Jacob Todd
2010-03-25 1:35 ` erik quanstrom
2010-03-25 11:15 ` Jacob Todd
2010-03-25 13:25 ` erik quanstrom
2010-03-25 10:28 ` Jacob Todd
2010-03-25 15:43 ` erik quanstrom
2010-03-25 13:37 ` Jacob Todd
2010-03-25 18:58 ` erik quanstrom
2010-03-25 20:04 ` Steve Simon
2010-03-25 22:34 ` Jorden Mauro
2010-03-26 6:00 ` Federico G. Benavento
2010-03-25 14:10 ` Steve Simon
2010-03-25 1:52 ` Maht
2010-03-25 2:05 ` Federico G. Benavento
2010-03-24 22:34 ` Skip Tavakkolian
2010-03-24 15:23 ` andrey mirtchovski
2010-03-28 14:32 ` Georg Lehner
2010-03-28 14:39 ` erik quanstrom
2010-03-29 19:57 ` Georg Lehner
2010-03-29 20:21 ` michael block
2010-03-28 14:44 ` maht
2010-03-29 20:07 ` Georg Lehner
2010-03-29 20:16 ` erik quanstrom
2010-03-29 22:38 ` Patrick Kelly
2010-03-29 20:52 ` maht
2010-03-29 20:58 ` Corey
2010-03-29 20:57 ` ron minnich
2010-03-29 21:09 ` erik quanstrom
2010-03-30 0:20 ` [9fans] Plan ? (was: native install) Corey
2010-03-30 0:24 ` erik quanstrom
2010-03-30 1:21 ` Corey
2010-03-30 2:02 ` Iruata Souza
2010-03-30 2:07 ` Jacob Todd
2010-03-30 6:41 ` Corey
2010-03-30 2:17 ` Patrick Kelly
2010-03-30 3:10 ` Rahul Murmuria
2010-03-30 18:23 ` Jack Johnson
2010-03-30 18:25 ` Jack Johnson
2010-03-30 18:44 ` Patrick Kelly
2010-04-01 10:13 ` [9fans] Plan ? William Cowan
2010-03-30 9:28 ` [9fans] Plan ? (was: native install) Steve Simon
2010-03-30 10:19 ` hugo rivera
2010-03-30 10:33 ` Gabriel Diaz Lopez de la Llave
2010-03-30 10:40 ` hugo rivera
2010-03-30 11:40 ` Francisco J Ballesteros
2010-03-30 12:20 ` Patrick Kelly
2010-03-30 12:34 ` Steve Simon
2010-03-30 13:28 ` tlaronde
2010-03-30 13:45 ` Patrick Kelly
2010-03-30 17:07 ` Albert Skye
2010-03-30 17:13 ` David Leimbach
2010-03-30 18:09 ` Nick LaForge
2010-03-30 18:03 ` tlaronde
2010-03-30 2:11 ` Iruata Souza
2010-04-07 22:52 ` [9fans] bootiso.s fixed cinap_lenrek
2010-04-08 0:08 ` ron minnich
2010-04-08 15:04 ` David Leimbach
2010-04-08 1:14 ` Iruata Souza [this message]
2010-04-08 14:29 ` erik quanstrom
2010-04-08 15:05 ` David Leimbach
2010-04-08 19:18 ` Jorden M
2010-04-08 18:11 ` ron minnich
2010-04-08 18:17 ` erik quanstrom
2010-04-08 18:28 ` Federico G. Benavento
2010-04-08 19:05 ` ron minnich
2010-04-08 19:07 ` erik quanstrom
2010-04-08 19:36 ` cinap_lenrek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=y2qd1c554291004071814kaa251c59i9c6006d1a75781e0@mail.gmail.com \
--to=iru.muzgo@gmail.com \
--cc=9fans@9fans.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).