Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Pre fb041b598997d63c0f7d7305dfae70046bf66fe1 rw_copy_check_uvector
- 0000000000001918 <rw_copy_check_uvector>:
- */
- ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
- unsigned long nr_segs, unsigned long fast_segs,
- struct iovec *fast_pointer,
- struct iovec **ret_pointer)
- {
- 1918: d503233f paciasp
- 191c: a9bb7bfd stp x29, x30, [sp, #-80]!
- 1920: f9000bf9 str x25, [sp, #16]
- 1924: a9025ff8 stp x24, x23, [sp, #32]
- 1928: a90357f6 stp x22, x21, [sp, #48]
- 192c: a9044ff4 stp x20, x19, [sp, #64]
- 1930: 910003fd mov x29, sp
- 1934: aa0503f3 mov x19, x5
- 1938: aa0403f4 mov x20, x4
- /*
- * SuS says "The readv() function *may* fail if the iovcnt argument
- * was less than or equal to 0, or greater than {IOV_MAX}. Linux has
- * traditionally returned zero for zero segments, so...
- */
- if (nr_segs == 0) {
- 193c: b40000c2 cbz x2, 1954 <rw_copy_check_uvector+0x3c>
- 1940: aa0203f6 mov x22, x2
- /*
- * First get the "struct iovec" from user memory and
- * verify all the pointers
- */
- if (nr_segs > UIO_MAXIOV) {
- 1944: f110005f cmp x2, #0x400
- 1948: 54000189 b.ls 1978 <rw_copy_check_uvector+0x60> // b.plast
- 194c: 928002a0 mov x0, #0xffffffffffffffea // #-22
- 1950: 14000002 b 1958 <rw_copy_check_uvector+0x40>
- 1954: aa1f03e0 mov x0, xzr
- iov[seg].iov_len = len;
- }
- ret += len;
- }
- out:
- *ret_pointer = iov;
- 1958: f9000274 str x20, [x19]
- return ret;
- }
- 195c: a9444ff4 ldp x20, x19, [sp, #64]
- 1960: a94357f6 ldp x22, x21, [sp, #48]
- 1964: a9425ff8 ldp x24, x23, [sp, #32]
- 1968: f9400bf9 ldr x25, [sp, #16]
- 196c: a8c57bfd ldp x29, x30, [sp], #80
- 1970: d50323bf autiasp
- 1974: d65f03c0 ret
- 1978: aa0103f7 mov x23, x1
- 197c: 2a0003f5 mov w21, w0
- if (nr_segs > fast_segs) {
- 1980: eb0302df cmp x22, x3
- 1984: 540000a9 b.ls 1998 <rw_copy_check_uvector+0x80> // b.plast
- iov = kmalloc_array(nr_segs, sizeof(struct iovec), GFP_KERNEL);
- 1988: aa1603e0 mov x0, x22
- 198c: 9400004d bl 1ac0 <kmalloc_array>
- 1990: aa0003f4 mov x20, x0
- if (iov == NULL) {
- 1994: b4000780 cbz x0, 1a84 <rw_copy_check_uvector+0x16c>
- 1998: d5384119 mrs x25, sp_el0
- (current->flags & PF_KTHREAD || test_thread_flag(TIF_TAGGED_ADDR)))
- 199c: 3940bb2a ldrb w10, [x25, #46]
- unsigned long ret, limit = current_thread_info()->addr_limit;
- 19a0: f9400729 ldr x9, [x25, #8]
- if (copy_from_user(iov, uvector, nr_segs*sizeof(*uvector))) {
- 19a4: d37ceed8 lsl x24, x22, #4
- 19a8: d378dee8 lsl x8, x23, #8
- (current->flags & PF_KTHREAD || test_thread_flag(TIF_TAGGED_ADDR)))
- 19ac: 3728008a tbnz w10, #5, 19bc <rw_copy_check_uvector+0xa4>
- 19b0: f940032b ldr x11, [x25]
- 19b4: aa1703ea mov x10, x23
- if (IS_ENABLED(CONFIG_ARM64_TAGGED_ADDR_ABI) &&
- 19b8: 36d0004b tbz w11, #26, 19c0 <rw_copy_check_uvector+0xa8>
- addr = untagged_addr(addr);
- 19bc: 8a8822ea and x10, x23, x8, asr #8
- asm volatile(
- 19c0: ab18014a adds x10, x10, x24
- 19c4: 9a8983e9 csel x9, xzr, x9, hi // hi = pmore
- 19c8: da9f314a csinv x10, x10, xzr, cc // cc = lo, ul, last
- 19cc: fa09015f sbcs xzr, x10, x9
- 19d0: 9a9f87ea cset x10, ls // ls = plast
- if (likely(access_ok(from, n))) {
- 19d4: b400060a cbz x10, 1a94 <rw_copy_check_uvector+0x17c>
- __uaccess_enable(ARM64_ALT_PAN_NOT_UAO);
- 19d8: d503201f nop
- : "r" (ptr), "r" (current_thread_info()->addr_limit),
- 19dc: f9400729 ldr x9, [x25, #8]
- "r" (untagged_addr(ptr))
- 19e0: 8a8822e8 and x8, x23, x8, asr #8
- asm volatile(
- 19e4: ea29011f bics xzr, x8, x9
- 19e8: 9a9f02e1 csel x1, x23, xzr, eq // eq = none
- csdb();
- 19ec: d503229f csdb
- res = raw_copy_from_user(to, from, n);
- 19f0: aa1403e0 mov x0, x20
- 19f4: aa1803e2 mov x2, x24
- 19f8: 94000000 bl 0 <__arch_copy_from_user>
- __uaccess_disable(ARM64_ALT_PAN_NOT_UAO);
- 19fc: d503201f nop
- if (unlikely(res))
- 1a00: b5000520 cbnz x0, 1aa4 <rw_copy_check_uvector+0x18c>
- for (seg = 0; seg < nr_segs; seg++) {
- 1a04: f10006df cmp x22, #0x1
- 1a08: 91002288 add x8, x20, #0x8
- 1a0c: 9a9f86c9 csinc x9, x22, xzr, hi // hi = pmore
- 1a10: 32144bea mov w10, #0x7ffff000 // #2147479552
- 1a14: 14000005 b 1a28 <rw_copy_check_uvector+0x110>
- ret += len;
- 1a18: 8b000160 add x0, x11, x0
- for (seg = 0; seg < nr_segs; seg++) {
- 1a1c: f1000529 subs x9, x9, #0x1
- 1a20: 91004108 add x8, x8, #0x10
- 1a24: 54fff9a0 b.eq 1958 <rw_copy_check_uvector+0x40> // b.none
- ssize_t len = (ssize_t)iov[seg].iov_len;
- 1a28: f940010b ldr x11, [x8]
- 1a2c: b7fff90b tbnz x11, #63, 194c <rw_copy_check_uvector+0x34>
- && unlikely(!access_ok(buf, len))) {
- 1a30: 37f801f5 tbnz w21, #31, 1a6c <rw_copy_check_uvector+0x154>
- 1a34: f85f810c ldur x12, [x8, #-8]
- (current->flags & PF_KTHREAD || test_thread_flag(TIF_TAGGED_ADDR)))
- 1a38: 3940bb2e ldrb w14, [x25, #46]
- unsigned long ret, limit = current_thread_info()->addr_limit;
- 1a3c: f940072d ldr x13, [x25, #8]
- (current->flags & PF_KTHREAD || test_thread_flag(TIF_TAGGED_ADDR)))
- 1a40: 3728006e tbnz w14, #5, 1a4c <rw_copy_check_uvector+0x134>
- 1a44: f940032e ldr x14, [x25]
- if (IS_ENABLED(CONFIG_ARM64_TAGGED_ADDR_ABI) &&
- 1a48: 36d0006e tbz w14, #26, 1a54 <rw_copy_check_uvector+0x13c>
- 1a4c: d378dd8e lsl x14, x12, #8
- addr = untagged_addr(addr);
- 1a50: 8a8e218c and x12, x12, x14, asr #8
- asm volatile(
- 1a54: ab0b018c adds x12, x12, x11
- 1a58: 9a8d83ed csel x13, xzr, x13, hi // hi = pmore
- 1a5c: da9f318c csinv x12, x12, xzr, cc // cc = lo, ul, last
- 1a60: fa0d019f sbcs xzr, x12, x13
- 1a64: 9a9f87ec cset x12, ls // ls = plast
- if (type >= 0
- 1a68: b400012c cbz x12, 1a8c <rw_copy_check_uvector+0x174>
- if (len > MAX_RW_COUNT - ret) {
- 1a6c: cb00014c sub x12, x10, x0
- 1a70: eb0c017f cmp x11, x12
- 1a74: 54fffd29 b.ls 1a18 <rw_copy_check_uvector+0x100> // b.plast
- 1a78: aa0c03eb mov x11, x12
- iov[seg].iov_len = len;
- 1a7c: f900010c str x12, [x8]
- 1a80: 17ffffe6 b 1a18 <rw_copy_check_uvector+0x100>
- 1a84: 92800160 mov x0, #0xfffffffffffffff4 // #-12
- 1a88: 17ffffb4 b 1958 <rw_copy_check_uvector+0x40>
- 1a8c: 928001a0 mov x0, #0xfffffffffffffff2 // #-14
- 1a90: 17ffffb2 b 1958 <rw_copy_check_uvector+0x40>
- memset(to + (n - res), 0, res);
- 1a94: aa1403e0 mov x0, x20
- 1a98: 2a1f03e1 mov w1, wzr
- 1a9c: aa1803e2 mov x2, x24
- 1aa0: 14000005 b 1ab4 <rw_copy_check_uvector+0x19c>
- 1aa4: cb000308 sub x8, x24, x0
- 1aa8: aa0003e2 mov x2, x0
- 1aac: 8b080280 add x0, x20, x8
- 1ab0: 2a1f03e1 mov w1, wzr
- 1ab4: 94000000 bl 0 <memset>
- 1ab8: 928001a0 mov x0, #0xfffffffffffffff2 // #-14
- 1abc: 17ffffa7 b 1958 <rw_copy_check_uvector+0x40>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement