0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 .code32
0026 .text
0027
0028 #include <linux/init.h>
0029 #include <linux/linkage.h>
0030 #include <asm/segment.h>
0031 #include <asm/boot.h>
0032 #include <asm/msr.h>
0033 #include <asm/processor-flags.h>
0034 #include <asm/asm-offsets.h>
0035 #include <asm/bootparam.h>
0036 #include <asm/desc_defs.h>
0037 #include <asm/trapnr.h>
0038 #include "pgtable.h"
0039
0040
0041
0042
0043 .hidden _bss
0044 .hidden _ebss
0045 .hidden _end
0046
0047 __HEAD
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 #define rva(X) ((X) - startup_32)
0073
0074 .code32
0075 SYM_FUNC_START(startup_32)
0076
0077
0078
0079
0080
0081
0082 cld
0083 cli
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093 leal (BP_scratch+4)(%esi), %esp
0094 call 1f
0095 1: popl %ebp
0096 subl $ rva(1b), %ebp
0097
0098
0099 leal rva(gdt)(%ebp), %eax
0100 movl %eax, 2(%eax)
0101 lgdt (%eax)
0102
0103
0104 movl $__BOOT_DS, %eax
0105 movl %eax, %ds
0106 movl %eax, %es
0107 movl %eax, %fs
0108 movl %eax, %gs
0109 movl %eax, %ss
0110
0111
0112 leal rva(boot_stack_end)(%ebp), %esp
0113
0114 pushl $__KERNEL32_CS
0115 leal rva(1f)(%ebp), %eax
0116 pushl %eax
0117 lretl
0118 1:
0119
0120
0121 call startup32_load_idt
0122
0123
0124 call verify_cpu
0125 testl %eax, %eax
0126 jnz .Lno_longmode
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137 #ifdef CONFIG_RELOCATABLE
0138 movl %ebp, %ebx
0139
0140 #ifdef CONFIG_EFI_STUB
0141
0142
0143
0144
0145
0146
0147
0148
0149 subl rva(image_offset)(%ebp), %ebx
0150 #endif
0151
0152 movl BP_kernel_alignment(%esi), %eax
0153 decl %eax
0154 addl %eax, %ebx
0155 notl %eax
0156 andl %eax, %ebx
0157 cmpl $LOAD_PHYSICAL_ADDR, %ebx
0158 jae 1f
0159 #endif
0160 movl $LOAD_PHYSICAL_ADDR, %ebx
0161 1:
0162
0163
0164 addl BP_init_size(%esi), %ebx
0165 subl $ rva(_end), %ebx
0166
0167
0168
0169
0170
0171
0172 movl %cr4, %eax
0173 orl $X86_CR4_PAE, %eax
0174 movl %eax, %cr4
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184 call get_sev_encryption_bit
0185 xorl %edx, %edx
0186 #ifdef CONFIG_AMD_MEM_ENCRYPT
0187 testl %eax, %eax
0188 jz 1f
0189 subl $32, %eax
0190 bts %eax, %edx
0191
0192
0193
0194
0195
0196
0197
0198 movl $1, rva(sev_status)(%ebp)
0199 1:
0200 #endif
0201
0202
0203 leal rva(pgtable)(%ebx), %edi
0204 xorl %eax, %eax
0205 movl $(BOOT_INIT_PGT_SIZE/4), %ecx
0206 rep stosl
0207
0208
0209 leal rva(pgtable + 0)(%ebx), %edi
0210 leal 0x1007 (%edi), %eax
0211 movl %eax, 0(%edi)
0212 addl %edx, 4(%edi)
0213
0214
0215 leal rva(pgtable + 0x1000)(%ebx), %edi
0216 leal 0x1007(%edi), %eax
0217 movl $4, %ecx
0218 1: movl %eax, 0x00(%edi)
0219 addl %edx, 0x04(%edi)
0220 addl $0x00001000, %eax
0221 addl $8, %edi
0222 decl %ecx
0223 jnz 1b
0224
0225
0226 leal rva(pgtable + 0x2000)(%ebx), %edi
0227 movl $0x00000183, %eax
0228 movl $2048, %ecx
0229 1: movl %eax, 0(%edi)
0230 addl %edx, 4(%edi)
0231 addl $0x00200000, %eax
0232 addl $8, %edi
0233 decl %ecx
0234 jnz 1b
0235
0236
0237 leal rva(pgtable)(%ebx), %eax
0238 movl %eax, %cr3
0239
0240
0241 movl $MSR_EFER, %ecx
0242 rdmsr
0243 btsl $_EFER_LME, %eax
0244 wrmsr
0245
0246
0247 xorl %eax, %eax
0248 lldt %ax
0249 movl $__BOOT_TSS, %eax
0250 ltr %ax
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262 leal rva(startup_64)(%ebp), %eax
0263 #ifdef CONFIG_EFI_MIXED
0264 movl rva(efi32_boot_args)(%ebp), %edi
0265 testl %edi, %edi
0266 jz 1f
0267 leal rva(efi64_stub_entry)(%ebp), %eax
0268 movl rva(efi32_boot_args+4)(%ebp), %esi
0269 movl rva(efi32_boot_args+8)(%ebp), %edx // saved bootparams pointer
0270 testl %edx, %edx
0271 jnz 1f
0272
0273
0274
0275
0276
0277
0278
0279 subl $40, %esp
0280 leal rva(efi_pe_entry)(%ebp), %eax
0281 movl %edi, %ecx // MS calling convention
0282 movl %esi, %edx
0283 1:
0284 #endif
0285
0286 call startup32_check_sev_cbit
0287
0288 pushl $__KERNEL_CS
0289 pushl %eax
0290
0291
0292 movl $CR0_STATE, %eax
0293 movl %eax, %cr0
0294
0295
0296 lret
0297 SYM_FUNC_END(startup_32)
0298
0299 #ifdef CONFIG_EFI_MIXED
0300 .org 0x190
0301 SYM_FUNC_START(efi32_stub_entry)
0302 add $0x4, %esp
0303 popl %ecx
0304 popl %edx
0305 popl %esi
0306
0307 call 1f
0308 1: pop %ebp
0309 subl $ rva(1b), %ebp
0310
0311 movl %esi, rva(efi32_boot_args+8)(%ebp)
0312 SYM_INNER_LABEL(efi32_pe_stub_entry, SYM_L_LOCAL)
0313 movl %ecx, rva(efi32_boot_args)(%ebp)
0314 movl %edx, rva(efi32_boot_args+4)(%ebp)
0315 movb $0, rva(efi_is64)(%ebp)
0316
0317
0318 sgdtl rva(efi32_boot_gdt)(%ebp)
0319 movw %cs, rva(efi32_boot_cs)(%ebp)
0320 movw %ds, rva(efi32_boot_ds)(%ebp)
0321
0322
0323 sidtl rva(efi32_boot_idt)(%ebp)
0324
0325
0326 movl %cr0, %eax
0327 btrl $X86_CR0_PG_BIT, %eax
0328 movl %eax, %cr0
0329
0330 jmp startup_32
0331 SYM_FUNC_END(efi32_stub_entry)
0332 #endif
0333
0334 .code64
0335 .org 0x200
0336 SYM_CODE_START(startup_64)
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348 cld
0349 cli
0350
0351
0352 xorl %eax, %eax
0353 movl %eax, %ds
0354 movl %eax, %es
0355 movl %eax, %ss
0356 movl %eax, %fs
0357 movl %eax, %gs
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373 #ifdef CONFIG_RELOCATABLE
0374 leaq startup_32(%rip) , %rbp
0375
0376 #ifdef CONFIG_EFI_STUB
0377
0378
0379
0380
0381
0382
0383
0384
0385 movl image_offset(%rip), %eax
0386 subq %rax, %rbp
0387 #endif
0388
0389 movl BP_kernel_alignment(%rsi), %eax
0390 decl %eax
0391 addq %rax, %rbp
0392 notq %rax
0393 andq %rax, %rbp
0394 cmpq $LOAD_PHYSICAL_ADDR, %rbp
0395 jae 1f
0396 #endif
0397 movq $LOAD_PHYSICAL_ADDR, %rbp
0398 1:
0399
0400
0401 movl BP_init_size(%rsi), %ebx
0402 subl $ rva(_end), %ebx
0403 addq %rbp, %rbx
0404
0405
0406 leaq rva(boot_stack_end)(%rbx), %rsp
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434 leaq gdt64(%rip), %rax
0435 addq %rax, 2(%rax)
0436 lgdt (%rax)
0437
0438
0439 pushq $__KERNEL_CS
0440 leaq .Lon_kernel_cs(%rip), %rax
0441 pushq %rax
0442 lretq
0443
0444 .Lon_kernel_cs:
0445
0446 pushq %rsi
0447 call load_stage1_idt
0448 popq %rsi
0449
0450 #ifdef CONFIG_AMD_MEM_ENCRYPT
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461 pushq %rsi
0462 movq %rsi, %rdi
0463 call sev_enable
0464 popq %rsi
0465 #endif
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480 pushq %rsi
0481 movq %rsi, %rdi
0482 call paging_prepare
0483 popq %rsi
0484
0485
0486 movq %rax, %rcx
0487
0488
0489
0490
0491
0492 leaq trampoline_return(%rip), %rdi
0493
0494
0495 pushq $__KERNEL32_CS
0496 leaq TRAMPOLINE_32BIT_CODE_OFFSET(%rax), %rax
0497 pushq %rax
0498 lretq
0499 trampoline_return:
0500
0501 leaq rva(boot_stack_end)(%rbx), %rsp
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512 pushq %rsi
0513 leaq rva(top_pgtable)(%rbx), %rdi
0514 call cleanup_trampoline
0515 popq %rsi
0516
0517
0518 pushq $0
0519 popfq
0520
0521
0522
0523
0524
0525 pushq %rsi
0526 leaq (_bss-8)(%rip), %rsi
0527 leaq rva(_bss-8)(%rbx), %rdi
0528 movl $(_bss - startup_32), %ecx
0529 shrl $3, %ecx
0530 std
0531 rep movsq
0532 cld
0533 popq %rsi
0534
0535
0536
0537
0538
0539
0540 leaq rva(gdt64)(%rbx), %rax
0541 leaq rva(gdt)(%rbx), %rdx
0542 movq %rdx, 2(%rax)
0543 lgdt (%rax)
0544
0545
0546
0547
0548 leaq rva(.Lrelocated)(%rbx), %rax
0549 jmp *%rax
0550 SYM_CODE_END(startup_64)
0551
0552 #ifdef CONFIG_EFI_STUB
0553 .org 0x390
0554 SYM_FUNC_START(efi64_stub_entry)
0555 and $~0xf, %rsp
0556 movq %rdx, %rbx
0557 call efi_main
0558 movq %rbx,%rsi
0559 leaq rva(startup_64)(%rax), %rax
0560 jmp *%rax
0561 SYM_FUNC_END(efi64_stub_entry)
0562 SYM_FUNC_ALIAS(efi_stub_entry, efi64_stub_entry)
0563 #endif
0564
0565 .text
0566 SYM_FUNC_START_LOCAL_NOALIGN(.Lrelocated)
0567
0568
0569
0570
0571 xorl %eax, %eax
0572 leaq _bss(%rip), %rdi
0573 leaq _ebss(%rip), %rcx
0574 subq %rdi, %rcx
0575 shrq $3, %rcx
0576 rep stosq
0577
0578 pushq %rsi
0579 call load_stage2_idt
0580
0581
0582 movq (%rsp), %rdi
0583 call initialize_identity_maps
0584 popq %rsi
0585
0586
0587
0588
0589 pushq %rsi
0590 movq %rsi, %rdi
0591 leaq boot_heap(%rip), %rsi
0592 leaq input_data(%rip), %rdx
0593 movl input_len(%rip), %ecx
0594 movq %rbp, %r8
0595 movl output_len(%rip), %r9d
0596 call extract_kernel
0597 popq %rsi
0598
0599
0600
0601
0602 jmp *%rax
0603 SYM_FUNC_END(.Lrelocated)
0604
0605 .code32
0606
0607
0608
0609
0610
0611
0612
0613 SYM_CODE_START(trampoline_32bit_src)
0614
0615 movl $__KERNEL_DS, %eax
0616 movl %eax, %ds
0617 movl %eax, %ss
0618
0619
0620 leal TRAMPOLINE_32BIT_STACK_END(%ecx), %esp
0621
0622
0623 movl %cr0, %eax
0624 btrl $X86_CR0_PG_BIT, %eax
0625 movl %eax, %cr0
0626
0627
0628 testl %edx, %edx
0629 jz 1f
0630
0631
0632 movl %cr4, %eax
0633 testl $X86_CR4_LA57, %eax
0634 jnz 3f
0635 jmp 2f
0636 1:
0637
0638 movl %cr4, %eax
0639 testl $X86_CR4_LA57, %eax
0640 jz 3f
0641 2:
0642
0643 leal TRAMPOLINE_32BIT_PGTABLE_OFFSET(%ecx), %eax
0644 movl %eax, %cr3
0645 3:
0646
0647 pushl %ecx
0648 pushl %edx
0649 movl $MSR_EFER, %ecx
0650 rdmsr
0651 btsl $_EFER_LME, %eax
0652
0653 jc 1f
0654 wrmsr
0655 1: popl %edx
0656 popl %ecx
0657
0658 #ifdef CONFIG_X86_MCE
0659
0660
0661
0662
0663
0664
0665
0666 movl %cr4, %eax
0667 andl $X86_CR4_MCE, %eax
0668 #else
0669 movl $0, %eax
0670 #endif
0671
0672
0673 orl $X86_CR4_PAE, %eax
0674 testl %edx, %edx
0675 jz 1f
0676 orl $X86_CR4_LA57, %eax
0677 1:
0678 movl %eax, %cr4
0679
0680
0681 leal .Lpaging_enabled - trampoline_32bit_src + TRAMPOLINE_32BIT_CODE_OFFSET(%ecx), %eax
0682
0683
0684 pushl $__KERNEL_CS
0685 pushl %eax
0686
0687
0688 movl %cr0, %eax
0689 btsl $X86_CR0_PG_BIT, %eax
0690 movl %eax, %cr0
0691
0692 lret
0693 SYM_CODE_END(trampoline_32bit_src)
0694
0695 .code64
0696 SYM_FUNC_START_LOCAL_NOALIGN(.Lpaging_enabled)
0697
0698 jmp *%rdi
0699 SYM_FUNC_END(.Lpaging_enabled)
0700
0701
0702
0703
0704
0705
0706 .org trampoline_32bit_src + TRAMPOLINE_32BIT_CODE_SIZE
0707
0708 .code32
0709 SYM_FUNC_START_LOCAL_NOALIGN(.Lno_longmode)
0710
0711 1:
0712 hlt
0713 jmp 1b
0714 SYM_FUNC_END(.Lno_longmode)
0715
0716 #include "../../kernel/verify_cpu.S"
0717
0718 .data
0719 SYM_DATA_START_LOCAL(gdt64)
0720 .word gdt_end - gdt - 1
0721 .quad gdt - gdt64
0722 SYM_DATA_END(gdt64)
0723 .balign 8
0724 SYM_DATA_START_LOCAL(gdt)
0725 .word gdt_end - gdt - 1
0726 .long 0
0727 .word 0
0728 .quad 0x00cf9a000000ffff
0729 .quad 0x00af9a000000ffff
0730 .quad 0x00cf92000000ffff
0731 .quad 0x0080890000000000
0732 .quad 0x0000000000000000
0733 SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)
0734
0735 SYM_DATA_START(boot_idt_desc)
0736 .word boot_idt_end - boot_idt - 1
0737 .quad 0
0738 SYM_DATA_END(boot_idt_desc)
0739 .balign 8
0740 SYM_DATA_START(boot_idt)
0741 .rept BOOT_IDT_ENTRIES
0742 .quad 0
0743 .quad 0
0744 .endr
0745 SYM_DATA_END_LABEL(boot_idt, SYM_L_GLOBAL, boot_idt_end)
0746
0747 #ifdef CONFIG_AMD_MEM_ENCRYPT
0748 SYM_DATA_START(boot32_idt_desc)
0749 .word boot32_idt_end - boot32_idt - 1
0750 .long 0
0751 SYM_DATA_END(boot32_idt_desc)
0752 .balign 8
0753 SYM_DATA_START(boot32_idt)
0754 .rept 32
0755 .quad 0
0756 .endr
0757 SYM_DATA_END_LABEL(boot32_idt, SYM_L_GLOBAL, boot32_idt_end)
0758 #endif
0759
0760 #ifdef CONFIG_EFI_STUB
0761 SYM_DATA(image_offset, .long 0)
0762 #endif
0763 #ifdef CONFIG_EFI_MIXED
0764 SYM_DATA_LOCAL(efi32_boot_args, .long 0, 0, 0)
0765 SYM_DATA(efi_is64, .byte 1)
0766
0767 #define ST32_boottime 60 // offsetof(efi_system_table_32_t, boottime)
0768 #define BS32_handle_protocol 88 // offsetof(efi_boot_services_32_t, handle_protocol)
0769 #define LI32_image_base 32 // offsetof(efi_loaded_image_32_t, image_base)
0770
0771 __HEAD
0772 .code32
0773 SYM_FUNC_START(efi32_pe_entry)
0774
0775
0776
0777
0778
0779 pushl %ebp
0780 movl %esp, %ebp
0781 pushl %eax // dummy push to allocate loaded_image
0782
0783 pushl %ebx // save callee-save registers
0784 pushl %edi
0785
0786 call verify_cpu // check for long mode support
0787 testl %eax, %eax
0788 movl $0x80000003, %eax // EFI_UNSUPPORTED
0789 jnz 2f
0790
0791 call 1f
0792 1: pop %ebx
0793 subl $ rva(1b), %ebx
0794
0795
0796 leal -4(%ebp), %eax
0797 pushl %eax // &loaded_image
0798 leal rva(loaded_image_proto)(%ebx), %eax
0799 pushl %eax // pass the GUID address
0800 pushl 8(%ebp) // pass the image handle
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816 movl 12(%ebp), %eax // sys_table
0817 movl ST32_boottime(%eax), %eax // sys_table->boottime
0818 call *BS32_handle_protocol(%eax) // sys_table->boottime->handle_protocol
0819 addl $12, %esp // restore argument space
0820 testl %eax, %eax
0821 jnz 2f
0822
0823 movl 8(%ebp), %ecx // image_handle
0824 movl 12(%ebp), %edx // sys_table
0825 movl -4(%ebp), %esi // loaded_image
0826 movl LI32_image_base(%esi), %esi // loaded_image->image_base
0827 movl %ebx, %ebp // startup_32 for efi32_pe_stub_entry
0828
0829
0830
0831
0832 subl %esi, %ebx
0833 movl %ebx, rva(image_offset)(%ebp) // save image_offset
0834 jmp efi32_pe_stub_entry
0835
0836 2: popl %edi // restore callee-save registers
0837 popl %ebx
0838 leave
0839 RET
0840 SYM_FUNC_END(efi32_pe_entry)
0841
0842 .section ".rodata"
0843
0844 .balign 4
0845 SYM_DATA_START_LOCAL(loaded_image_proto)
0846 .long 0x5b1b31a1
0847 .word 0x9562, 0x11d2
0848 .byte 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b
0849 SYM_DATA_END(loaded_image_proto)
0850 #endif
0851
0852 #ifdef CONFIG_AMD_MEM_ENCRYPT
0853 __HEAD
0854 .code32
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865 SYM_FUNC_START(startup32_set_idt_entry)
0866 push %ebx
0867 push %ecx
0868
0869
0870 leal rva(boot32_idt)(%ebp), %ebx
0871 shl $3, %edx
0872 addl %edx, %ebx
0873
0874
0875 movl %eax, %edx
0876 andl $0x0000ffff, %edx # Target code segment offset [15:0]
0877 movl $__KERNEL32_CS, %ecx # Target code segment selector
0878 shl $16, %ecx
0879 orl %ecx, %edx
0880
0881
0882 movl %edx, (%ebx)
0883
0884
0885 movl %eax, %edx
0886 andl $0xffff0000, %edx # Target code segment offset [31:16]
0887 orl $0x00008e00, %edx # Present, Type 32-bit Interrupt Gate
0888
0889
0890 movl %edx, 4(%ebx)
0891
0892 pop %ecx
0893 pop %ebx
0894 RET
0895 SYM_FUNC_END(startup32_set_idt_entry)
0896 #endif
0897
0898 SYM_FUNC_START(startup32_load_idt)
0899 #ifdef CONFIG_AMD_MEM_ENCRYPT
0900
0901 leal rva(startup32_vc_handler)(%ebp), %eax
0902 movl $X86_TRAP_VC, %edx
0903 call startup32_set_idt_entry
0904
0905
0906 leal rva(boot32_idt)(%ebp), %eax
0907 movl %eax, rva(boot32_idt_desc+2)(%ebp)
0908 lidt rva(boot32_idt_desc)(%ebp)
0909 #endif
0910 RET
0911 SYM_FUNC_END(startup32_load_idt)
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930 SYM_FUNC_START(startup32_check_sev_cbit)
0931 #ifdef CONFIG_AMD_MEM_ENCRYPT
0932 pushl %eax
0933 pushl %ebx
0934 pushl %ecx
0935 pushl %edx
0936
0937
0938 movl rva(sev_status)(%ebp), %eax
0939 testl %eax, %eax
0940 jz 4f
0941
0942
0943
0944
0945
0946
0947 1: rdrand %eax
0948 jnc 1b
0949 2: rdrand %ebx
0950 jnc 2b
0951
0952
0953 movl %eax, rva(sev_check_data)(%ebp)
0954 movl %ebx, rva(sev_check_data+4)(%ebp)
0955
0956
0957 movl %cr0, %edx
0958 movl $(X86_CR0_PG | X86_CR0_PE), %ecx
0959 movl %ecx, %cr0
0960
0961 cmpl %eax, rva(sev_check_data)(%ebp)
0962 jne 3f
0963 cmpl %ebx, rva(sev_check_data+4)(%ebp)
0964 jne 3f
0965
0966 movl %edx, %cr0
0967
0968 jmp 4f
0969
0970 3:
0971 hlt
0972 jmp 3b
0973
0974 4:
0975 popl %edx
0976 popl %ecx
0977 popl %ebx
0978 popl %eax
0979 #endif
0980 RET
0981 SYM_FUNC_END(startup32_check_sev_cbit)
0982
0983
0984
0985
0986 .bss
0987 .balign 4
0988 SYM_DATA_LOCAL(boot_heap, .fill BOOT_HEAP_SIZE, 1, 0)
0989
0990 SYM_DATA_START_LOCAL(boot_stack)
0991 .fill BOOT_STACK_SIZE, 1, 0
0992 .balign 16
0993 SYM_DATA_END_LABEL(boot_stack, SYM_L_LOCAL, boot_stack_end)
0994
0995
0996
0997
0998 .section ".pgtable","aw",@nobits
0999 .balign 4096
1000 SYM_DATA_LOCAL(pgtable, .fill BOOT_PGT_SIZE, 1, 0)
1001
1002
1003
1004
1005
1006 SYM_DATA_LOCAL(top_pgtable, .fill PAGE_SIZE, 1, 0)