mirror of
https://github.com/linuxboot/linuxboot
synced 2024-11-21 23:59:59 +00:00
working flashkernel, working cpukernel
Signed-off-by: Ronald G Minnich <rminnich@gmail.com>
This commit is contained in:
parent
ef3a5e6d5e
commit
924ca68d70
1937
mainboards/amd/rome/5.5-rc3.config
Normal file
1937
mainboards/amd/rome/5.5-rc3.config
Normal file
File diff suppressed because it is too large
Load Diff
273
mainboards/amd/rome/Makefile
Normal file
273
mainboards/amd/rome/Makefile
Normal file
@ -0,0 +1,273 @@
|
||||
# This is the makefile for a flash image, a netbootable sshd image,
|
||||
# and a netbootable cpu image.
|
||||
#
|
||||
# sshdkernel produces a kernel with a built-in initramfs for netboot
|
||||
# It provides (and starts) an sshd, and also has flashrom.
|
||||
# Hence you can ssh to a node, flashrom -r on it, scp the
|
||||
# image back, process it, scp the new image to the node, and
|
||||
# write with flashrom.
|
||||
# e.g.
|
||||
# ssh -i class_key -p 2022 board flashrom -r image.bin -p internal
|
||||
# scp -i class_key -P 2022 board:/image.bin image.bin
|
||||
# make tiny.bin
|
||||
# scp -i class_key -P 2022 tiny.bin board:/tiny.bin
|
||||
# ssh -i class_key -p 2022 board flashrom -w tiny.bin -p internal
|
||||
#
|
||||
# The cpu image uses a cpud as its init, and you
|
||||
# can cpu to it to run commands, including flashrom -p internal
|
||||
# to flash the flash image.
|
||||
# e.g.
|
||||
# cpu board flashrom -r image.bin -p internal
|
||||
# Note this writes image image.bin to the host directoy; no scp needed
|
||||
# make tiny.bin
|
||||
# cpu board flashrom -w tiny.bin -p internal
|
||||
# cpu is way more convenient than ssh/scp if you can learn it.
|
||||
# you can also just
|
||||
# cpu board
|
||||
# and once you are in:
|
||||
# flashrom -r image.bin -p internal
|
||||
# make tiny.bin
|
||||
# flashrom -w tiny.bin -p internal
|
||||
# NOTE: those commands are running on the board, and they all work
|
||||
#
|
||||
# You can test the flash image kernel with qemu
|
||||
# make flashtest
|
||||
|
||||
default: sshdkernel flash cpukernel
|
||||
|
||||
flash: tiny.bin
|
||||
|
||||
flashtest: testflashkernel
|
||||
|
||||
usefultargets:
|
||||
echo fetch, uroot, kernel, or image.bin
|
||||
|
||||
tiny.bin: edk2.bin flashkernel flashinitramfs.cpio.lzma
|
||||
utk \
|
||||
-xzPath /usr/bin/xz \
|
||||
$< \
|
||||
replace_pe32 Shell flashkernel \
|
||||
save $@
|
||||
dd if=flashinitramfs.cpio.lzma of=$@ bs=4096 seek=360 conv=notrunc
|
||||
|
||||
edk2.bin: dxeremove.bin
|
||||
echo Note, this inserts the edk2 bds and shell
|
||||
echo Only flash this image if you have an sf100.
|
||||
echo It will not be able to boot anything.
|
||||
utk \
|
||||
-xzPath /usr/bin/xz \
|
||||
$< \
|
||||
insert_dxe edk2bdsdxe.ffs insert_dxe edk2shell.ffs \
|
||||
save $@
|
||||
|
||||
dxeremove.bin: hap.bin
|
||||
echo note, we remove DXE to the point the image is not viable
|
||||
echo until you put a kernel in it in place of the shell.
|
||||
utk $< \
|
||||
comment FlashDriver_do_not_remove_efi_panics \
|
||||
comment S3Save_do_not_remove_gets_error \
|
||||
comment testremove \
|
||||
comment FlashDriver_do_not_remove_efi_panics \
|
||||
comment S3Save_do_not_remove_gets_error \
|
||||
comment testremove \
|
||||
remove Ahci.* \
|
||||
remove AMITSE \
|
||||
remove AMITSE.* \
|
||||
remove Arp.* \
|
||||
remove Ata.* \
|
||||
remove Bds \
|
||||
remove Button.* \
|
||||
remove CryptoD.* \
|
||||
remove .*Dhcp.* \
|
||||
remove Dhcp6Dxe \
|
||||
remove Disk.* \
|
||||
remove EbcDxe \
|
||||
remove Fat.* \
|
||||
remove .*ftp.* \
|
||||
remove .*harging.* \
|
||||
remove I2c.* \
|
||||
remove IntelGopV.* \
|
||||
remove IntelIsh.* \
|
||||
remove Ip4.* \
|
||||
remove Ip6Dxe \
|
||||
remove Iscsi.* \
|
||||
remove Ish.* \
|
||||
remove .*Keyboard.* \
|
||||
remove Logo.* \
|
||||
remove Maxim.* \
|
||||
remove Mmc.* \
|
||||
remove MnpDxe \
|
||||
remove Mouse.* \
|
||||
remove Mtftp4Dxe \
|
||||
remove Mtftp6Dxe \
|
||||
remove NetworkStackSetupScreen \
|
||||
remove Partition.* \
|
||||
remove .*PxeDxe.* \
|
||||
remove RandomNumberGen \
|
||||
remove ReFlash \
|
||||
remove Sata.* \
|
||||
remove Scsi.* \
|
||||
remove SnpDxe \
|
||||
remove SoftKbd \
|
||||
remove Tcp.* \
|
||||
remove TcpDxe \
|
||||
remove TimestampDxe \
|
||||
remove Udp.* \
|
||||
remove Udp4.* \
|
||||
remove Udp6Dxe \
|
||||
remove UefiPxe.* \
|
||||
remove Uhcd \
|
||||
remove Usb.* \
|
||||
remove Whea.* \
|
||||
remove Xpower.* \
|
||||
comment S3Save_do_not_remove_gets_error \
|
||||
comment below_still_unknown \
|
||||
comment TcgMor \
|
||||
comment AmiTcgNvflagSample \
|
||||
comment AmiTcgPlatformDxe \
|
||||
comment TcgDxeplatform \
|
||||
comment Tpm20PlatformDxe \
|
||||
comment CrbTpm20Acpi \
|
||||
comment TcgSmm \
|
||||
comment TcgDxe \
|
||||
comment Tcg2Dxe \
|
||||
comment TcgPlatformSetupPolicy \
|
||||
save $@
|
||||
chmod a-w $@
|
||||
|
||||
hap.bin: tighten.bin
|
||||
cp $< $@
|
||||
me_cleaner.py -s $@
|
||||
chmod a-w $@
|
||||
|
||||
tighten.bin: image.bin
|
||||
utk $< tighten_me save $@
|
||||
|
||||
sshdkernel: sshd.cpio.lzma sshd-linux.config
|
||||
cp sshd-linux.config linux/.config
|
||||
(cd linux && make oldconfig && make -j32)
|
||||
cp linux/arch/x86/boot/bzImage $@
|
||||
|
||||
cpukernel: cpu.cpio.lzma cpu-linux.config
|
||||
cp cpu-linux.config linux/.config
|
||||
(cd linux && make oldconfig && make -j32)
|
||||
cp linux/arch/x86/boot/bzImage $@
|
||||
|
||||
readrom:
|
||||
echo You need to get a ROM image from *somewhere*
|
||||
echo Once you do, put it in ROM.bin
|
||||
|
||||
writerom: image.bin
|
||||
echo Here is where you would do the flashrom, e.g.
|
||||
echo sudo flashrom -p dediprog -w image.bin
|
||||
|
||||
flashinitramfs.cpio.lzma: flashinitramfs.cpio
|
||||
lzma -f -k $<
|
||||
|
||||
flashinitramfs.cpio: Makefile
|
||||
u-root -o $@ \
|
||||
-files /usr/bin/lsusb \
|
||||
-files /usr/bin/lspci \
|
||||
-files /var/lib/usbutils/usb.ids \
|
||||
-uinitcmd=/bbin/console \
|
||||
all \
|
||||
github.com/u-root/u-root/cmds/exp/console \
|
||||
|
||||
echo not bringing by hand \
|
||||
github.com/u-root/u-root/cmds/boot/pxeboot \
|
||||
github.com/u-root/u-root/cmds/core/cat \
|
||||
github.com/u-root/u-root/cmds/core/elvish \
|
||||
github.com/u-root/u-root/cmds/core/init \
|
||||
github.com/u-root/u-root/cmds/core/ip \
|
||||
github.com/u-root/u-root/cmds/core/ls \
|
||||
github.com/u-root/u-root/cmds/core/kexec \
|
||||
github.com/u-root/u-root/cmds/core/pci \
|
||||
github.com/u-root/u-root/cmds/core/wget \
|
||||
|
||||
oflashinitramfs.cpio: Makefile
|
||||
u-root -o $@ -build=bb \
|
||||
-uinitcmd=/bbin/pxeboot \
|
||||
github.com/u-root/u-root/cmds/boot/pxeboot \
|
||||
github.com/u-root/u-root/cmds/core/cat \
|
||||
github.com/u-root/u-root/cmds/core/elvish \
|
||||
github.com/u-root/u-root/cmds/core/init \
|
||||
github.com/u-root/u-root/cmds/core/ip \
|
||||
github.com/u-root/u-root/cmds/core/ls \
|
||||
github.com/u-root/u-root/cmds/core/kexec \
|
||||
github.com/u-root/u-root/cmds/core/pci \
|
||||
github.com/u-root/u-root/cmds/core/wget \
|
||||
|
||||
# this target builds an initramfs with only one program, the cpu server.
|
||||
# It depends on the kernel setting the IP address.
|
||||
# You need ip=dhcp OR ip=fixed.ip.address.here in the command line
|
||||
cpu.cpio.lzma: Makefile
|
||||
u-root -o cpu.cpio -build=bb -initcmd=cpud -files ~/.ssh/cpu_rsa.pub:key.pub \
|
||||
-defaultsh="" \
|
||||
github.com/u-root/cpu/cmds/cpud
|
||||
lzma -f -k cpu.cpio
|
||||
|
||||
# this target builds an initramfs with all of u-root, AND all of /bin, /usr/bin, /sbin, /usr/sbin, /etc
|
||||
# the intent is to demonstrate the capability of http loading.
|
||||
# It depends on the kernel setting the IP address.
|
||||
# You need ip=dhcp OR ip=fixed.ip.address.here in the command line
|
||||
sshd.cpio.lzma: Makefile
|
||||
u-root -o sshd.cpio -build=bb \
|
||||
-uinitcmd=/bbin/sshd \
|
||||
-files class_key.pub:authorized_keys \
|
||||
-files classhostkey:id_rsa \
|
||||
-files /usr/bin/vi \
|
||||
-files /usr/share/vim \
|
||||
-files /usr/share/terminfo \
|
||||
-files /bin/bash \
|
||||
-files /usr/sbin/flashrom \
|
||||
-files /usr/bin/xz \
|
||||
all
|
||||
lzma -f -k sshd.cpio
|
||||
ls -l sshd.cpio.*
|
||||
|
||||
flashkernel: flashkernel.config flashinitramfs.cpio.lzma Makefile
|
||||
cp $< linux/.config
|
||||
(cd linux && make oldconfig && make -j32)
|
||||
cp linux/arch/x86/boot/bzImage $@
|
||||
|
||||
testflashkernel: flashkernel
|
||||
qemu-system-x86_64 -kernel flashkernel -nographic -serial /dev/tty -initrd flashinitramfs.cpio.lzma
|
||||
|
||||
testcpukernel: cpukernel
|
||||
qemu-system-x86_64 -kernel cpukernel -nographic -serial /dev/tty
|
||||
|
||||
# These stanzas fetch code.
|
||||
fetch: getkernel geturoot getfiano getrom
|
||||
|
||||
getkernel:
|
||||
rm -rf linux
|
||||
git clone --depth=1 -b working_hack --single-branch https://github.com/linuxboot/linux
|
||||
|
||||
getfiano:
|
||||
go get -u github.com/linuxboot/fiano/cmds/utk
|
||||
go install github.com/linuxboot/fiano/cmds/utk
|
||||
go install github.com/linuxboot/fiano/cmds/guid2english
|
||||
getrom:
|
||||
echo you can put a wget here
|
||||
echo and unxip it
|
||||
echo and cp it to image.bin
|
||||
geturoot:
|
||||
go get -u github.com/u-root/u-root
|
||||
go get -u github.com/u-root/cpu/...
|
||||
|
||||
# Serve the combined sshd-kernel and sshd-initramfs image. This includes flashrom
|
||||
sshd-pxeserver:
|
||||
echo Consider Disabling any system services ...
|
||||
echo e.g. sudo systemctl stop tftpd-hpa.service
|
||||
echo e.g. sudo systemctl stop isc-dhcp-server
|
||||
sudo `go env GOPATH`/bin/pxeserver -tftp-dir . -bootfilename sshdkernel -http-dir . -interface $(NETWORK)
|
||||
|
||||
# Serve the combined cpu-kernel and cpu-initramfs image.
|
||||
cpu-pxeserver:
|
||||
echo Consider Disabling any system services ...
|
||||
echo e.g. sudo systemctl stop tftpd-hpa.service
|
||||
echo e.g. sudo systemctl stop isc-dhcp-server
|
||||
sudo `go env GOPATH`/bin/pxeserver -tftp-dir . -bootfilename cpukernel -http-dir . -interface $(NETWORK)
|
||||
|
||||
ssh:
|
||||
ssh -i class_key -p 2022 root@up
|
27
mainboards/amd/rome/class_key
Normal file
27
mainboards/amd/rome/class_key
Normal file
@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEpQIBAAKCAQEA4zGICkjqlAPbYH0MZGN79zDJi88uC1pbc7cUcHQPp8R9iet0
|
||||
2Q594DiOsJhAc9ALDkVopAmDMew1OO9vwZXAkv00hPhnEHFSXJP31zaoWvQkbS/Z
|
||||
/Ghl8gTTrPpJo+gJ3kCINwM1Z+IEQbjlE1EsvgKQEWQMCN32cD52F1L0UpkRaRzP
|
||||
FKKxfMOKYCIIbFDbC1iAAsjuIOunlATy4OT1IbNBhkdX2Mx2kTchaJxry4LL+NDs
|
||||
sIvfrtMJ/5gmIWKYnc4mXr2ozD4ZvCm7ooEnQshSgXXTpjl1AuEJvnaczr+ij66w
|
||||
KUQhzK3Ukjo99b8xhih4pVlU661KAbezziyuFwIDAQABAoIBAFbib1s3jXYzj2b0
|
||||
C5Qss5DR+JHeFobC9GxpXIiw6ffH3harlBEaSKtCFdeVMjjYHBJGGwF4ndKuuZ/f
|
||||
eYa35WCRMs+TS57vJ4c+Ey8buQCnk3KqNRwhNLN8gxMI2La1G2kCltUrBfaHagdU
|
||||
VU6w4YJ86mmsMCoH8KH2USUUVVlsdbEgi6oQzPusw4le8a4shTX40YaBi90hv7XX
|
||||
MshqZDscjM/mqXJVMq8fLJ6IDYeNVLNw3GhlHrlitO2Kheil7ptgrftYdTVqvScR
|
||||
VNL4lFP6rq3N1BN0eisAwyB2A0mf/sCVc0fKA0qsNsODoVw9g7HBTjx6IFpbQ0Kh
|
||||
derDBgkCgYEA+tAZftg8z2A+YFdA/fTGxLS82BCsIKJ1kaizDWcshcdZ6AQ2vNwT
|
||||
JwxzOwiS/Tu1hqNHaE0tYV9cW8hKZC2CdsIquPEEewPNqnwzh6bhUiPmjlPF3Dea
|
||||
pX2LHklCAOXLtnJqf1ZmbhhWbj/2TIITr/Iq5ae5rk32QAwsyvphswMCgYEA5+Rh
|
||||
rMVYlXLSss/9rl+89ecrj0ZmXK5HNsheHdI+444wSgIoNP90Z7FHygDAWSV+RWsN
|
||||
ibpEQxACGhtSgK6IU+9w35fXrEcTfTwyrC5lMxipS5BCkBTSNm9QfASaIZE4Oz+d
|
||||
Z0ifjCCeG8ppZm/kVscP08BYNsuu3xSttDDi4l0CgYEAizhcDpbFGm9X8G4+ezkV
|
||||
5DZW5LBMe0jybcnwqa3tfsyrUSiVobufPfuhMtGNlddA6d1UU8cTO4uNXr0M3hKM
|
||||
6pLY2BOg4w+3Z7zNdaziQY//+Fzz5UtQIjBPup37bzgfHcTg7JHvBYmo4EXM16cU
|
||||
eoO34AZ8AQ7xc5fOfVUCSjUCgYEA5Pn9fMVtYDz+UnTQkQOWKdZ3i8U/RFsOlMir
|
||||
LpUxZi87/Yg9vX9VqSJDufKd/Cjqk49O0eWsi+/ds3uxLsGoegEgGpjr7QBN/UaY
|
||||
3q39XcQHP0cWgwEcRYYLGjrNG0IzHUYGnjr22D5JATYQd4cbGJj9RuFR+eGMLllT
|
||||
4G65Sj0CgYEAptcid0C4Dodg2LeA+E0dduec9uK4Qj4NkeoEcTw6fBInuP9vkIU7
|
||||
LyHDfXKVbCTHC79oc8oQ8OpeVvH999PU15g7MFAUdjrd2MCIEWcQ9WjJr0V3sVn4
|
||||
Nze3kVUWRsXhIoG0yWh6SHbc/HKFhKymtxvdPnbP4qajfcCGIKuIA2c=
|
||||
-----END RSA PRIVATE KEY-----
|
1
mainboards/amd/rome/class_key.pub
Normal file
1
mainboards/amd/rome/class_key.pub
Normal file
@ -0,0 +1 @@
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDjMYgKSOqUA9tgfQxkY3v3MMmLzy4LWltztxRwdA+nxH2J63TZDn3gOI6wmEBz0AsORWikCYMx7DU472/BlcCS/TSE+GcQcVJck/fXNqha9CRtL9n8aGXyBNOs+kmj6AneQIg3AzVn4gRBuOUTUSy+ApARZAwI3fZwPnYXUvRSmRFpHM8UorF8w4pgIghsUNsLWIACyO4g66eUBPLg5PUhs0GGR1fYzHaRNyFonGvLgsv40Oywi9+u0wn/mCYhYpidziZevajMPhm8KbuigSdCyFKBddOmOXUC4Qm+dpzOv6KPrrApRCHMrdSSOj31vzGGKHilWVTrrUoBt7POLK4X rminnich@xcpu
|
27
mainboards/amd/rome/classhostkey
Normal file
27
mainboards/amd/rome/classhostkey
Normal file
@ -0,0 +1,27 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEogIBAAKCAQEA20e7SsGzrPyXMosKhgXMbvIPSe27ilhgcWw4I1NWsPMWhYEU
|
||||
DnM66JiqImyN3tTiimwH7WewKxy4opGLbk2ohYvNQBALNXNr1cV7usAQREAIbafp
|
||||
zZ6mO0gcWjrdsN31aTzMmEXO3dkS+wtEQzKBe/eFjlJbutHvEQkvYWtPeHTtBlVy
|
||||
wcJEc59orcE+HNXrXLcPuJZF37Z5HkEMNGDWvAutHmnXc3C0cKd+bOdhpTx7DAaW
|
||||
Fmj1GdL7WMPBQk1qKo4uE8lqOjTB5qwCGhWPtZFgD6QwYIKtZ/VFWMzUytc6ciRw
|
||||
b5ob6+0+mbL3IFb1XZDbOC3gSbGPV4V0xZrVtwIDAQABAoIBABlIF+vykUishrIp
|
||||
Hbl+Cafw+JpJconszpHFLGPGRAR6wmn6C9nupygSEeuOIH1Ehin3cqKIheMymIcF
|
||||
yNGa2ocrKyrrrp8nA5POBQnvAvEbgN1Dss0mMXw8QCiXCOBPdu//NoeH5OXnFS0k
|
||||
i2ZD+HHWg+t4y2Kqual5KaFNwgfdHJw9vmL/JFzzx2ZuVmIiAl7Pn9dNAu3JgaT2
|
||||
cHNEPxw04Pc0rsNd9NiMEuaijRPJhn2ZeDAdyo+RvrK6wI0ZiopG+3ZztKhJ65zT
|
||||
7si2DjLpr8PMMgYPgMFy1YyoPKokYqnoSrLXMh2Lquy75145aysWNxVa640MNfp6
|
||||
vrFSCqECgYEA9T5GkrZ+7DCJfaPST7lqDBB7uON0DAYaSwUSxNVsu+UMAxSlXB25
|
||||
fYq3TzJzM+rJcDf5JPQLP2gD2BMYQIQZeHsgoV1UKVxZfJi3YpPCg3uNWxLTzut7
|
||||
TGawJBFULNoIrsxh0gLSsFP4RcDTWNUe31+3sD8SirrEz+GWjF9Nc0UCgYEA5OXt
|
||||
uApDOx8q6XkjNwMNZZJdQ+VeDQh8Wg8mPDNKwg7VejI7idV87tn7LjAa4TcKemRi
|
||||
WnLMeb98h0VZiWve2UwstiI5yiZon3f7jEJDop9jvg8/Cj2MgEc2hxKxZQxIN2k3
|
||||
sFfYMUtTr4Q2WT3Gm3aNERpgjhJjf2dFvMJulssCgYBHSUTmXJnkOe+dT8NQXUsQ
|
||||
GrJ7+dG/tP5rlBvyjz8+FsQ5GQVAE3vZnDrQkI+gJb1MG1kWfsHOOoPziQlhp4Rn
|
||||
2xKPFTvjke6JIzMbOmwuH/nk4UIkQZrjiG3m7gqTxwUDGnHMw/lOO/pM/FHy3nBM
|
||||
6dvRJWRUYxnWe3JxdzpiKQKBgEzBLS2Bg3nXwbP4gu53f46Hve5+g0MrjUdFvTSC
|
||||
npbkEoGfRoe5puMRBUE/sEPFCSZxcumRhS9uHnvdrWB/Y4LKIFQStf4rUvnmadtm
|
||||
fPeTKwcYZbMxYGPDfW1dv057B9xM0/e1/TDKaY15cCAMrwSChFsv1SDO2b5nCuN4
|
||||
70xxAoGAbRDd2cxSICb+msM17yF1rGEzvcJRI1rjiTK71Gkt2VqfBPk1belz1vY8
|
||||
E/KkPMHwhWEMSuCrXnaxYrLZg4cvtbYy7tC+wgn1nXwfON8Cpmm74s0O6ufeE7dh
|
||||
S4Bsitze0ougzTMGLQO/9M7He/fPqjM4DIi+PvfpAl/ZUXdD/48=
|
||||
-----END RSA PRIVATE KEY-----
|
1
mainboards/amd/rome/classhostkey.pub
Normal file
1
mainboards/amd/rome/classhostkey.pub
Normal file
@ -0,0 +1 @@
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbR7tKwbOs/JcyiwqGBcxu8g9J7buKWGBxbDgjU1aw8xaFgRQOczromKoibI3e1OKKbAftZ7ArHLiikYtuTaiFi81AEAs1c2vVxXu6wBBEQAhtp+nNnqY7SBxaOt2w3fVpPMyYRc7d2RL7C0RDMoF794WOUlu60e8RCS9ha094dO0GVXLBwkRzn2itwT4c1etctw+4lkXftnkeQQw0YNa8C60eaddzcLRwp35s52GlPHsMBpYWaPUZ0vtYw8FCTWoqji4TyWo6NMHmrAIaFY+1kWAPpDBggq1n9UVYzNTK1zpyJHBvmhvr7T6ZsvcgVvVdkNs4LeBJsY9XhXTFmtW3 rminnich@xcpu
|
2256
mainboards/amd/rome/cpu-linux.config
Normal file
2256
mainboards/amd/rome/cpu-linux.config
Normal file
File diff suppressed because it is too large
Load Diff
2247
mainboards/amd/rome/flashkernel.config
Normal file
2247
mainboards/amd/rome/flashkernel.config
Normal file
File diff suppressed because it is too large
Load Diff
2624
mainboards/amd/rome/sshd-linux.config
Normal file
2624
mainboards/amd/rome/sshd-linux.config
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user