fixes for pin-cir support
authorNIIBE Yutaka <gniibe@fsij.org>
Sat, 2 Nov 2013 05:33:34 +0000 (14:33 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Sat, 2 Nov 2013 05:34:19 +0000 (14:34 +0900)
ChangeLog
chopstx
src/configure
src/gnuk.h
src/gnuk.ld.in
src/main.c
src/openpgp.c
src/pin-dnd.c
src/usb-icc.c

index b38078c..58a8927 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2013-11-02  Niibe Yutaka  <gniibe@fsij.org>
 
+       * chopstx: Update.
+       * src/configure (TIM_SIZE, EXT_SIZE): New.
+       * src/gnuk.ld.in (__process6_stack_size__)
+       (__process7_stack_size__): New.
+       * src/main.c (main): Call cir_init.
+       * src/openpgp.c (openpgp_card_thread): Rename from GPGthread.
+       * src/usb-icc.c (icc_power_on): Follow the change.
+
+2013-11-01  Niibe Yutaka  <gniibe@fsij.org>
+
        * src/sys.c: Update from Chopstx.
        * src/usb_lld.h: Remove interrupt definition.
        * src/stm32f103.h: Add AFIO, EXTI, and TIMER constants.
diff --git a/chopstx b/chopstx
index 5f14824..9fe6cef 160000 (submodule)
--- a/chopstx
+++ b/chopstx
@@ -1 +1 @@
-Subproject commit 5f14824977c1b7f281aa0b31cc8dbf93a649b504
+Subproject commit 9fe6cefdc0564b6bb3d938c0c1074d57a4b9500f
index 802932b..a6963f8 100755 (executable)
@@ -167,6 +167,8 @@ fi
 
 # --enable-pinpad option
 MSC_SIZE="0"
+TIM_SIZE="0"
+EXT_SIZE="0"
 if test "$pinpad" = "no"; then
   PINPAD_MAKE_OPTION="# ENABLE_PINPAD="
   PINPAD_DEFINE="#undef PINPAD_SUPPORT"
@@ -179,6 +181,9 @@ else
   echo "PIN pad option enabled ($pinpad)"
   if test "$pinpad" = "dnd"; then
      MSC_SIZE="0x0200"
+  elif test "$pinpad" = "cir"; then
+     TIM_SIZE="0x00c0"
+     EXT_SIZE="0x00c0"
   fi
 fi
 
@@ -291,6 +296,8 @@ else
       -e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
       -e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
       -e "s/@MSC_SIZE@/$MSC_SIZE/" \
+      -e "s/@TIM_SIZE@/$TIM_SIZE/" \
+      -e "s/@EXT_SIZE@/$EXT_SIZE/" \
        < gnuk.ld.in > gnuk.ld
 fi
 sed -e "s/@DEBUG_DEFINE@/$DEBUG_DEFINE/" \
index e78bea9..9ce63d8 100644 (file)
@@ -18,14 +18,14 @@ struct apdu {
 
 extern struct apdu apdu;
 
-#define EV_EXEC_FINISHED ((eventmask_t)2)       /* GPG Execution finished */
+#define EV_EXEC_FINISHED        (2) /* OpenPGPcard Execution finished */
 
-/* GPG thread */
-#define EV_PINPAD_INPUT_DONE    ((eventmask_t)1)
-#define EV_EXIT                 ((eventmask_t)2)
-#define EV_CMD_AVAILABLE        ((eventmask_t)4)
-#define EV_VERIFY_CMD_AVAILABLE ((eventmask_t)8)
-#define EV_MODIFY_CMD_AVAILABLE ((eventmask_t)16)
+/* OpenPGPcard thread */
+#define EV_PINPAD_INPUT_DONE    (1)
+#define EV_EXIT                 (2)
+#define EV_CMD_AVAILABLE        (4)
+#define EV_VERIFY_CMD_AVAILABLE (8)
+#define EV_MODIFY_CMD_AVAILABLE (16)
 
 /* Maximum cmd apdu data is key import 22+4+128+128 (proc_key_import) */
 #define MAX_CMD_APDU_DATA_SIZE (22+4+128+128) /* without header */
@@ -353,18 +353,17 @@ extern void flash_do_write_internal (const uint8_t *p, int nr, const uint8_t *da
 
 extern const uint8_t gnukStringSerial[];
 
-#define LED_ONESHOT            ((eventmask_t)1)
-#define LED_TWOSHOTS           ((eventmask_t)2)
-#define LED_SHOW_STATUS                ((eventmask_t)4)
-#define LED_START_COMMAND      ((eventmask_t)8)
-#define LED_FINISH_COMMAND     ((eventmask_t)16)
-#define LED_FATAL              ((eventmask_t)32)
+#define LED_ONESHOT            (1)
+#define LED_TWOSHOTS           (2)
+#define LED_SHOW_STATUS                (4)
+#define LED_START_COMMAND      (8)
+#define LED_FINISH_COMMAND     (16)
+#define LED_FATAL              (32)
 extern void led_blink (int spec);
 
 #if defined(PINPAD_SUPPORT)
 # if defined(PINPAD_CIR_SUPPORT)
-extern void cir_ext_disable (void);
-extern void cir_ext_enable (void);
+extern void cir_init (void);
 # elif defined(PINPAD_DIAL_SUPPORT)
 extern void dial_sw_disable (void);
 extern void dial_sw_enable (void);
index c8376b1..5d4f90b 100644 (file)
@@ -7,7 +7,9 @@ __process1_stack_size__  = 0x0140;      /* ccid */
 __process2_stack_size__  = 0x0180;      /* rng */
 __process3_stack_size__  = 0x0b00;      /* gpg */
 __process4_stack_size__  = 0x0100;      /* intr: usb */
-__process5_stack_size__  = @MSC_SIZE@;    /* msc */
+__process5_stack_size__  = @MSC_SIZE@;  /* msc */
+__process6_stack_size__  = @TIM_SIZE@;  /* intr: timer */
+__process7_stack_size__  = @EXT_SIZE@;  /* intr: ext */
 
 MEMORY
 {
@@ -112,6 +114,14 @@ SECTIONS
         . += __process5_stack_size__;
         . = ALIGN(8);
         __process5_stack_end__ = .;
+        __process6_stack_base__ = .;
+        . += __process6_stack_size__;
+        . = ALIGN(8);
+        __process6_stack_end__ = .;
+        __process7_stack_base__ = .;
+        . += __process7_stack_size__;
+        . = ALIGN(8);
+        __process7_stack_end__ = .;
         . = ALIGN(8);
     } > ram
 
index 5e964ad..fc9850b 100644 (file)
@@ -330,6 +330,9 @@ main (int argc, char *argv[])
   ccid_thd = chopstx_create (PRIO_CCID, __stackaddr_ccid,
                             __stacksize_ccid, USBthread, NULL);
 
+#ifdef PINPAD_CIR_SUPPORT
+  cir_init ();
+#endif
 #ifdef PINPAD_DND_SUPPORT
   msc_init ();
 #endif
index a6d9e67..be3f6d6 100644 (file)
@@ -1215,10 +1215,24 @@ process_command_apdu (void)
     }
 }
 
-void *
-GPGthread (void *arg)
+static void * card_thread (chopstx_t thd, struct eventflag *ccid_comm);
+
+void * __attribute__ ((naked))
+openpgp_card_thread (void *arg)
 {
-  struct eventflag *ccid_comm = (struct eventflag *)arg;
+  chopstx_t thd;
+
+  asm ("mov    %0, sp" : "=r" (thd));
+  return card_thread (thd, (struct eventflag *)arg);
+}
+
+chopstx_t openpgp_card_thd;
+
+static void *
+card_thread (chopstx_t thd, struct eventflag *ccid_comm)
+{
+  openpgp_card_thd = thd;
+
   openpgp_comm = ccid_comm + 1;
 
   gpg_init ();
index 2228925..50ae59e 100644 (file)
@@ -24,7 +24,6 @@
 #include <stdint.h>
 #include <string.h>
 #include <chopstx.h>
-#include <eventflag.h>
 
 #include "config.h"
 #include "board.h"
index ba2bc54..083dede 100644 (file)
@@ -742,7 +742,7 @@ static void icc_error (struct ccid *c, int offset)
   usb_lld_write (c->epi->ep_num, icc_reply, ICC_MSG_HEADER_SIZE);
 }
 
-extern void *GPGthread (void *arg);
+extern void *openpgp_card_thread (void *arg);
 
 extern uint8_t __process3_stack_base__, __process3_stack_size__;
 const uint32_t __stackaddr_gpg = (uint32_t)&__process3_stack_base__;
@@ -759,8 +759,8 @@ icc_power_on (struct ccid *c)
 
   if (c->application == 0)
     c->application = chopstx_create (PRIO_GPG, __stackaddr_gpg,
-                                    __stacksize_gpg,
-                                    GPGthread, (void *)&c->ccid_comm);
+                                    __stacksize_gpg, openpgp_card_thread,
+                                    (void *)&c->ccid_comm);
 
   p[0] = ICC_DATA_BLOCK_RET;
   p[1] = size_atr;