samsung-a3y17lte: new device (Samsung A3 2017) (MR 1784)

This commit is contained in:
mimi89999 2020-12-04 09:28:16 +01:00
parent 2f4a2ea087
commit bb2a0d945e
No known key found for this signature in database
GPG key ID: C4280ACB000B060F
14 changed files with 5133 additions and 0 deletions

View file

@ -0,0 +1,22 @@
# Reference: <https://postmarketos.org/devicepkg>
pkgname=device-samsung-a3y17lte
pkgdesc="Samsung Galaxy A3 (2017)"
pkgver=0.1
pkgrel=0
url="https://postmarketos.org"
license="MIT"
arch="aarch64"
options="!check !archcheck"
depends="postmarketos-base linux-samsung-a3y17lte mkbootimg mesa-dri-gallium msm-fb-refresher"
makedepends="devicepkg-dev"
source="deviceinfo"
build() {
devicepkg_build $startdir $pkgname
}
package() {
devicepkg_package $startdir $pkgname
}
sha512sums="7501ab9e70310006133a3038ec47ac5c8a2bbcca088cd6f5d3e2b933c9a2c5f00916cf0fc3e624332cd226b3416df907281be3603c5bf9d543bf24f8fe25edcd deviceinfo"

View file

@ -0,0 +1,35 @@
# Reference: <https://postmarketos.org/deviceinfo>
# Please use double quotes only. You can source this file in shell
# scripts.
deviceinfo_format_version="0"
deviceinfo_name="Samsung Galaxy A3 (2017)"
deviceinfo_manufacturer="Samsung"
deviceinfo_codename="samsung-a3y17lte"
deviceinfo_year="2017"
deviceinfo_dtb=""
deviceinfo_modules_initfs=""
deviceinfo_arch="aarch64"
# Device related
deviceinfo_chassis="handset"
deviceinfo_keyboard="false"
deviceinfo_external_storage="true"
deviceinfo_screen_width="720"
deviceinfo_screen_height="1280"
# Bootloader related
deviceinfo_flash_method="heimdall-bootimg"
deviceinfo_kernel_cmdline="androidboot.wificountrycode=00 buildvariant=userdebug"
deviceinfo_generate_bootimg="true"
deviceinfo_bootimg_qcdt="true"
deviceinfo_bootimg_mtk_mkimage="false"
deviceinfo_bootimg_dtb_second="false"
deviceinfo_flash_offset_base="0x10000000"
deviceinfo_flash_offset_kernel="0x00008000"
deviceinfo_flash_offset_ramdisk="0x01000000"
deviceinfo_flash_offset_second="0x00f00000"
deviceinfo_flash_offset_tags="0x00000100"
deviceinfo_flash_pagesize="2048"
deviceinfo_flash_heimdall_partition_kernel=""
deviceinfo_flash_heimdall_partition_system=""

View file

@ -0,0 +1,10 @@
diff --git a/fs/sdcardfs/Kconfig b/fs/sdcardfs/Kconfig
index a849480..f52b9e4 100755
--- a/fs/sdcardfs/Kconfig
+++ b/fs/sdcardfs/Kconfig
@@ -2,4 +2,4 @@
# Android Sdcardfs configuation
#
-source "fs/sdcardfs/$ANDROID_MAJOR_VERSION/Kconfig"
+source "fs/sdcardfs/o/Kconfig"

View file

@ -0,0 +1,13 @@
diff --git a/init/_vmm.S b/init/_vmm.S
index b2ef92fa..1a1d898f 100755
--- a/init/_vmm.S
+++ b/init/_vmm.S
@@ -19,7 +19,7 @@
#include <linux/vmm.h>
-#define vmm_ELF_PATH "init/vmm.elf"
+#define vmm_ELF_PATH "../init/vmm.elf"
#define SMC_64BIT_RET_MAGIC 0xC2000401

View file

@ -0,0 +1,172 @@
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index fe388b09..b4adfb80 100755
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -408,157 +408,6 @@ out_rcu_unlock:
goto out;
}
-/* START_OF_KNOX_NPA */
-/** The function is used to check if the ncm feature is enabled or not; if enabled then collect the socket meta-data information; **/
-static void knox_collect_metadata(struct socket *sock) {
- if(check_ncm_flag()) {
- struct knox_socket_metadata* ksm = kzalloc(sizeof(struct knox_socket_metadata),GFP_KERNEL);
-
- struct sock *sk = sock->sk;
- struct inet_sock *inet = inet_sk(sk);
-
- struct pid *pid_struct;
- struct task_struct *task;
-
- struct pid *parent_pid_struct;
- struct task_struct *parent_task;
-
- struct timespec close_timespec;
-
- struct ipv6_pinfo *np;
-
- char full_process_name[128] = {0};
- int returnValue;
-
- if(ksm == NULL) return;
-
- if(!(sk->sk_family == AF_INET) && !(sk->sk_family == AF_INET6)) {
- printk("NPA feature will not record the invalid address type \n");
- kfree(ksm);
- return;
- }
-
- #if IS_ENABLED(CONFIG_IPV6)
- if (sk->sk_family == AF_INET6) {
- np= inet6_sk(sk);
- if(np == NULL) {
- kfree(ksm);
- return;
- }
- switch(sk->sk_protocol) {
- case IPPROTO_TCP:
- if (!ipv6_addr_v4mapped(&np->saddr)) {
- kfree(ksm);
- return;
- }
- break;
- case IPPROTO_UDP:
- case IPPROTO_SCTP:
- default:
- if((sk->sk_udp_daddr != 0) && (sk->sk_udp_saddr != 0)) {
- break;
- }
- if (!ipv6_addr_v4mapped(&np->saddr)) {
- kfree(ksm);
- return;
- }
- break;
- }
- }
- #endif
-
- pid_struct = find_get_pid(current->tgid);
- task = pid_task(pid_struct,PIDTYPE_PID);
- if(task != NULL) {
- returnValue = get_cmdline(task, full_process_name, sizeof(full_process_name)-1);
- if(returnValue > 0) {
- memcpy(ksm->process_name,full_process_name, sizeof(ksm->process_name));
- } else {
- memcpy(ksm->process_name,task->comm, sizeof(task->comm));
- }
- if(task->parent != NULL) {
- parent_pid_struct = find_get_pid(task->parent->tgid);
- parent_task = pid_task(parent_pid_struct,PIDTYPE_PID);
- if(parent_task != NULL) {
- memcpy(ksm->parent_process_name,parent_task->comm,sizeof(ksm->parent_process_name));
- ksm->knox_puid = parent_task->cred->uid.val;
- }
- }
- }
-
- if(sk->sk_protocol == IPPROTO_TCP) {
- sprintf(ksm->srcaddr,"%pI4",(void *)&inet->inet_saddr);
- ksm->srcport = ntohs(inet->inet_sport);
-
- sprintf(ksm->dstaddr,"%pI4",(void *)&inet->inet_daddr);
- ksm->dstport = ntohs(inet->inet_dport);
- }
- else if(sk->sk_protocol == IPPROTO_UDP) {
- if((sk->sk_udp_daddr == 0) && (sk->sk_udp_saddr == 0)) {
- sprintf(ksm->srcaddr,"%pI4",(void *)&inet->inet_saddr);
- ksm->srcport = ntohs(inet->inet_sport);
-
- sprintf(ksm->dstaddr,"%pI4",(void *)&inet->inet_daddr);
- ksm->dstport = ntohs(inet->inet_dport);
- } else {
- sprintf(ksm->srcaddr,"%pI4",(void *)&sk->sk_udp_saddr);
- ksm->srcport = ntohs(sk->sk_udp_sport);
-
- sprintf(ksm->dstaddr,"%pI4",(void *)&sk->sk_udp_daddr);
- ksm->dstport = ntohs(sk->sk_udp_dport);
- }
- }
- else if(sk->sk_protocol == IPPROTO_SCTP) {
- // To record packets which does not leave the device;
- if((sk->sk_udp_daddr == 0) && (sk->sk_udp_saddr == 0)) {
- sprintf(ksm->srcaddr,"%pI4",(void *)&inet->inet_saddr);
- ksm->srcport = ntohs(inet->inet_sport);
-
- sprintf(ksm->dstaddr,"%pI4",(void *)&inet->inet_daddr);
- ksm->dstport = ntohs(inet->inet_dport);
- } else {
- sprintf(ksm->srcaddr,"%pI4",(void *)&sk->sk_udp_saddr);
- ksm->srcport = ntohs(sk->sk_udp_sport);
-
- sprintf(ksm->dstaddr,"%pI4",(void *)&sk->sk_udp_daddr);
- ksm->dstport = ntohs(sk->sk_udp_dport);
- }
- }
- else {
- // Packets belonging to protocols which has no port numbers like icmp,igmp,esp,ah,...
- if((sk->sk_udp_daddr == 0) && (sk->sk_udp_saddr == 0)) {
- sprintf(ksm->srcaddr,"%pI4",(void *)&inet->inet_saddr);
- sprintf(ksm->dstaddr,"%pI4",(void *)&inet->inet_daddr);
- } else {
- sprintf(ksm->srcaddr,"%pI4",(void *)&sk->sk_udp_saddr);
- sprintf(ksm->dstaddr,"%pI4",(void *)&sk->sk_udp_daddr);
- }
- }
-
- // Do not record packets which does not have valid ip addresses associated;
- if((strcmp(ksm->srcaddr,"0.0.0.0") == 0) && (strcmp(ksm->dstaddr,"0.0.0.0") == 0)) {
- kfree(ksm);
- return;
- }
-
- ksm->knox_sent = sock->knox_sent;
- ksm->knox_recv = sock->knox_recv;
- ksm->knox_uid = current->cred->uid.val;
- ksm->knox_pid = current->tgid;
- ksm->trans_proto = sk->sk_protocol;
-
- memcpy(ksm->domain_name,sk->domain_name,sizeof(ksm->domain_name)-1);
-
- ksm->open_time = sock->open_time;
-
- close_timespec = current_kernel_time();
- ksm->close_time = close_timespec.tv_sec;
-
- insert_data_kfifo_kthread(ksm);
- }
-}
-/* END_OF_KNOX_NPA */
-
/*
* The peer socket should always be NULL (or else). When we call this
* function we are destroying the object and from then on nobody
@@ -590,9 +439,6 @@ int inet_release(struct socket *sock)
if (sock_flag(sk, SOCK_LINGER) &&
!(current->flags & PF_EXITING))
timeout = sk->sk_lingertime;
- /* START_OF_KNOX_NPA */
- knox_collect_metadata(sock);
- /* END_OF_KNOX_NPA */
sock->sk = NULL;
sk->sk_prot->close(sk, timeout);
}

View file

@ -0,0 +1,46 @@
diff --git a/firmware/Makefile b/firmware/Makefile
index ea35f1ea..2cf87e7a 100755
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -147,22 +147,6 @@ fw-shipped-$(CONFIG_TOUCHSCREEN_MELFAS_MMS438) += tsp_melfas/mms438_j7x.fw tsp_m
fw-shipped-$(CONFIG_TOUCHSCREEN_ATMEL_MXT1664) += tsp_atmel/mxt1664t_matisse.fw
-TSPFIRMWARE_DIRECTORY = firmware/tsp_stm
-ifeq ($(shell test -d $(TSPFIRMWARE_DIRECTORY) && echo yes),yes)
-fw-shipped-$(CONFIG_TOUCHSCREEN_FTS7) += tsp_stm/matisse.fw tsp_stm/stm_gtaxl.fw tsp_stm/fts1a096_gtaxl_rev03.fw \
- tsp_stm/fts1a096_gtaxl_note.fw
-fw-shipped-$(CONFIG_TOUCHSCREEN_FTS) += tsp_stm/fts8cd56_gtactive2.fw
-fw-shipped-$(CONFIG_TOUCHSCREEN_FTS1BA90A) += tsp_stm/fts1ba90a_gtadv2.fw
-else
-$(warning '$(TSPFIRMWARE_DIRECTORY)' directory dose not exist)
-endif
-TSPFIRMWARE_DIRECTORY = firmware/tsp_zinitix
-ifeq ($(shell test -d $(TSPFIRMWARE_DIRECTORY) && echo yes),yes)
-fw-shipped-$(CONFIG_TOUCHSCREEN_ZINITIX_ZT75XX) += tsp_zinitix/zt7548_degas2.fw tsp_zinitix/zt7538_o7.fw
-fw-shipped-$(CONFIG_TOUCHSCREEN_ZINITIX_ZT75XX_TCLM) += tsp_zinitix/zt7548_a6lte.fw tsp_zinitix/zt7548_j6.fw
-else
-$(warning '$(TSPFIRMWARE_DIRECTORY)' directory dose not exist)
-endif
fw-shipped-$(CONFIG_TOUCHSCREEN_ZINITIX_BT541C) += tsp_zinitix/bt541c_GPPIris.fw
fw-shipped-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_DSX2) += tsp_synaptics/td4300_on7xelte.fw
@@ -182,8 +166,8 @@ fw-shipped-$(CONFIG_KEYBOARD_TC300K) += coreriver/tc350k_j7x.fw coreriver/tc305k
coreriver/tc305k_j7top_kor.fw coreriver/tc305k_j7top_gsm.fw
fw-shipped-$(CONFIG_KEYBOARD_MELFAS_MHS204) += melfas_tk/mhs204g_on7xlte.fw
fw-shipped-$(CONFIG_KEYBOARD_MELFAS_MHS2041) += melfas_tk/mhs204_j5y17.fw melfas_tk/mhs2041_j5y17.fw melfas_tk/mhs2041_j7y17.fw
-fw-shipped-$(CONFIG_KEYBOARD_MELFAS_MHS2041B) += melfas_tk/mhs2041_j5y17.fw melfas_tk/mhs2041B_j5y17.fw melfas_tk/mhs2041B_j5y17_new.fw \
- melfas_tk/mhs2041_j7y17.fw melfas_tk/mhs2041B_j7y17.fw melfas_tk/mhs2041B_j7y17_new.fw \
+fw-shipped-$(CONFIG_KEYBOARD_MELFAS_MHS2041B) += melfas_tk/mhs2041B_j5y17.fw melfas_tk/mhs2041B_j5y17_new.fw \
+ melfas_tk/mhs2041B_j7y17.fw melfas_tk/mhs2041B_j7y17_new.fw \
melfas_tk/mhs2041B_j7y17_ltn.fw melfas_tk/mhs2041B_j7y17_open.fw melfas_tk/melfas_mip4_tk.fw
fw-shipped-$(CONFIG_KEYBOARD_ABOV_TOUCH_FT1804) += abov/abov_a7_max.fw
@@ -201,7 +185,6 @@ fw-shipped-$(CONFIG_SENSORS_SSP_2017A3) += ssp_stmf410_a2017.fw
fw-shipped-$(CONFIG_SENSORS_SSP_A3XPREMIUM) += ssp_stmf410_a3p.fw
fw-shipped-$(CONFIG_SENSORS_SSP_A3Y17PREMIUM) += ssp_stmf410_a2017_p.fw
fw-shipped-$(CONFIG_SENSORS_SSP_STM32) += ssp_crashed.fw
-fw-shipped-$(CONFIG_SENSORS_SSP_STM_V2) += ssp_crashed.fw
# FPGA for IRIS
fw-shipped-$(CONFIG_LEDS_IRIS_FPGA_ICE40XX) += ice40xx/ice40_fpga_iris_V01.fw

View file

@ -0,0 +1,19 @@
diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile
index 96e7219d..30cfb3de 100755
--- a/arch/arm64/boot/dts/Makefile
+++ b/arch/arm64/boot/dts/Makefile
@@ -3,7 +3,13 @@ dtb-$(CONFIG_ARCH_VEXPRESS) += rtsm_ve-aemv8a.dtb foundation-v8.dtb
dtb-$(CONFIG_ARCH_XGENE) += apm-mustang.dtb
dtb-$(CONFIG_SOC_EXYNOS8890) += exynos8890-espresso8890.dtb exynos8890-espresso8890_rev01.dtb exynos8890-universal8890.dtb exynos8890-smdk8890.dtb
dtb-$(CONFIG_SOC_EXYNOS8890) += exynos8890-evt1-smdk8890.dtb
-dtb-$(CONFIG_SOC_EXYNOS7870) += exynos7870-smdk7870.dtb exynos7870-universal7870.dtb exynos7870-universal7870_rev01.dtb
+#dtb-$(CONFIG_SOC_EXYNOS7870) += exynos7870-smdk7870.dtb exynos7870-universal7870.dtb exynos7870-universal7870_rev01.dtb
+
+dtb-$(CONFIG_SOC_EXYNOS7870) += \
+ exynos7870-a3y17lte_eur_open_00.dtb \
+ exynos7870-a3y17lte_eur_open_01.dtb \
+ exynos7870-a3y17lte_eur_open_02.dtb \
+ exynos7870-a3y17lte_eur_open_03.dtb
targets += dtbs

View file

@ -0,0 +1,18 @@
diff --git a/drivers/video/fbdev/exynos/decon_7870/decon-int_drv.c b/drivers/video/fbdev/exynos/decon_7870/decon-int_drv.c
index c5465e93..4f6feb6b 100755
--- a/drivers/video/fbdev/exynos/decon_7870/decon-int_drv.c
+++ b/drivers/video/fbdev/exynos/decon_7870/decon-int_drv.c
@@ -463,11 +463,11 @@ int decon_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
case 24:
/* our 24bpp is unpacked, so 32bpp */
var->bits_per_pixel = 32;
- var->red.offset = 16;
+ var->red.offset = 0;
var->red.length = 8;
var->green.offset = 8;
var->green.length = 8;
- var->blue.offset = 0;
+ var->blue.offset = 16;
var->blue.length = 8;
break;

View file

@ -0,0 +1,24 @@
diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index 2502ce1d..c6028edc 100755
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -1262,18 +1262,13 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
if (get_ether_addr(dev_addr, net->dev_addr))
dev_warn(&g->dev,
"using random %s ethernet address\n", "self");
-#ifdef CONFIG_USB_ANDROID_SAMSUNG_COMPOSITE
- memcpy(dev->host_mac, ethaddr, ETH_ALEN);
- printk(KERN_DEBUG "usb: set unique host mac\n");
-
-#else
if (get_ether_addr(host_addr, dev->host_mac))
dev_warn(&g->dev,
"using random %s ethernet address\n", "host");
if (ethaddr)
memcpy(ethaddr, dev->host_mac, ETH_ALEN);
-#endif
+
net->netdev_ops = &eth_netdev_ops;
net->ethtool_ops = &ops;

View file

@ -0,0 +1,69 @@
# Reference: <https://postmarketos.org/vendorkernel>
# Kernel config based on: arch/arm64/configs/a3y17ltexc_00_defconfig
pkgname=linux-samsung-a3y17lte
pkgver=3.18.14
pkgrel=0
pkgdesc="Samsung Galaxy A3 (2017) kernel fork"
arch="aarch64"
_carch="arm64"
_flavor="samsung-a3y17lte"
url="https://kernel.org"
license="GPL-2.0-only"
options="!strip !check !tracedeps pmb:cross-native"
makedepends="bash bc bison devicepkg-dev flex openssl-dev perl dtbtool-exynos"
# Source
_repository="SM-A320FL-kernel"
_commit="5414dbfa9f5e114366ff0cc2ffeb9725f3c6b8c3"
_config="config-$_flavor.$arch"
source="
$pkgname-$_commit.tar.gz::https://github.com/mimi89999/$_repository/archive/$_commit.tar.gz
$_config
gcc7-give-up-on-ilog2-const-optimizations.patch
gcc8-fix-put-user.patch
gcc10-extern_YYLOC_global_declaration.patch
01-fix-recursive-Kconfig.patch
02-fix-vmm-blob-include.patch
03-disable-knox.patch
04-fix-firmware-make.patch
05-add-dts-make.patch
06-fix-video-argb-setting.patch
07-fix-usb-gadget-random-mac.patch
"
builddir="$srcdir/$_repository-$_commit"
_outdir="out"
prepare() {
default_prepare
. downstreamkernel_prepare
}
build() {
unset LDFLAGS
make O="$_outdir" ARCH="$_carch" CC="${CC:-gcc}" \
KBUILD_BUILD_VERSION="$((pkgrel + 1 ))-postmarketOS"
# Master DTB (deviceinfo_bootimg_qcdt)
dtbTool-exynos -o "$_outdir/arch/$_carch/boot"/dt.img \
$(find "$_outdir/arch/$_carch/boot/dts/" -name *a3y17lte*.dtb)
}
package() {
downstreamkernel_package "$builddir" "$pkgdir" "$_carch" "$_flavor" "$_outdir"
install -Dm644 "$_outdir/arch/$_carch/boot"/dt.img \
"$pkgdir"/boot/dt.img
}
sha512sums="71cb4a24bc1aaeaeafd5e00159e560f487eb851a099f652fcb2e9709e6aea4f2e1b95830be13c865c2fab1fad54c9ba209d72068806cef64713e1e12e3d9fb70 linux-samsung-a3y17lte-5414dbfa9f5e114366ff0cc2ffeb9725f3c6b8c3.tar.gz
28b08b6c30be6cb62249370033bcdf5649c14344be2689c5a5250f59d9ad53bb0d25d1750322e2d994c701c2f408406c21824c3d3ab217937e77ca4489fe7046 config-samsung-a3y17lte.aarch64
77eba606a71eafb36c32e9c5fe5e77f5e4746caac292440d9fb720763d766074a964db1c12bc76fe583c5d1a5c864219c59941f5e53adad182dbc70bf2bc14a7 gcc7-give-up-on-ilog2-const-optimizations.patch
197d40a214ada87fcb2dfc0ae4911704b9a93354b75179cd6b4aadbb627a37ec262cf516921c84a8b1806809b70a7b440cdc8310a4a55fca5d2c0baa988e3967 gcc8-fix-put-user.patch
2b48f1bf0e3f70703d2cdafc47d5e615cc7c56c70bec56b2e3297d3fa4a7a1321d649a8679614553dde8fe52ff1051dae38d5990e3744c9ca986d92187dcdbeb gcc10-extern_YYLOC_global_declaration.patch
07dac7460696ee67d192ec03a39a6b70991b848c878fb71975cac54be9dddd26c68f8cc6b92db150b06e916c11c1cff4f6f213686ab1cda1318f56db081d9ba1 01-fix-recursive-Kconfig.patch
23bf8ef0ad38b38ffa9ddfdee76a32c43b021169c6db6f5b733fd6434169f7c7bb27cdb1232be89475f34f9053211d943e13f5fba565c928256b92b18d636130 02-fix-vmm-blob-include.patch
8f3939d3f0f91f7b21e12b63e0c650ea6d147f988e927ff7785fbfffa4578ea0a59acbb76f74a680d887cfb89b29a1caa2e62df93062b6bcfba291282b621f82 03-disable-knox.patch
66af05562023bebc8334db8236655960e306aa4e2ce216129a077a762bcf951b8c2c286e1c3f45c6478296769e3b6a70f88256e909a9c48f2539bfc056ecf312 04-fix-firmware-make.patch
436f028e28760c2c93c63333ecd78d4d03291264cb2e108f66d75d5f2e44df9b0cba90ecfd762df3aab7ff131eddc13ba033332a6384680bff85424cfe95c4c2 05-add-dts-make.patch
9e532d0051756831e12948a5584f331528be58bcddbfab1e1df0217760d035f81b1ac7361b8e81190d4901761572680965b4dd8ef30492c5f94fc330089ce0b3 06-fix-video-argb-setting.patch
0d56ba508408dc31961ad688f7fd960b0008851fd5729088658095417781b99962740e0c64d162a26f8389e4b4dc88e291252e7935e896fc70bf73c23150caea 07-fix-usb-gadget-random-mac.patch"

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
../../.shared-patches/linux/gcc10-extern_YYLOC_global_declaration.patch

View file

@ -0,0 +1 @@
../../.shared-patches/linux/gcc7-give-up-on-ilog2-const-optimizations.patch

View file

@ -0,0 +1 @@
../../.shared-patches/linux/gcc8-fix-put-user.patch